前言:作为计算机相关专业的你,绝对听说过物联网这个词,它的解释相比你也听过,叫万物互联,也就是所谓的IOT,但是说实话它到底如何实现的万物互联的你可能还真不知道。不是每个物体都有一个网络接口或者实体接口,等着你把网络连进来,今天你看完这篇文章哪怕你不会实际操作但是起码总体的原理流程你就知道了。
一.EPC与物联网
1.EPC的产生与发展
EPC的产生和发展1999年美国麻省理工学院成立Auto-ID中心,进行RFID技术研发,通过创建RFID标准,并利用网络技术,形成EPC系统。
EPC统一对全球物品的编码方法,直到编码至单个物品 (猪肉德和罐头 10万箱 每箱产品的条码是相同的,但是每箱产品的RFID标签是不一样的)。
EPC规定了将此编码以数字信息的形式存储于附着在物品上的应答器(在EPC中常称为标签)中。
阅读器通过无线空中接口读取标签中的EPC码,并经计算机网络传送至信息控制中心,进行相应的数据处理 。
看完是不是一头雾水,别急,这里给你总结一下:
- 1.EPC是电子产品编码技术的缩写。这是一种基于RFID技术的新技术。(是什么?)
- 2.EPC统一了对全球物品的编码方法,可以编码至单个物体。(做什么?)
实际过程:
EPC规定了将此编码以数字信息的形式存储于附着在物品上的应答器(在EPC中常称为标签)中,阅读器通过无线空中接口读取标签中的EPC码,并经过计算机网络传送至信息控制中学,进行相应的数据处理、存储、显示和相互。
这么解释你是不是感觉好多了?
2.EPC系统的组成
EPC系统是在计算机互联网(Internet)的基础上,利用RFID、EPC编码、数据通信等技术,构造的一个覆盖全球万事万物的实物互联网(Internet of Things)IOT,亦称物联网。
在RFID和Internet的基础上,实物互联网可以将数量更为庞大的物品建立起信息联接,为商业、物流、仓储、生产、家庭等行业和用户提供了信息化的先进管理理念和手段。
EPC系统的组成: 通过EPC就能找到该EPC号的web地址
应答器装载有EPC编码,它应附着在物品上,亦称为标签(后面称为EPC标签或标签)。
阅读器用于读或读写EPC标签,并能连接于本地网络之中。
Savant是连接阅读器和应用程序的软件,亦称为中间件,它是物联网中的核心技术,可认为是该网络的神经系统,故称为Savant。
对象名称解析服务(ONS)的作用类似于Internet中的域名解析服务(DNS),它给Savant指明了存储产品有关信息的服务器(EPCIS)。
知道DNS服务吗,它相当于因特网中的DNS服务: ONS:EPC--->IP DNS: 域名--->IP
系统中EPC信息描述采用实体标记语言(PML),PML是在可扩展标记语言(XML)基础上发展而成,用于描述有关物品信息的一种计算机语言。
3.PML和XML
PML你不知道,但你或多或少应该知道一些XML吧,不知道可以翻看我学习XML 的笔记
PML (Probabilistic Modeling Language) 是一种用于描述概率模型的语言,它通常被用于机器学习和人工智能领域中。PML可以用于描述各种类型的概率模型,包括贝叶斯网络、隐马尔可夫模型、高斯混合模型等。
XML (Extensible Markup Language) 是一种用于描述数据的标记语言,它是一种可扩展的语言,可以用来创建自定义的标记。XML通常被用于存储和传输数据,例如在Web服务中使用XML格式的数据进行交换。
虽然PML和XML都被用于描述数据,但它们的目的和使用场景有所不同。PML主要用于表示概率模型,并帮助我们进行推理和预测。而XML主要用于存储和传输数据,并提供了一种结构化的方式来组织数据。
这边建议可以不管,反正和今天的主要内容关系不大,你学到后面这些就都知道了。
4.ESP系统的特点
EPC系统的主要特点如下 :
- 采用了EPC编码方法,可以识别物品到个件
- 信息系统的网络基础是Internet网络,将企业的Intranet,RFID和Internet有机的结合起来
- 着眼于全球的系统
- 目前仍需要较多的投入,对于低价值的识别对象,必须考虑由此引进的成本
二.EPC编码
1.GTIN
GTIN是全球商品条码标准,代表全球贸易项目代码(Global Trade Item Number)。它是一种数字编码,用于唯一识别商品和服务。GTIN由数字组成,长度可以是8、12、13或14个数字。其中最常见的是13位的GTIN,也被称为EAN(欧洲文章编号)或UPC(统一产品代码)。
GTIN码通常被印刷在商品包装上,可以通过扫描条形码或QR码进行读取。这使得全球范围内的供应链管理和物流变得更加高效和精确。同时,GTIN码还可以帮助消费者快速识别并比较不同品牌和型号的商品。
除了GTIN码之外,还有其他一些全球贸易项目代码,如GLN(全球定位码)、SSCC(序列运输集装箱代码)等,它们也都是为促进全球贸易和物流而设计的标准化编码系统。
要知道两点:
- GTIN是唯一的、无含义的、多行业的、全球认可的代码。
- GTIN有4种编码结构:EAN · UCC-13(EAN 13)、EAN · UCC-8(EAN 8)、UCC-12和EAN · UCC-14
2.平时生活的使用
- EAN · UCC-13(标准版原印码)由厂商识别代码、商品项目代码和检验码3部分组成
- EAN • UCC-8由8位组成,左三位是EAN分配的前缀码,接着4位是分配给厂商的特定商品代码,最后一位是检验位
3.EPC编码的类型和方法
目前,EPC编码有64位、96位和256位三种。 EPC编码由版本号、域名管理、对象分类和序列号四个字段组成:
- 版本号字段标识EPC的版本号,它给出EPC编码的长度;
- 域名管理字段标识相关的生产厂商信息;
- 对象分类字段编码物品精确类型;
- 序列号用于编码出唯一物品。
4.EPC编码的性能
EPC编码的性能:
唯一性:足够的编码容量和组织保证可以保证对某一个物品实现唯一编码
简单性:编码简单且能实现物品的唯一标识,不包含物品的其他相关信息
可扩展性:为未来的发展提供了充足的备用空间
- 安全性:EPC编码和加密、认证技术相结合
三.EPC标签与阅读器
1.标签分类
EPC标签是一种被广泛应用于物联网领域的RFID标签。根据不同的分类方式,EPC标签可以分为以下几种类型:
- 按工作频率分类:EPC标签通常在低频(LF)、高频(HF)和超高频(UHF)三个频段工作。其中,低频标签通常在125KHz左右;高频标签通常在13.56MHz左右;超高频标签通常在840MHz到960MHz之间。
- 按存储容量分类:EPC标签的存储容量通常从几十比特到数千比特不等,因此可以按照其存储容量来分类。目前,最常见的EPC标签存储容量为96位或128位。
- 按封装形式分类:EPC标签可以采用多种封装形式,如贴纸式、硅片式、卡式、手环式等。
- 按功能分类:EPC标签还可以按照其功能进行分类。例如,有一些标签具有温度、湿度、压力、震动等传感器功能,可以用于监测物品的环境条件。还有一些标签具有加密、防伪等安全功能,可以用于确保产品的真实性和安全性。
2.Class与Gen(代)
Class描述的是标签的基本功能,譬如说它里面存储器情况或有无电池。
Gen是指标签规范的主要版本号。通常所说的第二代EPC,实际上是第二代EPC Class 1,这表明它是规范的第二个主要版本,针对拥有一次写入内存的标签。
EPC Class的目的是为了提供一种模块化结构,涵盖一系列众多的可能类型的标签功能。
3.EPC阅读器
应该具有下述功能和特征:
- 空中接口功能
- 阅读器防碰撞
- 与计算机网络的连接
- 空中接口电路包括收发两个通道,包含编码、调制、解调、解码等功能,射频功率由天线辐射,并接收从标签返回的信息,空中接口电路是阅读器和标签之间交换信息的纽带。
- 控制器可以采用微控制器(MCU)或数字信号处理器(DSP)。
- 网络接口应具有支持以太网、无线局域网(IEEE 802.11)等网络联接方式,这也是EPC阅读器的重要特点。
4.中间件
核心功能是屏蔽不同厂家的RFID阅读器等硬件设备、应用软件系统以及数据传输格式之间的异构性,从而可以实现不同的硬件(阅读器等)与不同应用软件系统间的无缝连接与实时动态集成。
- 程序模块集成器:由多个程序模块组成。
- 阅读器接口:阅读器接口提供与阅读器的连接方法,并采用相应的通信协议。
- 应用程序接口:程序模块和应用程序的接口。
- 程序模块之间的接口:用自己定义的API(应用程序接口)函数实现。
- 网络访问接口
四.ONS(对象名称解析服务)
1.对象名称解析服务
ONS: EPC<-->EPCIS(IP) DNS:域名<-->WEB(IP)
1.2.24.400 <----> 24.21.1.ONSROOT.ORG
在EPC系统中,需要将EPC编码与相应的商品信息相匹配,而相应的商品信息存储在对应的EPCIS服务器中,ONS服务提供与EPC编码对应的EPCIS服务器的地址,它的作用类似于因特网的域名解析服务。
阅读器将读到的EPC编码通过本地局域网上传至本地服务器,由本地服务器所带Savant软件对这些信息进行集中处理,然后由本地服务器通过查找本地ONS服务或通过路由器到达远程ONS服务器查找所需EPC编码对应的EPCIS服务器地址,本地服务器就可以和找到的EPCIS服务器进行通信了。
2.具体实现过程
通过EPC号找到该EPC号商品信息存放的web地址(EPC号转换成一个物联网上可以寻址的网址)
五.编码预备知识
1.join()函数
join()
是 Python 字符串对象的内置方法,用于将一个可迭代对象(例如列表、元组等)中的元素连接成一个字符串。其语法如下:
str.join(iterable)
其中,str
是指定要使用的分隔符,即要把可迭代对象中的元素连接起来的字符串;iterable
则是指定要连接的可迭代对象。
具体来说,join()
方法会在 iterable
中的每个元素之间插入 str
分隔符,并返回连接起来的新字符串。需要注意的是,这里的元素必须都是字符串类型,否则程序会因为数据类型不匹配而出错。
举个例子,如果我们有一个列表 my_list
,它包含若干个字符串类型的元素,那么可以像下面这样使用 join()
方法将它们连接成一个新的字符串:
my_list = ['hello', 'world', 'how', 'are', 'you']
new_string = '-'.join(my_list)
print(new_string) # 输出:"hello-world-how-are-you"
在上面的例子中,join()
方法使用了 -
作为分隔符,把列表中的所有字符串连成了一个新字符串。
2.split()函数
split() 函数是 Python 内置的字符串方法,用于将字符串按照指定的分隔符分割成一个列表。
它的语法如下:
str.split(sep=None, maxsplit=-1)
其中,sep
参数是可选的分隔符,默认为 None,表示使用空白字符(空格、制表符、换行符等)作为分隔符。如果指定了分隔符,则会按照该分隔符来对字符串进行分割。
maxsplit
参数也是可选的,表示最多分割几次。默认为 -1,表示不限制分割次数。
例如:
s = "Hello,world!"
print(s.split()) # ['Hello,world!']
print(s.split(',')) # ['Hello', 'world!']
print(s.split('o')) # ['Hell', ',w', 'rld!']
print(s.split('l', 1))# ['He', 'lo,world!']
以上代码中,第一个 split()
没有指定分隔符,因此返回包含整个字符串的列表;第二个 split()
使用逗号作为分隔符,返回两个元素的列表;第三个 split()
使用字母 o 作为分隔符,返回四个元素的列表;第四个 split()
使用字母 l 作为分隔符,并且最多只分割一次,返回两个元素的列表。
3.反转列表
reversed_numbers = int_number[:-1][::-1]
反转列表在LeetCode题目中经常用到,[::-1]
表示反转列表的用法,不要问为什么,当作一个函数使用就行,这个“函数”的返回值是一个反转后的新列表,前面的[:-1]
不解释了,表示切片,不要最后一个元素。
六.完整编码及结果
1.python编码
# 判断epc类型并转化为点十进制格式返回
def judgment(epc0b, code_type):
length = len(epc0b)
#version_type表示版本号
version_type1 = int(epc0b[:2], 2)
version_type2 = int(epc0b[:8], 2)
if length == 64 and version_type1 == 1:
return transform(epc0b, code_type[0])
if length == 64 and version_type1 == 2:
return transform(epc0b, code_type[1])
if length == 64 and version_type1 == 3:
return transform(epc0b, code_type[2])
if length == 96:
return transform(epc0b, code_type[3])
if length == 256 and version_type2 == 1:
return transform(epc0b, code_type[4])
if length == 256 and version_type2 == 2:
return transform(epc0b, code_type[5])
if length == 256 and version_type2 == 3:
return transform(epc0b, code_type[6])
# 根据epc类型返回十进制格式
def transform(epc0b, code_type):
results = []
flag = 0
# 按位置和位数将二进制转多个十进制,并用.隔开
for i in code_type:
temp = int(epc0b[flag:flag + i], 2) #指定这是2进制形式表示的字符串
flag += i
results.append(temp)
return ".".join(str(i) for i in results) #str(i)表示把每个整数元素变为字符串型
# 根据十进制格式返回最后的URL
def address(class_ip, suffix_name):
str_numbers = class_ip.split('.')
int_number = [int(num) for num in str_numbers]
print(f"序列号:{int_number[-1]}")
# 去除序列号,并将整个列表反转
reversed_numbers = int_number[:-1][::-1]
# 合并后缀为最终URL地址
string = ".".join(str(temp) for temp in reversed_numbers) + suffix_name
return string
# --------------------------------------------数据准备------------------------------------------
code = (
(2, 21, 17, 24), (2, 15, 13, 34), (2, 26, 13, 23), (8, 28, 24, 36), (8, 32, 56, 160), (8, 64, 56, 128),
(8, 128, 56, 64))
test = '0100000000000000000001000000000000011000000000000000000110010000'
suffix = ".onsroot.org"
# ----------------------------------------------测试----------------------------------------------
result = judgment(test, code)
url = address(result, suffix)
print(result)
print("ONS解析得到URL:",url)