前言:作为计算机相关专业的你,绝对听说过物联网这个词,它的解释相比你也听过,叫万物互联,也就是所谓的IOT,但是说实话它到底如何实现的万物互联的你可能还真不知道。不是每个物体都有一个网络接口或者实体接口,等着你把网络连进来,今天你看完这篇文章哪怕你不会实际操作但是起码总体的原理流程你就知道了。
EPC的产生和发展1999年美国麻省理工学院成立Auto-ID中心,进行RFID技术研发,通过创建RFID标准,并利用网络技术,形成EPC系统。
EPC统一对全球物品的编码方法,直到编码至单个物品 (猪肉德和罐头 10万箱 每箱产品的条码是相同的,但是每箱产品的RFID标签是不一样的)。
EPC规定了将此编码以数字信息的形式存储于附着在物品上的应答器(在EPC中常称为标签)中。
阅读器通过无线空中接口读取标签中的EPC码,并经计算机网络传送至信息控制中心,进行相应的数据处理 。
看完是不是一头雾水,别急,这里给你总结一下:
- 1.EPC是电子产品编码技术的缩写。这是一种基于RFID技术的新技术。(是什么?)
- 2.EPC统一了对全球物品的编码方法,可以编码至单个物体。(做什么?)
实际过程:
EPC规定了将此编码以数字信息的形式存储于附着在物品上的应答器(在EPC中常称为标签)中,阅读器通过无线空中接口读取标签中的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)基础上发展而成,用于描述有关物品信息的一种计算机语言。
PML你不知道,但你或多或少应该知道一些XML吧,不知道可以翻看我学习XML 的笔记
XML基础学习笔记
PML (Probabilistic Modeling Language) 是一种用于描述概率模型的语言,它通常被用于机器学习和人工智能领域中。PML可以用于描述各种类型的概率模型,包括贝叶斯网络、隐马尔可夫模型、高斯混合模型等。
XML (Extensible Markup Language) 是一种用于描述数据的标记语言,它是一种可扩展的语言,可以用来创建自定义的标记。XML通常被用于存储和传输数据,例如在Web服务中使用XML格式的数据进行交换。
虽然PML和XML都被用于描述数据,但它们的目的和使用场景有所不同。PML主要用于表示概率模型,并帮助我们进行推理和预测。而XML主要用于存储和传输数据,并提供了一种结构化的方式来组织数据。
这边建议可以不管,反正和今天的主要内容关系不大,你学到后面这些就都知道了。
EPC系统的主要特点如下 :
GTIN是全球商品条码标准,代表全球贸易项目代码(Global Trade Item Number)。它是一种数字编码,用于唯一识别商品和服务。GTIN由数字组成,长度可以是8、12、13或14个数字。其中最常见的是13位的GTIN,也被称为EAN(欧洲文章编号)或UPC(统一产品代码)。
GTIN码通常被印刷在商品包装上,可以通过扫描条形码或QR码进行读取。这使得全球范围内的供应链管理和物流变得更加高效和精确。同时,GTIN码还可以帮助消费者快速识别并比较不同品牌和型号的商品。
除了GTIN码之外,还有其他一些全球贸易项目代码,如GLN(全球定位码)、SSCC(序列运输集装箱代码)等,它们也都是为促进全球贸易和物流而设计的标准化编码系统。
要知道两点:
目前,EPC编码有64位、96位和256位三种。 EPC编码由版本号、域名管理、对象分类和序列号四个字段组成:
EPC编码的性能:
唯一性:足够的编码容量和组织保证可以保证对某一个物品实现唯一编码
简单性:编码简单且能实现物品的唯一标识,不包含物品的其他相关信息
可扩展性:为未来的发展提供了充足的备用空间
安全性:EPC编码和加密、认证技术相结合
EPC标签是一种被广泛应用于物联网领域的RFID标签。根据不同的分类方式,EPC标签可以分为以下几种类型:
Class描述的是标签的基本功能,譬如说它里面存储器情况或有无电池。
Gen是指标签规范的主要版本号。通常所说的第二代EPC,实际上是第二代EPC Class 1,这表明它是规范的第二个主要版本,针对拥有一次写入内存的标签。
EPC Class的目的是为了提供一种模块化结构,涵盖一系列众多的可能类型的标签功能。
应该具有下述功能和特征:
核心功能是屏蔽不同厂家的RFID阅读器等硬件设备、应用软件系统以及数据传输格式之间的异构性,从而可以实现不同的硬件(阅读器等)与不同应用软件系统间的无缝连接与实时动态集成。
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服务器进行通信了。
通过EPC号找到该EPC号商品信息存放的web地址(EPC号转换成一个物联网上可以寻址的网址)
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()
方法使用了 -
作为分隔符,把列表中的所有字符串连成了一个新字符串。
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 作为分隔符,并且最多只分割一次,返回两个元素的列表。
reversed_numbers = int_number[:-1][::-1]
反转列表在LeetCode题目中经常用到,[::-1]
表示反转列表的用法,不要问为什么,当作一个函数使用就行,这个“函数”的返回值是一个反转后的新列表,前面的[:-1]
不解释了,表示切片,不要最后一个元素。
# 判断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)