随着行业的快速发展,数据管理和接收所需的设备数量也在增加。为了解决众多设备之间的通信问题以及单个网络中设备组合的问题,已经创建了物联网(IoT)概念-基于某些功能的单个网络中设备的组合或特性,此网络进一步与类似网络组合在一起,从而创建更大的网络,依此类推。
在这样的网络中,设备通过各种接口和通信协议彼此交互。当我们正在考虑物联网概念的工业实现时,应使用具有自己的协议和硬件的工业设备,让我们开始探讨IIoT概念(工业物联网)。
为了进行通信,设备可以使用各种工业协议。为此,MQTT很受欢迎。
MQTT或消息队列遥测传输是一种轻巧的开放式消息传递协议,用于在要求“代码占用量小”或网络带宽受限的远程位置进行数据传输。这些优势允许在M2M系统(机器对机器)和IIoT系统(工业物联网)中实现此协议。
还存在一种协议变体MQTT-SN(用于传感器网络的MQTT),以前称为MQTT-S,其设计用于不支持TCP / IP网络的嵌入式无线设备,例如ZigBee。
MQTT协议的主要功能:
● 异步协议
● 紧凑的消息
● 在数据传输线连接不稳定的情况下运行
● 支持多个服务质量(QoS)级别
● 轻松集成新设备
在应用程序层上,MQTT协议在TCP / IP协议之上工作,并且默认使用端口1883(如果通过SSL连接则使用端口8883)。
在MQTT协议中,消息交换在客户端(可能是消息发布者或消息订阅者)与消息代理(例如Mosquitto MQTT)之间进行。
发布者在MQTT Broker上发送数据,并在消息中指定了明确的主题。订阅者可以根据对相应主题的订阅,从多个发布者接收各种数据。
MQTT设备使用确定类型的消息来与代理进行通信。主要类型如下:
● 连接–建立与Message Broker的连接
● 断开连接–断开与消息代理的连接
● 发布–在Message Broker中发布有关主题的数据
● 订阅–订阅消息代理上的主题
● 退订–退订主题
MQTT消息包含以下几部分:
● 固定的标头(出现在所有消息中)
● 可变标头(出现在某些消息中)
● 数据,有效负载(存在于某些消息中)
消息类型-例如:CONNECT,SUBSCRIBE,PUBLISH等。
每个MQTT数据包特有的标志–这4位用于辅助标志,辅助标志的存在和状态取决于消息类型。
剩余长度–当前消息长度(可变报头+数据),大小为1到4个字节。
总体而言,MQTT协议中有15种消息类型:
讯息类型 | 值 | 流向 | 描述 |
---|---|---|---|
已预留 | 0000(0) | 禁止的 | 已预留 |
连接 | 0001(1) | C *-> S ** | 客户端请求连接到服务器 |
康纳克 | 0010(2) | C <- | 连接确认 |
发布 | 0011(3) | C <-S,C-> S | 发布讯息 |
回送 | 0100(4) | C <-S,C-> S | 发布确认 |
PUBREC | 0101(5) | C <-S,C-> S | 发布收到 |
公开 | 0110(6) | C <-S,C-> S | 发布发行 |
PUBCOMP | 0111(7) | C <-S,C-> S | 发布完成 |
订阅 | 1000(8) | C-> S | 客户订阅请求 |
后退 | 1001(9) | C <- | 订阅确认 |
取消订阅 | 1010(10) | C-> S | 退订请求 |
取消订阅 | 1011(11) | C <- | 退订确认 |
PINGREQ | 1100(12) | C-> S | PING请求 |
平RESP | 1101(13) | C <- | PING回应 |
断开 | 1110(14) | C-> S | 客户端断开连接 |
已预留 | 1111(15) | 禁止的 | 已预留 |
固定标头的前4个最高有效位用作特定标志:
DUP –当客户端或MQTT代理提交重发的数据包(在PUBLISH,SUBSCRIBE,UNSUBSCRIBE,PUBREL中使用)时,将设置Duplicate。如果设置了该标志,则变量头必须包含消息ID(消息标识符)。
QoS –服务质量(0,1,2)
保留-发布带有保留标志的数据时,代理将对其进行存储。建立对该主题的新订阅后,代理将立即发送带有此标志的消息。仅在PUBISH类型的消息中使用。
某些标头中存在可变标头。
它包含以下数据:
● 数据包标识符–存在于所有类型的消息中,但以下情况除外:CONNECT,CONNACK,PUBLISH(сQoS <1),PINGREQ,PINGRESP,DISCONNECT
● 协议名称–仅在CONNECT消息类型中显示
● 协议版本–仅在CONNECT消息类型中存在
● 连接标志–指定连接期间客户端行为的标志
用户名–如果设置了该标志,则有效负载中必须存在一个用户名(用于客户端身份验证)
密码–如果设置了此标志,则有效负载中必须存在密码(用于客户端身份验证)
将会保留-如果该标志设置为1,则代理将存储一个意愿消息。
Will QoS – Will Message的服务质量。如果设置了意愿标记,则必须存在意愿QoS和意愿保留。
意志标志-如果设置了该标志,则在客户端断开代理而不发送DISCONNECT命令(如果发生不可预知的关闭,失败等情况)之后,代理将通过所谓的意志消息通知所有已连接的客户端。
干净会话-如果将该标志设置为0,则代理存储一个会话,所有客户端订阅都将通过客户端的下一个连接发送,并且在客户端断开连接时,代理将接收来自QoS1和QoS2的所有消息。因此,如果该标志设置为1,则到下一个连接,客户端必须再次订阅所有主题。
● 会话存在–在CONNACK类型的消息中应用。如果Broker接受将Clean Session设置为1的连接,则必须将Session Present(SP)设置为0。如果Broker接受Clean Session设置为0的连接,则SP中设置的值取决于Broker是否已存储此客户端的会话状态(如果是,则必须将SP设置为1,反之亦然)。会话存在标志使客户端能够确定是否已经存储了会话状态。
● 连接返回码–如果代理出于某种原因无法从客户端接收格式正确的CONNACK数据包,则必须在下表的CONNACK数据包的第二个字节中设置适当的值:
值 | 返回码响应 | 描述 |
---|---|---|
0 | 0x00接受连接 | 接受连接 |
1个 | 0x01连接被拒绝,协议版本不可接受 | 代理不支持客户端请求的协议版本 |
2 | 0x02连接被拒绝,标识符被拒绝 | 用于连接的客户端的客户端ID不在具有允许ID的列表中 |
3 | 0x03连接被拒绝,服务器不可用 | 已建立网络连接,但MQTT服务不可用 |
4 | 0x04连接被拒绝,用户名或密码错误 | 用户名或密码中的数据格式错误 |
5 | 0x05连接被拒绝,未授权 | 客户端无权连接 |
6-255 | 保留以备将来使用 |
数据,有效载荷
通过MQTT消息传输的数据的内容和格式在设备中定义。可以通过从剩余长度中减去变量头的长度来计算数据大小。
返回目录
发送消息时,MQTT支持三个级别的服务质量(QoS)。
QoS 0最多一次。在此级别上,发布者一次向代理发送一条消息,并且不等待任何响应,即发送并忘记它。
QoS 1至少一次。此级别可确保将消息传递到代理,但是可以从发布者复制消息。一旦收到副本,代理将再次将此消息发送给订阅服务器,并将消息接收确认转发给发布服务器。如果发布者未从代理获取PUBACK消息,它将尝试重新传递此数据包,将DUP设置为1。
QoS 2恰好一次。在此级别上,可以确保将消息传递到客户端,并且不可能重复副本。
发布者向代理发送消息。该消息包含唯一的数据包ID,QoS = 2和DUP = 0。发布者存储未经确认的消息,除非它从代理获得PUBREC响应。代理回复包含相同分组ID的PUBREC消息。收到此消息后,发布者发送具有相同数据包ID的PUBREL。代理必须存储消息副本,直到获得PUBREL。代理收到PUBREL后,它将删除消息副本,并将有关已完成的事务的PUBCOMP消息发送给发布者。