二进制数(Binary Data)

Binary Data: 2字节整数,后接实际字节数, 0-65535.

1.5.7 UTF-8 String pair

UTF-8 String pair 包括两个UTF-8编码字符串,用于保存name-value对。

2 MQTT Control Packet format

2.1 Structure of an MQTT Control Packet

mqtt5.0-- - 图1

2.1.2 MQTT Control Packet type

2.1.4 Remaining Length

位置: 其实 2.

剩余长度为:可变字节长度,代表当前控制包中可变头和负荷数据的长度,其不包括自身的编码长度。

包总长度等于固定头长度加剩余长度

2.2 Variable Header

可变头存在于部分mqtt控制包中,可变头总通常 包含包标识。

2.2.1 Packet Identifier

需要包标识的控制包如下:

mqtt5.0-- - 图2

  • QoS等级0的PUBLISH包不可包含包标识。
  • 每次客户发送一个新的QoS等级大于0的,SUBSCRIBE,UNSUBSCRIBE,PUBLISH控制包,其必须包含一个当前为使用的非0包标识。
  • 每次服务端发送一个新PUBLISH(QoS >0)控制包,它必须分配一个未使用的非0控包标识。
  • PUBACK, PUBREC, PUBCOMP包标识,必须与PUBLISH发送的包标识一致。
  • 客服端和服务端包标识互相独立,因此客户端—服务端对在共存消息交换中可使用相同的包标识。
  • 当客户端发送标识0x1234, 在其接受到服务端的PUACK前,然可能接收到一个从服务端发出的标识为0x1234的PUBLISH控制包。

2.2.2 Properties

最后可变头域是一组属性,包含在CONNECT , CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK, DISCONNECT, AUTH包中。

2.2.2.1 Property Length

属性长度为可变长度整数,属性长度不包括其本身,如果无属性,必须置0。

尽管属性标识定义为可变长度字节,本版本规范所有属性仍然为0字节长。

2.2.2.2 Property

属性包括一个定义用途和数据类型的标识,然后是值。标识为可变字节整数。

  • 标识控制包类型不一致的,或包括非法数据类型的控制包为非法包,如果接收,使用包含消息码(0x81)CONNACK或DISCONNECT包进行错误处理。

mqtt5.0-- - 图3

mqtt5.0-- - 图4

mqtt5.0-- - 图5

2.3 Payload

一些控制包包括负荷数据作为包的最后一部分,在PUBLISH包中,即为应用消息。

mqtt5.0-- - 图6

2.4 Reason Code

消息码,1字节无符号数,标识所有操作的结果。小于0x80的消息码表示操作成功,标识成功常用消息码值为0,大于等于0x80标识失败。

CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, DISCONNECT and AUTH Control包中在可变头中包括1字节的消息码。 SUBACK和UNSUBACK在负荷中包括一个或多个消息码。

mqtt5.0-- - 图7