packets(packets nearby)

2024-08-2001:13:43综合资讯0

MQTT 控制报文:MQTT 数据传输的基石
MQTT 控制报文是 MQTT 协议的核心组成部分,用于在 MQTT 客户端和服务器之间传输数据。通过交换这些报文,客户端可以订阅主题、发布消息并进行其他操作。
目前已定义了 15 种 MQTT 控制报文,可按功能分为以下三大类:
1. 连接控制报文:
这些报文负责建立和终止 MQTT 会话。
CONNECT:客户端用于向服务器发起连接。
CONNACK:服务器对 CONNECT 报文的响应。
DISCONNECT:结束连接。
2. 消息控制报文:
用于发布和接收 MQTT 消息。
PUBLISH:发布 MQTT 消息。
PUBACK/PUBREC/PUBREL/PUBCOMP:QoS 2 消息确认。
3. 会话控制报文:
管理客户端与服务器之间的连接。
SUBSCRIBE:订阅主题。
UNSUBSCRIBE:取消订阅主题。
SUBACK/UNSUBACK:返回订阅/取消订阅的结果。
MQTT 控制报文结构:
MQTT 控制报文由三个部分组成:
固定报头:始终存在于所有报文中。
可变报头:根据报文类型而定,存在于某些报文中。
有效载荷:可选,随报文类型而异。
固定报头:
固定报头包含以下信息:
报文类型:标识报文类型。
标识位:仅在 PUBLISH 报文中包含特定含义的位。
报文剩余长度:可变字节整数,指示剩余部分的字节数。
可变报头和有效载荷:
这些部分的内容取决于报文类型。
例如,PINGREQ 报文仅包含固定报头,而 PUBLISH 报文则包含所有三个部分。
可变字节整数:
为了提高效率,MQTT 使用可变字节整数表示剩余长度,该整数具有以下特性:
低 7 位表示数据。
最高位指示是否还有后续字节。
最大长度为 4 字节,支持最大 256 MB 的数据。

packets(packets nearby)

MQTT 报文中的可变报头是报文的核心部分,它包含了不同报文类型特有的字段,例如连接标识、主题名、报文标识符等。这些字段的顺序和内容都严格遵循 MQTT 协议规范,确保接收端能够正确解析报文。

packets(packets nearby)

例如,CONNECT 报文的可变报头包含协议名、协议级别、连接标识、Keep Alive 和属性等字段;PUBLISH 报文的可变报头则包含主题名、报文标识符和属性等字段。每个字段的顺序和内容都必须符合协议定义,否则会导致报文解析失败。

packets(packets nearby)

MQTT 5.0 引入了属性的概念,属性实际上是可变报头的最后一部分,由属性长度和紧随其后的一组属性组成。属性长度指的是所有属性的总长度。属性都是可选的,因为它们通常都有默认值。如果没有任何属性,属性长度的值则为 0。

packets(packets nearby)

每个属性由一个标识符和具体的值组成。标识符定义了属性的用途和数据类型。属性的数据类型可能不同,例如双字节长度的整数或 UTF-8 编码的字符串。属性之间的顺序可以是任意的,因为我们可以根据标识符识别属性和长度。

属性通常用于某个特定目的,比如 CONNECT 报文中的 Session Expiry Interval 属性用于设置会话过期时间。MQTT 协议严格定义了属性的使用范围,一个合法的 MQTT 控制报文中不应该包含不属于它的属性。

有关完整的 MQTT 属性列表,包括标识符、属性名、数据类型和使用范围,请参阅 MQTT 5.0 Specification - Properties。

除了可变报头,MQTT 报文还包含一个有效载荷部分。可变报头可以看作是报文的附加信息,而有效载荷部分则用于实现报文的核心目的。

例如,在 PUBLISH 报文中,Payload 用于承载具体的应用消息内容,这是 PUBLISH 报文的主要功能。PUBLISH 报文中的 QoS、Retain 等字段则是在应用消息的基础上提供额外的能力。

SUBSCRIBE 报文也是如此,Payload 包含了想要订阅的主题以及对应的订阅选项,这是 SUBSCRIBE 报文最主要的任务。