MQTT 控制报文格式总览(OASIS)
依据正式标准整理(学习用中文详解,不替代原文):
MQTT Version 5.0 OASIS Standard,2019-03-07
https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html
对应规范章节:§2 MQTT Control Packet format、§3 MQTT Control Packets
兼容阅读:MQTT 3.1.1 https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html
下文默认描述 MQTT 5.0;与 3.1.1 差异会单独标注。
1. 控制报文三段式结构(§2.1)
每个 MQTT Control Packet 由三部分组成:
1 | ┌──────────────────┬─────────────────────┬─────────────┐ |
| 部分 | 是否必须 | 内容 |
|---|---|---|
| Fixed Header | 必须 | 报文类型、标志、剩余长度 |
| Variable Header | 多数报文有 | Packet Identifier、属性、主题名等 |
| Payload | 部分报文有 | ClientID、Will、用户名密码、订阅列表、应用消息等 |
2. Fixed Header(§2.1.1)
最少 2 字节(当 Remaining Length < 128 时):
1 | Byte 1 Byte 2… |
2.1 报文类型(§2.1.2)
| 值 | 报文 | 方向 | 说明 |
|---|---|---|---|
| 1 | CONNECT | C→S | 连接请求(连接后第一包必须是 CONNECT [MQTT-3.1.0-1]) |
| 2 | CONNACK | S→C | 连接确认 |
| 3 | PUBLISH | 双向 | 发布 |
| 4 | PUBACK | 双向 | QoS1 确认 |
| 5 | PUBREC | 双向 | QoS2 第 1 步 |
| 6 | PUBREL | 双向 | QoS2 第 2 步 |
| 7 | PUBCOMP | 双向 | QoS2 第 3 步 |
| 8 | SUBSCRIBE | C→S | 订阅 |
| 9 | SUBACK | S→C | 订阅确认 |
| 10 | UNSUBSCRIBE | C→S | 取消订阅 |
| 11 | UNSUBACK | S→C | 取消确认 |
| 12 | PINGREQ | C→S | 心跳请求 |
| 13 | PINGRESP | S→C | 心跳响应 |
| 14 | DISCONNECT | 双向(5.0) | 断开 |
| 15 | AUTH | 双向(仅 5.0) | 增强认证 |
2.2 Flags(bit3–0)
多数报文 Flags 必须为 0(规范强制位)。例外:
| 报文 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|
| PUBLISH | DUP | QoS MSB | QoS LSB | RETAIN |
| PUBREL / SUBSCRIBE / UNSUBSCRIBE | 0 | 0 | 1 | 0 |
错误 Flags → 协议错误,对端应关闭网络连接(规范行为)。
3. Remaining Length(§2.1.4)
对 Variable Header + Payload 的字节数做 Variable Byte Integer 编码(1~4 字节):
| 编码字节数 | 可表示最大值 |
|---|---|
| 1 | 127(0x7F) |
| 2 | 16 383 |
| 3 | 2 097 151 |
| 4 | 268 435 455 |
算法要点:每字节低 7 位为数据,最高位为续传标志。
4. 基本数据类型(§1.5 / §2.2)
| 类型 | 编码 |
|---|---|
| Byte | 1 字节 |
| Two Byte Integer | 大端 16-bit |
| Four Byte Integer | 大端 32-bit |
| Variable Byte Integer | 同上 Remaining Length 算法 |
| UTF-8 Encoded String | 2 字节长度(大端)+ UTF-8 字节 |
| Binary Data | 2 字节长度 + 二进制 |
| Properties(仅 5.0) | Property Length + 属性列表 |
字符串不得含 U+0000;规范对部分字段还有格式约束。
5. Properties(MQTT 5,§2.2.2)
可变报头中可出现属性区:
1 | ┌──────────────────┬────────────────────────────────┐ |
每个 Property = Identifier(1 字节) + 类型对应的 Value。
标识符示例(完整表见 15):
| ID | 名称 | 常见出现处 |
|---|---|---|
| 0x11 | Session Expiry Interval | CONNECT / CONNACK |
| 0x21 | Receive Maximum | CONNECT / CONNACK |
| 0x27 | Maximum Packet Size | CONNECT / CONNACK |
| 0x22 | Topic Alias Maximum | CONNECT / CONNACK |
| 0x23 | Topic Alias | PUBLISH |
| 0x08 | Response Topic | PUBLISH / Will |
| 0x09 | Correlation Data | PUBLISH / Will |
| 0x26 | User Property | 多处 |
| 0x1F | Reason String | CONNACK / PUBACK / DISCONNECT… |
3.1.1 无 Properties。
6. Packet Identifier(§2.2.1)
- 两字节大端整数,非零
- QoS > 0 的 PUBLISH,以及 PUBACK/PUBREC/PUBREL/PUBCOMP、SUBSCRIBE/SUBACK、UNSUBSCRIBE/UNSUBACK 使用
- QoS0 PUBLISH、CONNECT、CONNACK、PING、部分 DISCONNECT 无 Packet Identifier
7. Reason Code(MQTT 5,§2.4)
确认/断开类报文可带 1 字节 Reason Code,比 3.1.1 的粗粒度返回码细得多。0x00 通常表示成功。目录见 15。
8. 文档地图(官方 §3 对照)
| 本库文档 | 覆盖 OASIS 章节 |
|---|---|
| 11-CONNECT与CONNACK报文格式.md | §3.1~3.2 |
| 12-PUBLISH与QoS握手报文格式.md | §3.3~3.7 |
| 13-SUBSCRIBE与UNSUBSCRIBE报文格式.md | §3.8~3.11 |
| 14-PING-DISCONNECT-AUTH报文格式.md | §3.12~3.15 |
| 15-Reason-Code与Properties目录.md | §2.2.2、§2.4 及各报文 Reason |
工程概念篇仍见 00~04;本系列专注比特/字节级官方控制报文。
正在加载留言…