MQTT协议理解---报⽂格式
1.MQTT 是什么
MQTT 的全称为 Message Queue Telemetry Transport,是在 1999 年,由 IBM 的 Andy Stanford-Clark 和 Arcom 的 Arlen Nipper 为了⼀个通过卫星⽹络连接输油管道的项⽬开发的。为了满⾜低电量消耗和低⽹络带宽的需求,MQTT 协议在设计之初就包含了以下⼀些特点:
1. 实现简单
2. 提供数据传输的 QoS
3. 轻量、占⽤带宽低
4. 可传输任意类型的数据
5. 可保持的会话(ssion)
MQTT 协议是什么?简单地来说 MQTT 协议有以下特性:
基于 TCP 协议的应⽤层协议;
采⽤ C/S 架构;
使⽤订阅/发布模式,将消息的发送⽅和接受⽅解耦;
提供 3 种消息的 QoS(Quality of Service): ⾄多⼀次,最少⼀次,只有⼀次;
收发消息都MQTT 跟传统的消息队列相⽐,有以下⼀些区别:
1. 在传统消息队列中,在发送消息之前,必须先创建相应的队列;在 MQTT 中,不需要预先创建要发布的主题(可订阅的 Topic);
2. 在传统消息队列中,未被消费的消息总是会被保存在某个队列中,直到有⼀个消费者将其消费;在 MQTT 中,如果发布⼀个没有被任
何客户端订阅的消息,这个消息将被直接扔掉;办公室男女
3. 在传统消息队列中,⼀个消息只能被⼀个客户端获取,在 MQTT 中,⼀个消息可以被多个订阅者获取,MQTT 协议也不⽀持指定消
息被单⼀的客户端获取。
是异步的,发送⽅不需要等待接收⽅应答。
2.MQTT报⽂格式
2.1 MQTT控制报⽂的结构 Structure of an MQTT Control Packet
MQTT协议通过交换预定义的MQTT控制报⽂来通信。这⼀节描述这些报⽂的格式。
MQTT控制报⽂由三部分组成,按照 描述的顺序:
图例 2.1 –MQTT控制报⽂的结构
Fixed header固定报头,所有控制报⽂都包含
Variable header可变报头,部分控制报⽂包含
Payload有效载荷,部分控制报⽂包含
2.2 固定报头 Fixed header
每个MQTT控制报⽂都包含⼀个固定报头。 描述了固定报头的格式。
图例 2.2 -固定报头的格式
Bit76543210 byte 1MQTT控制报⽂的类型⽤于指定控制报⽂类型的标志位
Bit76543210 byte 2…剩余长度
2.2.1 MQTT控制报⽂的类型 MQTT Control Packet type
**位置:**第1个字节,⼆进制位7-4。
表⽰为4位⽆符号值,这些值的定义见
表格 2.1 -控制报⽂的类型
名字值报⽂流动⽅向描述
Rerved0禁⽌保留
CONNECT1客户端到服务端客户端请求连接服务端
CONNACK2服务端到客户端连接报⽂确认
PUBLISH3两个⽅向都允许发布消息
PUBACK4两个⽅向都允许QoS 1消息发布收到确认
PUBREC5两个⽅向都允许发布收到(保证交付第⼀步)
PUBREL6两个⽅向都允许发布释放(保证交付第⼆步)
PUBCOMP7两个⽅向都允许QoS 2消息发布完成(保证交互第三步)za眼霜
SUBSCRIBE8客户端到服务端客户端订阅请求
SUBACK9服务端到客户端订阅请求报⽂确认UNSUBSCRIBE10客户端到服务端客户端取消订阅请求
UNSUBACK11服务端到客户端取消订阅报⽂确认
PINGREQ12客户端到服务端⼼跳请求
PINGRESP13服务端到客户端⼼跳响应
DISCONNECT14客户端到服务端客户端断开连接
Rerved15禁⽌保留
2.2.2 标志 Flags
固定报头第1个字节的剩余的4位 [3-0]包含每个MQTT控制报⽂类型特定的标志,见 。表格 2.2中任何标记为“保留”的标志位,都是保留给以后使⽤的,必须设置为表格中列出的值 [MQTT-2.2.2-1]。如果收到⾮法的标志,接收者必须关闭⽹络连接。有关错误处理的详细信息见 4.8节 [MQTT-2.2.2-2]。
传染性疾病有哪些
表格 2.2 - 标志位 Flag Bits
控制报⽂固定报头标志Bit 3Bit 2Bit 1Bit 0
CONNECT Rerved0000
CONNACK Rerved0000
PUBLISH Ud in MQTT 3.1.1DUP1QoS2QoS2RETAIN3
PUBACK Rerved0000
PUBREC Rerved0000
PUBREL Rerved0010
PUBCOMP Rerved0000
SUBSCRIBE Rerved0010
控制报⽂固定报头标志Bit 3Bit 2Bit 1Bit 0
SUBACK Rerved0000 UNSUBSCRIBE Rerved0010
UNSUBACK Rerved0000
PINGREQ Rerved0000
PINGRESP Rerved0000
DISCONNECT Rerved0000 DUP1 =控制报⽂的重复分发标志
骨干教师培养计划QoS2 = PUBLISH报⽂的服务质量等级
RETAIN3 = PUBLISH报⽂的保留标志
从固定头的第 2 字节开始是⽤于标识 MQTT 数据包长度的字段,最少⼀个字节,最⼤四个字节,每⼀个字节的低 7 位⽤于标识值,范围为0~127。最⾼位的 1 位是标识位,⽤来说明是否有后续字节来标识长度。例如:标识为 0,代表为没有后续字节;标识为 1,代表后续还有⼀个字节⽤于标识包长度。MQTT 协议规定最多可以⽤四个字节来标识包长度。
所以这四个字节最多可以标识的包长度为:(0xFF, 0xFF, 0xFF, 0x7F) = 268435455 字节,约 256M,这个是 MQTT 协议中数据包的最⼤长度。
2.3 可变报头 Variable header股份是什么意思
某些MQTT控制报⽂包含⼀个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报⽂类型的不同⽽不同。可变报头的报⽂标识符(Packet Identifier)字段存在于在多个类型的报⽂⾥。
2.3.1 报⽂标识符 Packet Identifier
图例 2.3 -报⽂标识符字节 Packet Identifier bytes
Bit7 - 0
byte 1报⽂标识符 MSB
byte 2报⽂标识符 LSB李世民是什么生肖
很多控制报⽂的可变报头部分包含⼀个两字节的报⽂标识符字段。这些报⽂是PUBLISH(QoS > 0时),
PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE, SUBACK,UNSUBSCRIBE,UNSUBACK。
SUBSCRIBE,UNSUBSCRIBE和PUBLISH(QoS⼤于0)控制报⽂必须包含⼀个⾮零的16位报⽂标识符(Packet Identifier)[MQTT-2.3.1-1]。客户端每次发送⼀个新的这些类型的报⽂时都必须分配⼀个当前未使⽤的报⽂标识符 [MQTT-2.3.1-2]。如果⼀个客户端要重发这个特殊的控制报⽂,在随后重发那个报⽂时,它必须使⽤相同的标识符。当客户端处理完这个报⽂对应的确认后,这个报⽂标识符就释放可重⽤。QoS 1的PUBLISH对应的是PUBACK,QoS 2的PUBLISH对应的是PUBCOMP,与SUBSCRIBE或UNSUBSCRIBE对应的分别是SUBACK或UNSUBACK [MQTT-2.3.1-3]。发送⼀个QoS 0的PUBLISH报⽂时,相同的条件也适⽤于服务端 [MQTT-2.3.1-4]。
QoS等于0的PUBLISH报⽂不能包含报⽂标识符 [MQTT-2.3.1-5]。
PUBACK, PUBREC, PUBREL报⽂必须包含与最初发送的PUBLISH报⽂相同的报⽂标识符 [MQTT-2.
3.1-6]。类似地,SUBACK和UNSUBACK必须包含在对应的SUBSCRIBE和UNSUBSCRIBE报⽂中使⽤的报⽂标识符 [MQTT-2.3.1-7]。
需要报⽂标识符的控制报⽂在 中列出。
表格 2.5 -包含报⽂标识符的控制报⽂ Control Packets that contain a Packet Identifier
控制报⽂报⽂标识符字段
CONNECT不需要
CONNACK不需要
PUBLISH需要(如果QoS > 0)
控制报⽂报⽂标识符字段
PUBACK需要
PUBREC需要
PUBREL需要
PUBCOMP需要
SUBSCRIBE需要
SUBACK需要
UNSUBSCRIBE需要
UNSUBACK需要
PINGREQ不需要
PINGRESP不需要
DISCONNECT不需要
老北京土话大全客户端和服务端彼此独⽴地分配报⽂标识符。因此,客户端服务端组合使⽤相同的报⽂标识符可以实现并发的消息交换。
⾮规范评注
客户端发送标识符为0x1234的PUBLISH报⽂,它有可能会在收到那个报⽂的PUBACK之前,先收到服务端发送的另⼀个不同的但是报⽂标识符也为0x1234的PUBLISH报⽂。
Client Server
PUBLISH Packet Identifier=0x1234—
–PUBLISH Packet Identifier=0x1234
PUBACK Packet Identifier=0x1234—
–PUBACK Packet Identifier=0x1234
2.4 有效载荷 Payload
某些MQTT控制报⽂在报⽂的最后部分包含⼀个有效载荷,这将在第三章论述。对于PUBLISH来说有效载荷就是应⽤消息。 列出了需要有效载荷的控制报⽂。
表格 2.6 – 包含有效载荷的控制报⽂ Control Packets that contain a Payload
控制报⽂有效载荷
CONNECT需要
CONNACK不需要
PUBLISH可选
职工小家
PUBACK不需要
PUBREC不需要
PUBREL不需要
PUBCOMP不需要
SUBSCRIBE需要
SUBACK需要
UNSUBSCRIBE需要控制报⽂有效载荷UNSUBACK不需要
PINGREQ不需要
PINGRESP不需要
DISCONNECT不需要