学了三年,一文告诉你物联网到底如何实现万物互联?

news2024/11/20 20:33:17

前言:作为计算机相关专业的你,绝对听说过物联网这个词,它的解释相比你也听过,叫万物互联,也就是所谓的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的基础上,实物互联网可以将数量更为庞大的物品建立起信息联接,为商业、物流、仓储、生产、家庭等行业和用户提供了信息化的先进管理理念和手段。

9Z8x.jpg

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 的笔记

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部分组成

9CGH.jpg

  • EAN • UCC-8由8位组成,左三位是EAN分配的前缀码,接着4位是分配给厂商的特定商品代码,最后一位是检验位

9UuG.jpg

3.EPC编码的类型和方法

目前,EPC编码有64位、96位和256位三种。 EPC编码由版本号、域名管理、对象分类和序列号四个字段组成:

  • 版本号字段标识EPC的版本号,它给出EPC编码的长度;
  • 域名管理字段标识相关的生产厂商信息;
  • 对象分类字段编码物品精确类型;
  • 序列号用于编码出唯一物品。

9iPz.jpg

4.EPC编码的性能

EPC编码的性能:

  • 唯一性:足够的编码容量和组织保证可以保证对某一个物品实现唯一编码

  • 简单性:编码简单且能实现物品的唯一标识,不包含物品的其他相关信息

  • 可扩展性:为未来的发展提供了充足的备用空间

  • 安全性:EPC编码和加密、认证技术相结合

三.EPC标签与阅读器

1.标签分类

EPC标签是一种被广泛应用于物联网领域的RFID标签。根据不同的分类方式,EPC标签可以分为以下几种类型:

  1. 按工作频率分类:EPC标签通常在低频(LF)、高频(HF)和超高频(UHF)三个频段工作。其中,低频标签通常在125KHz左右;高频标签通常在13.56MHz左右;超高频标签通常在840MHz到960MHz之间。
  2. 按存储容量分类:EPC标签的存储容量通常从几十比特到数千比特不等,因此可以按照其存储容量来分类。目前,最常见的EPC标签存储容量为96位或128位。
  3. 按封装形式分类:EPC标签可以采用多种封装形式,如贴纸式、硅片式、卡式、手环式等。
  4. 按功能分类:EPC标签还可以按照其功能进行分类。例如,有一些标签具有温度、湿度、压力、震动等传感器功能,可以用于监测物品的环境条件。还有一些标签具有加密、防伪等安全功能,可以用于确保产品的真实性和安全性。

2.Class与Gen(代)

  • Class描述的是标签的基本功能,譬如说它里面存储器情况或有无电池。

  • Gen是指标签规范的主要版本号。通常所说的第二代EPC,实际上是第二代EPC Class 1,这表明它是规范的第二个主要版本,针对拥有一次写入内存的标签。

  • EPC Class的目的是为了提供一种模块化结构,涵盖一系列众多的可能类型的标签功能。

3.EPC阅读器

应该具有下述功能和特征:

  • 空中接口功能
  • 阅读器防碰撞
  • 与计算机网络的连接

9TpT.jpg

  • 空中接口电路包括收发两个通道,包含编码、调制、解调、解码等功能,射频功率由天线辐射,并接收从标签返回的信息,空中接口电路是阅读器和标签之间交换信息的纽带。
  • 控制器可以采用微控制器(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服务器的地址,它的作用类似于因特网的域名解析服务。

9u74.jpg

阅读器将读到的EPC编码通过本地局域网上传至本地服务器,由本地服务器所带Savant软件对这些信息进行集中处理,然后由本地服务器通过查找本地ONS服务或通过路由器到达远程ONS服务器查找所需EPC编码对应的EPCIS服务器地址,本地服务器就可以和找到的EPCIS服务器进行通信了。

2.具体实现过程

96tv.jpg

通过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)


2.运行结果

9XKq.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程同步(二)

目录 死锁 加锁之后忘记解锁&#xff1a; 重复加锁&#xff0c;造成死锁 在程序中有多个共享资源&#xff0c;因此有很多把锁&#xff0c;随意加锁&#xff0c;导致相互被阻塞 在使用多线程编程的时候&#xff0c;如何避免死锁呢&#xff1f; 读写锁 在程序中对读写锁加…

Rust每日一练(Leetday0029) 柱状图、最大矩形、扰乱字符串

目录 84. 柱状图中最大的矩形 Largest-rectangle-in-histogram &#x1f31f;&#x1f31f;&#x1f31f; 85. 最大矩形 Maximal Rectangle &#x1f31f;&#x1f31f;&#x1f31f; 87. 扰乱字符串 Scramble String &#x1f31f;&#x1f31f;&#x1f31f; &#x1…

WebTransport 开播的应用实践之路

动手点关注 干货不迷路 Web开播的业务挑战 无论是本地软件推流还是Web推流&#xff0c;都需要解决推流抖动、画面高糊、音频卡顿等问题。在现有的Web技术环境下&#xff0c;如何稳定地把高质量的音视频流呈现给更多用户&#xff0c;是我们技术团队攻克的重点。从技术角度来解读…

lua编程——air724二次开发之串口通信教程

有了上一章文章《lua编程——air724二次开发之点亮led教程》的基础&#xff0c;接下来将介绍如何使用lua语言进行串口通信。 一、硬件连接 根据银尔达硬件资料的介绍&#xff0c;如下图&#xff1a; 直接将usb转ttl工具和4G模块进行连接&#xff0c;接收和发送线需要交叉连接。…

【IMX6ULL驱动开发学习】07.cdev注册驱动设备_设置次设备号范围

一、register_chrdev 在之前的hello驱动中&#xff0c;注册驱动设备的方式如下 /*初始化设备方法1&#xff1a;自动分配设备号&#xff0c;占用所有次设备号*/ major register_chrdev(0,"hello_drv",&hello_fops);使用 register_chrdev 分配设备号的方式比较…

从玩具到工具|社畜程序员用AI提效的神仙操作

&#x1f449;腾小云导读 随着 AI 技术的日益发展&#xff0c;前端开发模式和提效工具也在不断地变化。作为一名前端工程师&#xff0c;如何应对 AI 带来的挑战和机遇&#xff1f;在这篇文章中&#xff0c;作者将介绍什么是 AIGC&#xff0c;并深入探讨 AI 在低代码平台的应用。…

【数据结构】顺序表及其实现

目录 1.线性表 2.顺序表 2.1顺序表的概念及结构 2.2顺序表的实现 1.线性表 线性表&#xff1a;是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表&#xff0c;链表&#xff0c;栈&#xff0c;队…

Parallels Desktop 18 18.3.1激活攻略

如果说虚拟机领域有一位王者&#xff0c;非Parallels不能领袖群伦&#xff0c;毕竟大厂背书&#xff0c;功能满格&#xff0c;美中不足之处就是价格略高&#xff0c;但这也并非是Parallels的错&#xff0c;因为市场上没有任何一款虚拟机产品在产品力层面能和Parallels抗衡&…

使用Typora+PicGo+阿里云搭建图床

1.为什么要使用图床 不知道大家有没有遇到过这样的问题&#xff1f; 在使用Typora的时候&#xff0c;我们传到typora上面的图片&#xff0c;在转到其他地方时&#xff0c;总是加载不出来&#xff0c;造成图片丢失现象或者是在将markdown笔记上传到博客时&#xff0c;总是需要一…

华为OD机试真题 JavaScript 实现【静态代码扫描服务】【2023Q1 100分】

一、题目描述 静态扫描快速识别源代码的缺陷&#xff0c;静态扫描的结果以扫描报告作为输出&#xff1a; 文件扫描的成本和文件大小相关&#xff0c;如果文件大小为N&#xff0c;则扫描成本为N个金币&#xff1b;扫描报告的缓存成本和文件大小无关&#xff0c;每缓存一个报告…

(二)安装 Kafka

文章目录 1.选择操作系统2.配置 Java 环境3.安装 ZooKeeper4.安装 broker&#xff08;1&#xff09;安装 broker&#xff08;2&#xff09;验证是否安装正确 5.配置 broker&#xff08;1&#xff09;常规配置&#xff08;2&#xff09;主题的默认配置 6.配置 Kafka 集群&#x…

Netty之协议设计

目录 为什么需要协议 redis协议示例 http协议举例 自定义协议 要素 编解码器 测试 为什么需要协议 TCP/IP 中消息传输基于流的方式&#xff0c;没有边界。 协议的目的就是划定消息的边界&#xff0c;制定通信双方要共同遵守的通信规则 例如&#xff1a;在网络上传输 …

c++11 标准模板(STL)(std::ios_base)(三)

定义于头文件 <ios> class ios_base; 类 ios_base 是作为所有 I/O 流类的基类工作的多用途类。它维护数种数据&#xff1a; 1) 状态信息&#xff1a;流状态标志&#xff1b; 2) 控制信息&#xff1a;控制输入和输出序列格式化和感染的本地环境的标志&#xff1b; 3)…

(一)Flask简介和快速使用

关于Python三大Web框架浅谈一嘴&#xff1a; Django、Flask和Tornado三个框架都是Python Web应用的开发框架&#xff0c;虽然它们都能够开发Web应用&#xff0c;但在使用方式、适用领域和处理方式上还是有很多不同的。 Django Django是一个高层次&#xff08;大而全&#xff0…

Flutter自定义系列之折线波动图,心率图,价格走势图

随着前两篇文章的学习&#xff0c;我今天继续给大家演示下简单的自定义之折线波动图&#xff0c;心率图&#xff0c;价格走势图。 这里&#xff0c;我们创建一个自定义的StatefulWidget&#xff0c;用于显示动态的价格线。 我们将使用CustomPaint和CustomPainter来绘制价格线…

chatgpt赋能python:Python中如何截断字符串

Python中如何截断字符串 Python是一种简单易学、高效的编程语言&#xff0c;旨在让开发人员更快、更方便地完成任务。然而&#xff0c;在实际开发过程中&#xff0c;我们常常需要对字符串进行截断操作。那么&#xff0c;Python中怎么截断字符串呢&#xff1f;接下来就让我们来…

如何最大限度地利用ChatGPT、Bard和其他聊天机器人

作者&#xff1a;Hayden Field 译者&#xff1a;明明如月 当下&#xff0c;随着生成式人工智能的发展&#xff0c;面向消费者的聊天机器人能够处理不同领域的需求&#xff0c;并提供相应的帮助和建议&#xff0c;如制定商业战略、设计数学学习指南、提供薪资谈判建议&#xff…

chatgpt赋能python:Python字符串截断-解决方式及实现方法

Python字符串截断-解决方式及实现方法 在Python编程中&#xff0c;处理字符串是一个非常常见的任务。其中&#xff0c;字符串截断也是在许多场景下必不可少的功能之一。Python不仅提供了许多内置函数来处理字符串&#xff0c;而且还有许多方法来截断字符串。 什么是字符串截断…

chatgpt赋能python:Python怎么截图速度快?

Python怎么截图速度快&#xff1f; 在现在这个数字时代&#xff0c;我们所有人都需要进行屏幕截图。无论是用于记录重要笔记&#xff0c;制作教程&#xff0c;或是用于软件质量控制&#xff0c;高速、高质量、高效的屏幕截图工具都非常必要。 在Python编程领域中&#xff0c;…

S3C2440A的ARM工作模式以及寄存器种类

文章目录 前言一、ARM的工作模式二、寄存器的种类&#xff08;注意特殊寄存器的使用&#xff09;总结 前言 本期和大家主要分享的是ARM工作模式以及寄存器种类&#xff0c;不同系列的ARM的工作模式以及寄存器的种类大同小异&#xff0c;所以针对于S3C2440A&#xff0c;一定得通…