工业物联网常用协议概念梳理–小白学习笔记
前言
作为初入物联网领域的小白,常常会混淆RS-232、RS-485、RS-422、Modbus、CAN、OPC等诸多物联网数据集成领域常见的协议和概念。因此在工作之余,本人搜集了大量物联网相关技术博客材料对易混淆物联网协议进行了简单梳理,目的是搞清楚这些协议的概念,而不对协议使用进行深入探讨。希望能对一些刚接触物联网数据采集领域的新手能有所帮助,由于本人能力有限,文章表述可能存在些许错误,希望各位大神能及时指正。
为了理清楚各个协议的本质区别,首先我对协议按照OSI网络模型进行分类,如下图。
- RS-232、RS-485、RS-422三种协议之规定了接口的电气特性并未对协议内容进行规定为最底层协议
- CAN协议起源于汽车行业,同时对电气特性和数据传输校验进行了规定,并未对传输内容进行规定,可基于CAN协议载体搭载不同软件协议
- Modbus为更高层级的应用层协议,规定了报文内容含义,可以基于TCP/IP协议、UART协议进行数据传输
- OPC和MQTT相比Modbus则为更高层级的应用协议,有一套冗杂完整的规定和标准,一般基于以太网TCP/IP通信。
下面按照OSI层级对以上协议进行简单介绍。
⚙RS-232、RS-485、RS-422标准
RS-232和RS-485、RS-422均为异步串行通信的接口标准(属于电平协议),只规定了串行通信接口的电气特性(电压、阻抗、信号线功能等),不对软件协议进行规定,因此属于物理层协议。
串口协议 | RS-232 | RS-485 | RS-422 |
---|---|---|---|
工作方式 | 单端(非平衡) | 差分(平衡) | 差分(平衡) |
双工模式 | 全双工 | 半双工 | 全双工 |
传输距离 | 15米 | 1200米 | 1200米 |
物理接口 | 不固定接口,一般为DB9 | 不固定接口,一般是凤凰头(两针插口) | 不固定接口,一般是凤凰头(四针插口) |
连接方式 | 点对点 | 点对多(可串并、组网) | 点对多(可串并、组网) |
电气特征 | 逻辑0:+3V ~ +15V | 逻辑0:-6V ~ -2V | 逻辑0:-6V ~ -2V( |
逻辑1:-15V ~ -3V | 逻辑1:+2V ~ +6V | 逻辑1:+2V ~ +6V | |
引脚 | RX、TX、GND(交叉接线) | A+、B- | Rx+、Rx-、Tx+、Tx- |
表格中RS-485、RS-422的逻辑0和1的电压值均为AB双绞线的差值(差分信号),双绞线信号振幅相同、相位相反,抗干扰能力强。
- 传输速度(波特率)和传输的距离成反比
- RS-232 仅限15m内传输,最大速率20kb/s (波特率19200bit/s)
- RS-485和RS-422在100kb/s速率下才能达到最大传输距离,100米双绞线速率仅位1Mb/s ,实际传输速率和传输介质、芯片有关
异步串行通信协议
虽然RS-232、RS-485、RS-422这些接口标准只规定了电气特性并未对数据链路层进行规定,但三者同属异步串行通讯接口,均符合异步串行通信协议标准,其数据帧、时序如下:
- 起始位:发送1位逻辑0开始传输
- 数据位:可以为5-8位数据,先发低位后发高位,常见8位。
- 校验位:数据位中1的个数为奇数则校验位为0(奇校验)或数据位中1的个数为偶数则校验位为0(偶校验)
- 停止位:1、1.5或2位逻辑1
- 空闲位:保持逻辑1状态
⚙CAN
控制器局域网总线(CAN,Controller Area Network)是德国博世公司在20世纪80年代专门为汽车行业开发的一种串行通信总线,采用多主结构(具备总线仲裁,不同于Modbus一主多从),但CAN协议仅规定了 物理层、数据链路层要求,需要用户自定义应用层协议(例如CANOpen、DeviceNet、J1939、iCAN)来解析总线数据的发送节点和信息含义,下图是CAN总线协议的OSI分层结构。
物理层要求
CAN物理层采用差分信号进行传输,与串口相同都需要约定波特率(与UART协议的数据格式不同),CAN节点的硬件结构如下图所示,CAN控制器将CPU传来的信号转换为逻辑电平。CAN发送发器接收逻辑电平之后,再将其转换为差分电平输出到CAN总线上,接收过程则信号方向相反。CAN的收发器包括发送器和接收器,两者独立工作。
CAN通信网络可以分为高速CAN和低速CAN网络,分别遵循ISO11898和ISO11519-2标准
高速CAN网络
高速CAN也叫闭环网络,遵循ISO11898标准(ISO11898-1规定数据链路层,ISO11898-2规定物理层),适用于高速、短距离网络的通信,传输限制为40M,最高速度为1Mbps。
- 逻辑1叫做隐性电平,两根信号线的电压值都是2.5V,它们的差值为0V
- 逻辑0叫做显性电平,其中高电平信号线的电压值为3.5V,低电平信号线的电压值1.5V,它们的差值为2V
- 线与特性:当CAN总线上不同的两个节点同时输出逻辑1和逻辑0,逻辑0的电平将覆盖逻辑1的电平,因此可以认为逻辑0的优先级大于逻辑1,因此逻辑0也叫做显性电平。
低速CAN网络
开环网络也叫低速CAN,遵循ISO11519-2标准(ISO11898-3后替代了ISO11519-2),适用于低速、远距离网络的通信,传输距离限制为1KM,速率为125kbps。
总线的两根信号线彼此独立,但要求每根总线串联一个2.2k欧的电阻。
- 开环网络中的逻辑1(隐性电平)的电平分别为1.75V和3.25V,它们的差值为-1.5V。
- 开环网络中的逻辑0(显性电平)的电平分别为4.0V和1.0V,它们的差值为3.0V
数据链路层要求
CAN总线协议是基于广播的通信形式,总线内所有节点都共同参与通信,每个节点发送器和接收器独立,所有节点的接收器持续监听总线电平,并在适当时机给予反馈
帧类型
CAN总线传输的是CAN帧,CAN的通信帧分成五种,分别为数据帧、远程帧、错误帧、过载帧和帧间隔。
帧类型 | 用途 |
---|---|
数据帧 | 用于发送单元向接收单元传送数据的帧 |
远程帧 | 用于接收单元向具有相同ID的发送单元请求数据的帧 |
错误帧 | 用于检测出错误时向其他单元通知错误的帧 |
过载帧 | 用于接收单元通知发送单元尚未做好接收准备的帧 |
帧间隔 | 用于数据帧及远程帧与前面帧分离开来的帧 |
数据帧
数据帧根据仲裁段长度的不同分为标准帧和扩展帧(为了解决ID位数不足的情况而产生),其数据格式如下图所示
总线空闲
- Bus Idle:总线空闲 (连续11个位的隐性电平)
帧起始
- SOF:起始帧,1位 显性电平 标识了数据帧或远程帧的起始,在总线空闲时开始发送
仲裁场
- ID:报文ID标识符,确定报文的优先级,ID数值越小优先级越高,标准帧11位、扩展帧29位
- RTR : 用于区分数据帧和远程帧,数据帧RTR=0,远程帧 RTR =1; 因此数据帧优先级高于远程帧
- SRR : 表明在该位替代了标准帧的RTR ,该位没有实际意义,SRR 永远置1
- IDE : 用于区分标准帧和扩展帧,标准帧 IDE =0, 扩展帧IDE=1
- Extended ID:扩展帧的额外ID标识
控制场
- r0,r1,r :保留位,默认显性电平
- DLC :表示数据场包含数据的字节数
数据场
- 具有0-8 个字节长度,由DLC 确定,包含CAN 数据帧发送的内容
CRC场
- CRC:用于CRC校验,校验CRC段之前的所有数据正确性和完整性
- DEL : 用于界定CRC和ACK字符,固定一个隐性位 (考虑到时间误差,为了接收节点有足够的时间对ACK确认)
ACK场
-
ACK:确定报文被至少一个节点正确接收。当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将发送一个显性电平
-
DEL:界定ACK和EOF字符,固定一个隐性位
帧结束
- EOF:表示帧结束,固定7个隐性位
帧间隔
- ITM :帧间隔(间歇场),固定3个连续隐性位,ITM 之后进入总线空闲状态,此时节点可以发送报文 **作用:**标识过载情况,此时发送数据会出现过载
远程帧
与数据帧相比,远程帧结构上无数据段,由6个段组成,也分为标准格式和扩展格式
比较内容 | 数据帧 | 远程帧 |
---|---|---|
ID | 发送节点的ID | 被请求发送节点的ID |
SRR | 0(显性电平) | 1(隐性电平) |
RTR | 0(显性电平) | 1(隐性电平) |
DLC | 发送数据的长度 | 请求数据的长度 |
是否有数据段 | 是 | 否 |
CRC校验范围 | 帧起始+仲裁段+控制段+数据段 | 帧起始+仲裁段+控制段 |
错误帧
如下图,CAN通信协议有五种错误:
-
CRC错误:发送节点的发送器计算的CRC值与接收到的CRC值不同发生该错误;
-
格式错误:在固定格式的位场处检测到非法位,例如ACK界定符DEL位为隐性时报格式错误
-
应答错误(ACK检测):发送节点在ACK阶段没有收到应答信息发生该错误(ACK SLOT时间内为隐性电平);
-
位发送错误(位检测):发送节点在发送信息的同时监听总线电平,发现总线电平与发送电平不符发生该错误;
-
位填充错误:通信总线违反位填充原则
位填充原则
CAN协议规定,在远程帧和数据帧的SOF~CRC段,连续出现5个相同逻辑位后必须插入一位相反逻辑位。
- 确保CAN网络同步,需要足够多的上升沿
- 确保数据帧不会被当作错误帧(由6个连续的显性或隐性位组成)、确保正确识别帧结束标志(7个连续隐性位)
节点错误状态判定
CAN节点根据错误计数结果的不同,每个节点会在主动错误状态、被动错误状态和总线关闭态三种状态之间转换,具体界定如下图:
- TEC表示节点发送错误计数值
- REC表示节点接收错误计数值
- TEC和REC计数原理在ISO标准中有规定
错误帧的具体格式如下图:
-
错误标识域:分主动错误标识和被动错误标识 两种类型
- 主动错误状态节点:检测到错误时,发送连续6个显性电平作为主动错误标识
- 被动错误状态节点:检测到错误时,发送连续6个隐性电平作为被动错误标识 (被动错误节点发送数据时,要先发送8位隐性电平传输延迟,保证主动错误节点具有优先权)
- 由于错误标识会在不同节点中重叠,因此在总线上看到的错误标识符长度可能为6~12位
-
错误定界符:错误标识符发送后,再发送8位的隐性电平,表示错误帧发送完毕
上图为多节点检测到错误时的CAN总线时序图案例
Node_A发送时检测到位错误时,主动发送连续6个显性位作为主动错误帧,当Node_B和Node_C两个主动错误节点检测到总线出现6个显性位会自动报位填充错误,发送6个连续隐性位,因此总线出现12位主动错误标志位,后总线出现8位错误界定符,加上后续3位间歇场隐性位,总线出现11位连续隐性位,总线被各节点判定为空闲,可以再次向总线发送数据。
过载帧
过载帧由6个连续显性电平(过载标志)+8个连续隐性电平(过载界定符)组成,与错误帧类似,不同节点发送过载帧时间不同可能会重叠,最多12位。
有三种情况会引起过载帧:
- 接收节点自身负载超限,需要通知发送节点暂停发送数据,以便自己有时间处理数据。
- 帧间隔的间歇段的前两位检测到显性位,说明有节点想要发送数据,但是总线还没有空闲。
- 错误界定符或过载界定符的第八位(最后一位)听到一个显性位0,说明有节点出现了错误或过载
帧间隔
帧间隔用于分隔数据帧和遥控帧的帧,发送完数据后发送ITM帧间隔,帧间隔后总线进入空闲。
帧间隔由间隔段、总线空闲段和延迟传送段组成,具体说明如下所示:
- 间隔段:间歇由3个隐性位构成。在间歇期间,不允许任何节点发送数据帧或远程帧。只要在这期间监听到显性位,接收节点就会发送过载帧。
- 总线空闲段:总线空闲时间长短不限。总线一经确认处于空闲状态,则任何节点都可以访问总线来传送信息。
- 延迟传送段:只有处于被动错误状态的节点在发送帧间隔的时候,才会在帧间隔中插入8个连续隐性位的暂停段(为了让主动节点优先发送数据)。
通信机制
总线仲裁
任何节点只要监测到连续11个隐性电平即总线空闲,均可以向总线发送报文,由ID仲裁机制判断有优先级,有以下几种情况:
- 当总线上没消息传递时,优先权归第一个开始发送消息的单元
- 多个单元同时发送报文时,根据ID按时序逐位对比,能够持续输出显性位最多的赢得优先权(例如:1000…优先级高于0111…)
- 总线出现相同ID的报文时,按照逐位优先级对比。由于RTR= 0(数据帧)、RTR=1(远程帧)SRR=1(扩展帧),因此相同ID下优先级顺序为:标准数据帧、标准扩展帧、扩展数据帧、扩展远程帧
上图为三个节点ABC发送数据前首先检测总线是否空闲,总线判定空闲后同时向总线发送报文的仲裁对比,最终节点C仲裁成功发送后续数据,而节点A和B分别在第5为和RTR位仲裁失败后转为监听模式。
ACK应答
- CAN数据发送是个双向互动的过程,发送节点一边发送,一边检测总线的电平,而接收节点也时刻接收,并在接收到数据帧(CRC段及之前段)确认无误后,在ACK SLOT时间内将总线电平置为显性
- 任何节点准确无误地接收到帧(并不需要和发送ID匹配),都要向总线上发送显性位,该显性位将掩盖发送节点输出的隐性位,使总线上表现为显性。因此只要有一个节点确认数据帧无误,ACK段就会置为显性,且ACK段为显性并不能说明对应ID的接收节点接收到正确数据
- 虽然CAN总线所有节点都可以侦听到所有传输的报文,但是并不是所有节点都会解析总线上的数据帧,而是由每个节点的本地过滤功能决定是否对报文做出响应。比如只解析某个ID范围内的数据
⚙Modbus
Modbus是一种串行通信协议(报文传输协议),规定了传输数据的含义(软件协议)由MODICON公司(现施耐德电气)于1979年开发,是一种工业现场总线协议标准,属于应用层协议。可采用异步串行通信和以太网通信。
-
Modbus采用 主/从模式,主机发出请求,从机应答(从机之间互通需要通过主机中转)
-
Modbus协议可以分为三种包括Modbus-RTU、Modbus-ASCII、Modbus-TCP
Modbus-RTU
Modbus-RTU是最常见的Modbus实现形式也是设备必须支持的协议,常用于RS-485作为物理层,采用串口进行报文的收发,其数据帧格式如下图:
- 设备地址(地址)占1字节,范围是0-255,0是广播地址,0-248从机设备地址,248-255保留不用
- 功能码占1字节,有效的码字范围是十进制 1-255(128-255 为异常响应保留),当从客户机向服务器设备发送报文时,功能码域通知从机执行哪种操作,如下为部分功能码:
功能码 | 名称 | 作用 |
---|---|---|
02 | 读离散量输入 | 读取离散量输入的状态 |
05 | 写单个线圈 | 强制一个逻辑线圈的通断状态 |
03 | 读取保持寄存器 | 读取多个保持寄存器的当前值 |
04 | 读取输入寄存器 | 读取输入寄存器的当前值 |
- 数据位占0-252个字节,具体格式和大小跟功能码有关。
- 校验位(CRC)占2字节,验证收发信息
- 由于Modbus报文没有起始符和结束符,因此两个数据帧采用时间间隔来区分(断帧):
- 一个数据帧的最后一个字符传输完成之后,需要至少3.5个字节的时间的停顿标定数据帧的结束
- 同一帧数据两个字节间距必须小于1.5字节时间,否则认为报文帧不完整被接收节点丢弃
ModBus RTU报文案例
读取2号站,30008~30009 2个输入寄存器的数值
请求报文
应答报文
Modbus-ASCII
采用ASCII码传输文本信息,相较于Modbus-RTU传输效率更低,但可读性更好
- ASCII模式下,将1个字节8位拆分为两个字符进行发送,比如十六进制0xFE会被分解成ASCII字符“F”和“E”的ASCII码(共两个字节)发送,因此发送数据长度比RTU增加一倍
- ASCII模式下,起始码为英文冒号(ASCII 0x3A),停止码为\r\n(ASCII 0x0A 0x0A 回车换行)
- ASCII模式下,采用LRC校验
- 由于存在起始、停止码,无需采用时间进行断帧,Modbus ASCII数据包中两个字节之间传输间隔可以长达1s而不引发通信故障
- 由于采用ASCII码(仅有7位就可以表示)传输,串口通信数据为只需要7位
Modbus-RTU和Modbus-TCP对比
协议 | 开始标记 | 结束标记 | 校验 | 传输效率 | 程序处理 |
---|---|---|---|---|---|
ASCII | :(冒号) | CR,LF(回车换行) | LRC | 低 | 直观,简单,易调试 |
RTU | 无 | 无 | CRC | 高 | 稍复杂 |
Modbus-TCP
施耐德电气1996年推出基于以太网TCP/IP的Modbus协议。
Modbus-TCP的数据帧由报文头MBAP和PDU组成,且由于Modbus-TCP是面向连接的比较可靠,因此ModBus-TCP数据帧无需校验码。
MBAP报文头含义
域 | 长度 | 说明 | 客户机 | 服务器 |
---|---|---|---|---|
事务处理标识符 | 2字节 | Modbus请求/响应事务处理的标识 | 客户机启动 | 复制响应 |
协议标识符 | 2字节 | 0=Modbus协议 | 客户机启动 | 复制响应 |
长度 | 2字节 | 长度域之后的字节总数 | 客户机启动 | 服务器启动 |
单元标识符 | 1字节 | 串行链路或其它总线的从站识别 | 客户端启动 | 复制响应 |
例:读取输出寄存器
发送报文:
事务/协议 | 长度 | 单元标识 | 功能码 | 起始高 | 起始低 | 数量高 | 数量低 |
---|---|---|---|---|---|---|---|
0x00000000 | 0x0006 | 0x01 | 0x03 | 0x00 | 0x6B | 0x00 | 0x02 |
发送报文含义:读取服务器1号从站输出寄存器,起始地址为0x6B=107(相对地址),对应地址为40108,寄存器数量为0x02=2,即读取1号从站输出寄存器,地址从40108-40109,共两个寄存器的数值。
返回报文:
事务/协议 | 长度 | 单元标识 | 功能码 | 字节计数 | 1高 | 1低 | 2高 | 2低 |
---|---|---|---|---|---|---|---|---|
0x00000000 | 0x0007 | 0x01 | 0x03 | 0x04 | 0x02 | 0x2B | 0x01 | 0x06 |
返回报文含义:返回服务器1号从站输出寄存器40108-40109,共2个寄存器的数值,返回字节数为4个,分别为02、2B、01、06,寄存器40108对应数值为0x022B,寄存器40109对应数值为0x0106。
⚙OPC
OPC(OLE for Process Control)用于过程控制的OLE,是一种利用微软的OLE(对象连接与嵌入,Active X)、COM(部件对象模型)和DCOM(分布式部件对象模型)技术来达成自动化控制的协定,属于软件间的应用层协议。
OPC标准的发展:从OPC到OPC UA
1990年代-OPC出现之前
微软操作系统占据主导地位,制造企业和SCADA(数据采集与监视控制系统)软件集成商需要在windows系统上将现场不同品牌、型号设备的数据采集到统一的应用软件中。由于工业环境没有统一的标准,为了实现数据采集,软件集成厂家需要针对每个设备开发不同的驱动接口,而且驱动接口开发完成后还需随设备升级及时更新驱动,这为软件集成厂商造成了巨大的工作负担。工业界急切需要一种高效可靠、开放互联的标准接口来解决这样的混乱局面。
1996年-OPC Classic出现
在市场需求的推动下,1996年微软联合几个市场主导地位的厂商成立OPC基金会,发布OPC DA(数据访问)规范,目的是把PLC特定的协议(如Modbus、Profibus等)抽象成为标准化的接口,作为中间媒介的角色把通用的OPC“读写”请求转换成具体的设备协议来与HMI/SCADA系统(HMI和SCADA一般运行在x86或arm架构的计算机上)直接对接。此后1998-2001年OPC基金会又发布OPC AE(报警和事件)、OPC HDA(历史数据访问)两个规范,完善OPC标准体系,一般称为OPC Classic,与后来的OPC UA区分。
OPC Classic规范采用客户端/服务端模式,由于采用了微软的COM/DCOM技术,因此也存在诸多不便:
- DCOM需要针对服务器和客户机分别进行组件访问及安全性配置,配置项目繁多且复杂
- OPC DA技术基于Windows平台,不能进行跨平台访问
2008年-OPC UA
2008年,OPC基金会发布了OPC UA (OPC统一架构),它是新一代的OPC技术,不再基于DCOM,而是以SOA(面向服务架构)为基础,底层用SOAP/XML实现,真正实现了跨平台。
OPC CLassic与OPC UA都基于以太网传输数据,主要区别在于两者在OSI模型的层级不同:
OPC UA定义了协议帧的格式因此可以应用于任何传输层除了上图的TCP层,OPC UA还可以使用应用层HTTP协议传输,而OPC Classic则必须基于基于应用层COM/DCOM技术来达成协定,在windows操作系统下才能更好的发挥协议性能。
深入理解OPC标准
OPC标准是硬件供应商和软件开发商之间达成的规则约定,是PLC与IT系统通信的桥梁,可以将PLC处理的数据编程IT系统能够直接使用的变量,可以分为客户端和服务端两部分:
- 服务端(Server):硬件供应商负责为设备编写驱动程序,并提供标准的OPC接口的OPC Server程序(目前主流OPC软件是Kepserver,可兼容市场主流PLC)
- 客户端(Client):软件开发商按照标准的OPC接口开发客户端程序就可以访问硬件设备数据,实现SCADA等各类应用
客户端与硬件设备的关系如下图所示,PLC设备的Modbus等协议被抽象为一组接口,而SCADA等客户端软件可以直接操作OPC Server的接口来实现对PLC的数据操作,而无需考虑底层的各类通讯协议。
以OPC UA为例,客户端与服务端建立连接需要经过4个步骤:
- 创建socket进行tcp的三次握手建立连接
- 发送hello报文,告知服务端客户端buffer大小等信息
- 服务器接收报文后,确认buffer大小将确认的buffer大小移交至SecureChannel层并返回Acknowledge报文。若socket建立后服务器长时间未收到hello报文会直接关闭socket连接
- 客户端接收Acknowledge报文,将创建的socket与自己的SecureChannel关联
OPC UA的报文格式与大多数应用层协议格式结构相似,都由消息头和消息体组成,具体协议较复杂在此不做赘述。
MQTT
MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,属于应用层协议,由IBM在1999年发布。
发布者和订阅者
在MQTT协议与OPC协议类似,同样需要客户端和服务端来完整通讯数据流转。MQTT协议基于发布订阅的模式,在通讯过程中有发布者(Publish)、服务器代理(Broker)和订阅者(Subscribe)三种身份。其中消息发布者和订阅者都是客户端,消息代理是服务端作为数据的中转。
在MQTT协议通讯中,一个客户端可同时作为发布者和订阅者。订阅客户端只向代理服务器订阅一个主题后,代理服务器会将所有接收到的该主题的消息转给订阅客户端。主题(Topic)以’/‘为分隔符区分不同的层级,包含通配符"+"或 ”#“的主题又称为主题过滤器(Topic Filters); 不含通配符的称为主题名(Topic Names)例如:
sensor/10/temperature
sensor/+/temperature
$SYS/broker/metrics/packets/received
$SYS/broker/metrics/#
'+' : 表示通配一个层级, 例如a/+,匹配a/x, a/y
MQTT的数据帧格式
在MQTT协议中,一个MQTT数据包由: 固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。
-
固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识,如连接,发布,订阅,心跳等。其中固定头是必须的,所有类型的MQTT协议中,都必须包含固定头。
-
可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。可变头部不是可选的意思,而是指这部分在有些协议类型中存在,在有些协议中不存在。
-
消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。与可变头一样,在有些协议类型中有消息内容,有些协议类型中没有消息内容。
MQTT协议具体细节可参考官方文档。
参考文章链接:
Modbus部分
https://m.elecfans.com/article/1824328.html
https://blog.csdn.net/weixin_42077793/article/details/118048327
CAN协议部分
https://blog.csdn.net/Dallan/article/details/105642419
https://blog.csdn.net/cwlonger/article/details/106768843
https://blog.csdn.net/u010192735/article/details/121399798
https://www.elecfans.com/emb/jiekou/202010131329324.html
https://blog.csdn.net/weixin_40528417/article/details/79871311
https://blog.csdn.net/weixin_40528417/article/details/79771270
OPC部分
https://www.sohu.com/a/205659957_818781
https://blog.csdn.net/nihaomabmt/article/details/107018608
[1] OPC UA基础知识简介_opcua 底层-CSDN博客
工控 - OPC报文详解 - 个人文章 - SegmentFault 思否
MQTT
如有侵权请联系删除