MQTT 协议定义了多种控制报文类型,每种报文都有特定的功能和格式。以下是 MQTT 协议的主要控制报文及其作用。
MQTT 控制报文类型
1. CONNECT - 连接请求
- 方向:客户端 → Broker
- 作用:客户端向 Broker 请求建立连接
- 关键参数:
- Client ID:客户端唯一标识符
- Clean Session:是否清除之前的会话状态
- Keep Alive:心跳间隔(秒)
- Username/Password:认证信息
- Will Message:遗嘱消息(客户端异常断开时发送)
- 响应:CONNACK
2. CONNACK - 连接确认
- 方向:Broker → 客户端
- 作用:确认连接是否成功建立
- 关键参数:
- Session Present:是否包含之前的会话状态
- Return Code:连接结果(0 表示成功)
- 返回码示例:
- 0:连接成功
- 1:协议版本不支持
- 2:客户端 ID 不合法
- 3:服务器不可用
- 4:用户名或密码错误
- 5:未授权
3. PUBLISH - 发布消息
- 方向:双向(客户端 ↔ Broker)
- 作用:发布消息到指定主题
- 关键参数:
- Topic Name:主题名称
- Packet Identifier:数据包标识符(QoS 1/2)
- QoS:服务质量级别(0/1/2)
- DUP:是否重复发送
- Retain:是否保留消息
- Payload:消息内容
- 响应:
- QoS 0:无响应
- QoS 1:PUBACK
- QoS 2:PUBREC → PUBREL → PUBCOMP
4. PUBACK - 发布确认(QoS 1)
- 方向:接收方 → 发布方
- 作用:确认收到 QoS 1 消息
- 关键参数:
- Packet Identifier:对应的消息 ID
5. PUBREC - 发布收到(QoS 2)
- 方向:接收方 → 发布方
- 作用:确认收到 QoS 2 消息的第一阶段
- 关键参数:
- Packet Identifier:对应的消息 ID
- 响应:PUBREL
6. PUBREL - 发布释放(QoS 2)
- 方向:发布方 → 接收方
- 作用:释放 QoS 2 消息的第二阶段
- 关键参数:
- Packet Identifier:对应的消息 ID
- 响应:PUBCOMP
7. PUBCOMP - 发布完成(QoS 2)
- 方向:接收方 → 发布方
- 作用:完成 QoS 2 消息的第三阶段
- 关键参数:
- Packet Identifier:对应的消息 ID
8. SUBSCRIBE - 订阅主题
- 方向:客户端 → Broker
- 作用:订阅一个或多个主题
- 关键参数:
- Packet Identifier:数据包标识符
- Topic Filter:主题过滤器(支持通配符)
- QoS:订阅的 QoS 级别
- 响应:SUBACK
9. SUBACK - 订阅确认
- 方向:Broker → 客户端
- 作用:确认订阅结果
- 关键参数:
- Packet Identifier:对应的 SUBSCRIBE 消息 ID
- Return Codes:每个主题的订阅结果
- 返回码示例:
- 0-2:成功(QoS 级别)
- 128:订阅失败
10. UNSUBSCRIBE - 取消订阅
- 方向:客户端 → Broker
- 作用:取消订阅一个或多个主题
- 关键参数:
- Packet Identifier:数据包标识符
- Topic Filter:要取消的主题过滤器
- 响应:UNSUBACK
11. UNSUBACK - 取消订阅确认
- 方向:Broker → 客户端
- 作用:确认取消订阅
- 关键参数:
- Packet Identifier:对应的 UNSUBSCRIBE 消息 ID
12. PINGREQ - 心跳请求
- 方向:客户端 → Broker
- 作用:检测连接是否活跃
- 触发条件:Keep Alive 时间的一半
- 响应:PINGRESP
13. PINGRESP - 心跳响应
- 方向:Broker → 客户端
- 作用:响应心跳请求,确认连接正常
- 响应时间:通常在 1 秒内
14. DISCONNECT - 断开连接
- 方向:客户端 → Broker
- 作用:主动断开连接
- 特点:
- 正常断开,不发送遗嘱消息
- Broker 清除客户端状态(Clean Session = true)
控制报文格式
固定头部(Fixed Header)
所有 MQTT 控制报文都包含固定头部:
shell+-----------------+------------------+ | Control Type | Flags | | (4 bits) | (4 bits) | +-----------------+------------------+ | Remaining Length (Variable) | +-------------------------------------+
- Control Type:控制报文类型(1-14)
- Flags:标志位,根据报文类型有不同的含义
- Remaining Length:剩余长度(可变长度编码)
可变头部(Variable Header)
某些报文包含可变头部,包含报文特定的信息:
- Packet Identifier
- Topic Name
- Properties(MQTT 5.0)
有效载荷(Payload)
某些报文包含有效载荷:
- PUBLISH:消息内容
- CONNECT:客户端信息
- SUBSCRIBE:订阅列表
QoS 级别与报文流程
QoS 0 流程
shellClient ──PUBLISH──> Broker
QoS 1 流程
shellClient ──PUBLISH──> Broker Client <─PUBACK─── Broker
QoS 2 流程
shellClient ──PUBLISH──> Broker Client <─PUBREC─── Broker Client ──PUBREL──> Broker Client <─PUBCOMP── Broker
报文类型总结
| 报文类型 | 方向 | QoS | 说明 |
|---|---|---|---|
| CONNECT | 客户端 → Broker | - | 建立连接 |
| CONNACK | Broker → 客户端 | - | 连接确认 |
| PUBLISH | 双向 | 0/1/2 | 发布消息 |
| PUBACK | 双向 | 1 | 发布确认 |
| PUBREC | 双向 | 2 | 发布收到 |
| PUBREL | 双向 | 2 | 发布释放 |
| PUBCOMP | 双向 | 2 | 发布完成 |
| SUBSCRIBE | 客户端 → Broker | - | 订阅主题 |
| SUBACK | Broker → 客户端 | - | 订阅确认 |
| UNSUBSCRIBE | 客户端 → Broker | - | 取消订阅 |
| UNSUBACK | Broker → 客户端 | - | 取消确认 |
| PINGREQ | 客户端 → Broker | - | 心跳请求 |
| PINGRESP | Broker → 客户端 | - | 心跳响应 |
| DISCONNECT | 客户端 → Broker | - | 断开连接 |
理解 MQTT 控制报文类型和流程对于实现 MQTT 客户端和服务器至关重要。