MQTT控制包格式
本文主要介绍控制包的组成框架和格式,而每种控制包的细节内容将在后文学习
总体结构
MQTT协议通过以定义的方式交换一系列MQTT控制包来工作
至多有三个部分,至少有一个部分,它们的相对顺序固定
英文名称 | 中文名称 | 介绍 |
---|---|---|
Fixed header | 固定报头 | 所有数据包 |
Variable header | 可变报头 | 部分数据包 |
Payload | 有效负载 | 部分数据包 |
1. 固定报头
格式
-
控制包类型
位于byte1的bit[4:7]Name Vaule Direction of flow Description Reserved 0 禁用 保留 CONNECT 1 C2S1 客户端请求连接 CONNACK 2 S2C2 服务器连接应答 PUBLISH 3 C2S/S2C 发布消息 PUCACK 4 C2S/S2C 发布应答 PUBREC 5 C2S/S2C 发布接受(保证交付的第一部分) PUBREL 6 C2S/S2C 发布(保证交付的第二部分) PUBCOMP 7 C2S/S2C 发布完成(保证交付的第三部分) SUBSCRIBE 8 C2S 客户端请求订阅 SUBACK 9 S2C 服务器订阅应答 UNSUBSCRIBE 10 C2S 客户端请求取消订阅 UNSUBACK 11 S2C 服务器取消订阅应答 PINGREQ 12 C2S 客户端请求PING PINGRESP 13 S2C 服务器回应PING DISCONNECT 14 C2S 客户端请求断开连接 Reserverd 15 禁用 保留 -
标志位
位于byte1的bit[3:0]
每个控制包类型对应的标志位必须如下表所示,否则接收方必须关闭网络连接控制包 可变头标志 Bit 3 Bit 2 Bit 1 Bit 0 CONNECT 保留 0 0 0 0 CONNACK 保留 0 0 0 0 PUBLISH 在3.1.1中使用 DUP3 QoS4 QoS4 RETAIN5 PUCACK 保留 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 -
剩余长度
剩余长度=可变报头长度+有效载荷长度(单位为Byte)
采用变长编码:- 字节长度可变,每一个字节代表一个数位(Digits),第n个数位的权值为128^n(相当于128进制数)
- 单个字节的bit[6:0]表示值,取值范围0~127,bit 7用来指示是否还有更高数位
Digits From To 1 0(0x00) 127(0x7F) 2 128=0x1+1x128(0x80,0x01) 16383=127x1+127x128(0xFF,0x7F) 3 16384=(0x1)+(0x128)+(1x128^2) (0x80, 0x80, 0x01) 2097151=(127x1)+(127x128)+(127x128^2) (0xFF, 0xFF, 0x7F) … … …
2. 可变报头
部分控制包需要2 byte的控制包标识符(Packet Identifier)作为可变报头
控制包 | 标识符 |
---|---|
CONNECT | 无 |
CONNACK | 无 |
PUBLISH | (QoS>0时)有 |
PUCACK | 有 |
PUBREC | 有 |
PUBREL | 有 |
PUBCOMP | 有 |
SUBSCRIBE | 有 |
SUBACK | 有 |
UNSUBSCRIBE | 有 |
UNSUBACK | 有 |
PINGREQ | 无 |
PINGRESP | 无 |
DISCONNECT | 无 |
3. 有效载荷
一些控制包的最后一个部分是有效载荷如下表
对于PUBLISH控制包,有效载荷就是应用消息
控制包 | 有效载荷 |
---|---|
CONNECT | 需要 |
CONNACK | 无 |
PUBLISH | 可选 |
PUCACK | 无 |
PUBREC | 无 |
PUBREL | 无 |
PUBCOMP | 无 |
SUBSCRIBE | 需要 |
SUBACK | 需要 |
UNSUBSCRIBE | 需要 |
UNSUBACK | 无 |
PINGREQ | 无 |
PINGRESP | 无 |
DISCONNECT | 无 |