MQTT 协议中 PUBLISH 和 PUBACK 介绍
1. PUBLISH 命令
功能
PUBLISH 命令用于从客户端向服务端(或反向)传输一个应用消息。它是 MQTT 协议中用于消息发布的核心命令。
语法
PUBLISH 报文由以下部分组成:
- 固定报头(Fixed Header):包含报文类型(0x03),DUP 标志(是否重复发送),QoS 等级(0, 1, 或 2),RETAIN 标志(是否保留消息),以及剩余长度(Remaining Length,表示可变报头和有效载荷的总长度)。
- 可变报头(Variable Header):包含主题名(Topic Name)和(当 QoS > 0 时)报文标识符(Packet Identifier)。
- 有效载荷(Payload):包含应用消息的实际内容。
参数
- 主题名(Topic Name):UTF-8 编码的字符串,用于标识消息要发布到的主题。
- QoS 等级:
- 0:最多分发一次。
- 1:至少分发一次。
- 2:仅分发一次。
- RETAIN 标志:如果设置为 1,则服务器会保留这个消息,以便它可以被新订阅了该主题的客户端获取。
- 报文标识符(Packet Identifier)(当 QoS > 0 时):用于在 QoS 1 和 QoS 2 的情况下,确保消息的可靠传输和处理。
- 有效载荷:实际要发布的应用消息数据。
例程
PUBLISH (QoS 1)Fixed Header:- Type: 0x03 (PUBLISH)- DUP: 0- QoS: 0x01 (QoS 1)- RETAIN: 0- Remaining Length: 根据后续内容计算Variable Header:- Topic Name: "sensor/temperature"- Packet Identifier: 0x0123Payload:- "22.5" (表示温度值为 22.5 度)// 转换为二进制(简化表示,非直接可读二进制格式)Fixed Header: 0x32 <Length>Variable Header: "sensor/temperature" 0x0123Payload: "22.5"
注意:<Length>
是剩余长度的实际计算值,它基于主题名长度、报文标识符长度和有效载荷长度的总和。
2. PUBACK 命令
功能
PUBACK 命令是服务端(或客户端,在 QoS 1 的反向通信中)对客户端发送的 QoS 1 等级的 PUBLISH 报文的接收确认。
语法
PUBACK 报文由以下部分组成:
- 固定报头(Fixed Header):包含报文类型(0x04),保留位(必须为 0),以及剩余长度(Remaining Length,对于 PUBACK,这通常是 2,因为只包含一个报文标识符)。
- 可变报头(Variable Header):包含报文标识符(Packet Identifier),与确认的 PUBLISH 报文中的报文标识符相同。
参数
- 报文标识符(Packet Identifier):与确认的 QoS 1 等级的 PUBLISH 报文中的报文标识符相匹配。
例程
PUBACKFixed Header:- Type: 0x04 (PUBACK)- Reserved: 0- Remaining Length: 0x02 (因为只包含一个 2 字节的报文标识符)Variable Header:- Packet Identifier: 0x0123 (与确认的 PUBLISH 报文中的报文标识符相同)// 转换为二进制(简化表示,非直接可读二进制格式)Fixed Header: 0x42Variable Header: 0x0123// 注意:没有有效载荷
这两个例程展示了 MQTT 协议中 PUBLISH 和 PUBACK 报文的基本用法和结构。在实际应用中,这些报文会通过 TCP/IP 连接在客户端和服务端之间传输。