MQTT协议详细说明与理解
一、简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议) 协议是应用于边缘终端设备之间通过中心服务进行相互通信的协议。 MQTT 协议基于消息发布与订阅的处理机制实现,属于轻量级协议。
MQTT is a lightweight, publish-subscribe based messaging protocol designed for resource-constrained devices and low-bandwidth, high-latency, or unreliable networks.
二、协议详细说明
2.1)逻辑结构
- MQTT 组成部分
从逻辑上来看,MQTT 主要有三部分组成:
- 
- 消息接收端:用来接收来自发送端的消息
- MQTT 代理:提供发布与订阅的能力
- 消息发送端:用来发布消息给订阅的接收端
 
但是从物理上来看,MQTT 只由两部分组成:
- MQTT 客户端(通常是多个节点)
- 发布其他客户端可能会订阅的信息;
- 订阅其它客户端发布的消息;
- 退订或删除应用程序的消息;
- 断开与服务器连接;
 
- MQTT 代理服务端
 - 接受来自客户的网络连接;
- 接受客户发布的应用信息;
- 处理来自客户端的订阅和退订请求;
- 向订阅的客户转发应用程序消息;
 
2.2)数据结构
在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。
MQTT数据包结构如下:
- 固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
- 可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
- 消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。
2.2.1)MQTT固定头
固定头存在于所有MQTT数据包中,其结构如下:
2.2.1.1)MQTT数据包类型
位置:Byte 1中bits 7-4。相于一个4位的无符号值,类型、取值及描述如下:
2.2.1.2)标识位
  位置:Byte 1中bits 3-0。
  在不使用标识位的消息类型中,标识位被作为保留位。如果收到无效的标志时,接收端必须关闭网络连接:
- DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。
- QoS:发布消息的服务质量,即:保证消息传递的次数
- Ø00:最多一次,即:<=1
- Ø01:至少一次,即:>=1
- Ø10:一次,即:=1
- Ø11:预留
 
- RETAIN: 发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。
2.2.1.3)剩余长度(Remaining Length)
  地址:Byte 2。
  固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为1时,表示长度不足,需要使用二个字节继续保存。例如:计算出后面的大小为0
2.2.2) MQTT可变头
  MQTT数据包中包含一个可变头,它驻位于固定的头和负载之间。可变头的内容因数据包类型而不同,较常的应用是作为包的标识:
  很多类型数据包中都包括一个2字节的数据包标识字段,这些类型的包有:
- PUBLISH (QoS > 0)
- PUBACK
- PUBREC
- PUBREL
- PUBCOMP
- SUBSCRIBE
- SUBACK
- UNSUBSCRIBE
- UNSUBACK
2.2.3) Payload消息体
Payload消息体位MQTT数据包的第三部分,包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息:
- CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
- SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
- SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
- UNSUBSCRIBE,消息体内容是要订阅的主题。
三、协议特性
MQTT 协议具有以下特性和优势,已成为物联网数据传输的标准:
- 轻量、高效:IoT 设备上的 MQTT 实施需要最少的资源,因此它甚至可以用于小型微控制器。例如,最小的 MQTT 控制消息可以少至两个数据字节。MQTT 消息的标头也很小,因此您可以优化网络带宽。
- 可扩展:MQTT 实施需要最少的代码,在操作中消耗的功率非常少。该协议还具有支持与大量物联网设备通信的内置功能。因此,您可以实施 MQTT 协议来连接数百万台此类设备。
- 可靠:许多 IoT 设备通过低带宽、高延迟的不可靠蜂窝网络连接。MQTT 具有内置功能,可减少 IoT 设备重新连接云所需的时间。它还定义了三种不同的服务质量级别,以确保 IoT 用例的可靠性——最多一次(0)、至少一次(1)和恰好一次(2)。
- 安全:MQTT 使开发人员可以轻松地使用现代身份验证协议(例如 OAuth、TLS1.3、客户管理的证书等)加密消息并对设备和用户进行身份验证。
- 良好的支持:几种语言(如 Python)对 MQTT 协议的实施提供广泛的支持。因此,开发人员可以在任何类型的应用程序中以最少的编码快速实现它。
四、应用场景
五、参考资料
https://aws.amazon.com/cn/what-is/mqtt/
https://www.runoob.com/w3cnote/mqtt-intro.html
https://www.runoob.com/manual/mqtt/protocol/MQTT-3.1.1-CN.pdf
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号