MQTT 控制报文格式总览(OASIS)

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
2
3
4
┌──────────────────┬─────────────────────┬─────────────┐
│ Fixed Header │ Variable Header │ Payload │
│ (固定报头) │ (可变报头,可缺省) │ (载荷,可缺省)│
└──────────────────┴─────────────────────┴─────────────┘
部分 是否必须 内容
Fixed Header 必须 报文类型、标志、剩余长度
Variable Header 多数报文有 Packet Identifier、属性、主题名等
Payload 部分报文有 ClientID、Will、用户名密码、订阅列表、应用消息等

2. Fixed Header(§2.1.1)

最少 2 字节(当 Remaining Length < 128 时):

1
2
3
4
5
 Byte 1                         Byte 2…
┌────────────┬────────────────┬─────────────────────────┐
│ MQTT Type │ Flags │ Remaining Length │
│ (bit7-4) │ (bit3-0) │ (1~4 字节可变编码) │
└────────────┴────────────────┴─────────────────────────┘

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
2
3
4
┌──────────────────┬────────────────────────────────┐
│ Property Length │ Property1 │ Property2 │ … │
│ (Var Byte Int) │ id+value │ … │
└──────────────────┴────────────────────────────────┘

每个 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

工程概念篇仍见 0004;本系列专注比特/字节级官方控制报文

下一篇:11-CONNECT与CONNACK报文格式.md

文章互动

阅读 --

留言

0 条留言

正在加载留言…