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 | 无 |
- Client to Server ↩︎
- Server to Client ↩︎
- Duplicate delivery of a PUBLISH Control Packet
重复交付发布控制包 ↩︎ - PUBLISH Quality of Service
发布服务质量 ↩︎ ↩︎ - PUBLISH Retain flag
发布保持标志 ↩︎