转战物联网・基础篇07-深入理解MQTT协议之控制报文(数据包)格式

匿名 (未验证) 提交于 2019-12-02 23:51:01

结构名 中文名 解释说明
Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分
Variable header 可变报头 固定报文的附加部分,有些报文没有这个部分
Payload 有效载荷 需要携带的信息内容,有些报文没有这个部分


Bit(位号)76543210
Byte1(第一个字节) 组合代表MQTT控制报文(数据包)的类型 控制报文的标志位(Flags),可理解为一种属性参数
Byte2(第二个字节起) 剩余长度,当前报文剩余部分的字节数,包括可变报头和有效负载

7-4号位 十进制值 报文类型 报文允许发起方向 报文描述
0000 0 Reserved 禁止 保留,不可用
0001 1 CONNECT 客户端请求连接到服务端的代理服务
0010 2 CONNACK 连接请求的回复确认报文
0011 3 PUBLISH 客户端←→服务端 发布主题消息
0100 4 PUBACK 客户端←→服务端 发布确认,是QoS=1时,对 PUBLISH 的响应确认
0101 5 PUBREC 客户端←→服务端 发布收到,是QoS=2时,对 PUBLISH 的响应确认,是QoS=2实现的第一步
0110 6 PUBREL 客户端←→服务端 发布释放,是QoS=2时,对 PUBREC 的响应确认,是QoS=2实现的第二步
0111 7 PUBCOMP 客户端←→服务端 发布完成,是QoS=2时,对 PUBREL 的响应确认,是QoS=2实现的第三步
1000 8 SUBSCRIBE 客户端订阅主题,可一次订阅一个或多个主题(使用通配符)
1001 9 SUBACK 订阅完成确认,是对 SUBSCRIBE 的响应确认
1010 10 UNSUBSCRIBE 取消订阅,客户端发起的取消对某个主题的订阅
1011 11 UNSUBACK 取消订阅确认,是对 UNSUBSCRIBE 的响应确认
1100 12 PINGREQ 心跳,表示这个数据包是为通知服务端客户端还在正常连接着
1101 13 PINGRESP 心跳响应,表示服务端已经成功收到了客户端的心跳
1110 14 DISCONNECT 断开连接,客户端通知服务端,需要断开当前网络连接
1111 15 Reserved 禁止 保留,不可用

报文类型 标志类型 Bit3 Bit2 Bit1 Bit0
CONNECT 保留 0 0 0 0
CONNACK 保留 0 0 0 0
PUBLISH 使用 是否为重复发 服务质量高位 服务质量低位 是否保存消息
PUBACK 保留 0 0 0 0
PUBREC 保留 0 0 0 0
PUBREL 保留 0 0 1 0
PUBCOMP 保留 0 0 0 0
SUBSCRIBE 保留 0 0 1 0
SUBACK 保留 0 0 0 0
UNSUBSCRIBE 保留 0 0 1 0
UNSUBACK 保留 0 0 0 0
PINGREQ 保留 0 0 0 0
PINGRESP 保留 0 0 0 0
DISCONNECT 保留 0 0 0 0

报文类型 标志作用 二进制值 10进制值 16进制值
CONNECT 连接服务端 00010000 16 0x10
CONNACK 连接成功确认 00100000 32 0x20
PUBLISH 新发布等级0不保存 00110000 48 0x30
PUBLISH 新发布等级0需保存 00110001 49 0x31
PUBLISH 新发布等级1不保存 00110010 50 0x32
PUBLISH 新发布等级1需保存 00110011 51 0x33
PUBLISH 新发布等级2不保存 00110100 52 0x34
PUBLISH 新发布等级2需保存 00110001 53 0x35
PUBLISH 重发等级2不保存 00111000 56 0x38
PUBLISH 重发等级2需保存 00111001 57 0x39
PUBACK 等级1发布成功 01000000 64 0x40
PUBREC 等级2发布收到 01010000 80 0x50
PUBREL 等级2发布释放 01100010 98 0x62
PUBCOMP 等级2发布完成 01110000 112 0x70
SUBSCRIBE 订阅主题 10000010 130 0x82
SUBACK 订阅完成确认 10010000 144 0x90
UNSUBSCRIBE 取消订阅 10100010 162 0xA2
UNSUBACK 取消完成确认 10110000 176 0xB0
PINGREQ 心跳包 11000000 192 0xC0
PINGRESP 心跳回复 11010000 208 0xD0
DISCONNECT 断开网络连接 11100000 224 0xE0

7号位 6-0号位
0 1111001
接下来没有剩余长度字节了 剩余长度是:121

1字节7号位 1字节6-0号位 2字节7号位 2字节6-0号位
1 1100011 0 1111100
后面还有字节描述长度 本子节描述长度:99 后面没有长度字节了 本字节描述长度:124 * 128 = 15872


1字节7号位 1字节6-0号位 2字节7号位 2字节6-0号位 3字节7号位 3字节6-0号位
1 1111110 1 1111111 0 1111111
还有长度字节 长度:126 还有长度字节 长度:127 * 128 = 16256 长度最后字节 长度:127 * 16384 = 2080768

字节数 最小值10/16进制 最小值2进制 最大值10/16进制 最大值2进制
1 0(0x00) 00000000 127(0x7F) 01111111
2 128(0x80,0x01) 10000000 00000001 16383(0xFF,0x7F) 11111111 01111111
3 16384(0x80,0x80,0x01) 10000000 10000000 00000001 2097151(0xFF,0xFF,0x7F) 11111111 11111111 01111111
4 2097152(0x80,0x80,0x80,0x01) 10000000 10000000 10000000 00000001 268435455(0xFF,0xFF,0xFF,0x7F) 11111111 11111111 11111111 01111111


在一些需要携带用户自定义的应用消息的MQTT控制报文中,会将这些信息放在报文的最后部分,称之为有效载荷。对于PUBLISH来说有效载荷就是应用消息。不同的控制报文有效载荷内容不同,后面会在分别介绍控制报文时具体讨论。下表列出哪些控制报文有包含有效载荷:

控制报文 有效载荷
CONNECT 需要
CONNACK 不 需要
PUBLISH 可选,可以零长度
PUBACK 不需要
PUBREC 不需要
PUBREL 不需要
PUBCOMP 不需要
SUBSCRIBE 需要
SUBACK 需要
UNSUBSCRIBE 需要
UNSUBACK 不需要
PINGREQ 不需要
PINGRESP 不需要
DISCONNECT 不需要

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!