乐闻世界logo
搜索文章和话题

MQTT 协议有哪些控制报文类型?各自的作用是什么?

2月19日 19:17

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 流程

shell
Client ──PUBLISH──> Broker

QoS 1 流程

shell
Client ──PUBLISH──> Broker Client <─PUBACK─── Broker

QoS 2 流程

shell
Client ──PUBLISH──> Broker Client <─PUBREC─── Broker Client ──PUBREL──> Broker Client <─PUBCOMP── Broker

报文类型总结

报文类型方向QoS说明
CONNECT客户端 → Broker-建立连接
CONNACKBroker → 客户端-连接确认
PUBLISH双向0/1/2发布消息
PUBACK双向1发布确认
PUBREC双向2发布收到
PUBREL双向2发布释放
PUBCOMP双向2发布完成
SUBSCRIBE客户端 → Broker-订阅主题
SUBACKBroker → 客户端-订阅确认
UNSUBSCRIBE客户端 → Broker-取消订阅
UNSUBACKBroker → 客户端-取消确认
PINGREQ客户端 → Broker-心跳请求
PINGRESPBroker → 客户端-心跳响应
DISCONNECT客户端 → Broker-断开连接

理解 MQTT 控制报文类型和流程对于实现 MQTT 客户端和服务器至关重要。

标签:MQTT