2. MQTT控制包结构

MQTTT控制包含最多3部分,顺序如下:

MQTT系列--MQTT控制包格式 - 图1

2.1 固定头

每个控制包都包含一个固定头,如下所示:

MQTT系列--MQTT控制包格式 - 图2

2.1.1 控制包类型

Name Value 方向流 描述
保留
Reserved
0 禁止 保留
连接
CONNECT
1 客户端至服务端 连接请求
连接应答
CONNACK
2 服务端至客户端 连接确认
发布
PUBLISH
3 客户端至服务端 或
服务端至客户端
发布消息
发布应答
PUBACK
4 客户端至服务端 或
服务端至客户端
发布确认
发布接收
PUBREC
5 客户端至服务端 或
服务端至客户端
发布接收(QoS 2 part 1)
PUBREL
发布释放
6 客户端至服务端 或
服务端至客户端
发布释放(QoS 2 part 2)
发布完成
PUBCOMP
7 客户端至服务端 或
服务端至客户端
发布完成(QoS 2 part 2)
订阅
SUBSCRIBE
8 客户端至服务端 订阅请求
订阅确认
SUBACK
9 服务端至客户端 订阅确认
取消订阅
UNSUBSCRIBE
10 客户端至服务端 取消订阅请求
取消订阅确认
UNSUBACK
11 服务端至客户端 取消订阅确认
ping请求
PINGREQ
12 客户端至服务端 PING 请求
ping响应
PINGRESP
13 服务端至客户端 PING响应
断开连接
DISCONNECT
14 客户端至服务端 或
服务端至客户端
断开连接通知
授权
AUTH
15 客户端至服务端 或
服务端至客户端
授权交换

2.1.2 标记

固定头第1字节低4位包含每个控制包的特殊标识,当标识位标记为“保留”时,必须依照[MQTT-2.1.3-1]设置值。

MQTT系列--MQTT控制包格式 - 图3

MQTT系列--MQTT控制包格式 - 图4

2.1.3 剩余长度(Remaining Length)

剩余长度从第2个字节开始,为一个可变字节整数,标识当前 控制包剩余的字节数。控制包总字节为固定头+剩余长度。

2.2 可变头(Variable Header)

部分MQTT控制包包含一个可变头组件,它位于固定头和负荷数据中间。可变头的内容随着包类型变化。可变头的包标识域在部分包类型里常见。

2.2.1 包标识(Packet Identifier)

许多MQTT控制包类型的可变头组件包含一个2字节整数的包标识域。MQTT控制包如 PUBLISH(Qos > 0), PUBACK, PUBREC, PUBREL, PUBCOMP, SUBCRIBE,SUBAC, UNSBUSCRIBE, UNSUBACK 。

MQTT系列--MQTT控制包格式 - 图5

  1. 发布包OoS设置为0是,不可包含包标识符。
  2. 每次客户端发送一个新的 订阅(SUBSCRIBE),取消订阅(UNSUBSCRIBE),或 PUBLISH(QoS > 0),MQTT控制包必须分配一个当前未用的非0控制包标识号。
  3. 每次服务端发送一个新的PUBLISH(QoS > 0)控制包时,必须分配一个当前未用的非0包标识号。
  4. 包标识号在发送者处理完当前进程后即可重用。
  5. 发布,发布接收,发布释放,或发布接收必须使用与原始发送的同样的包标识号。
  6. SUBACK和UNSUBACK必须包含对应SUBSCRIBE和UNSUBSCRIBE的包标识号。
  7. 客户daunt和服务端各自独立分配包标识符,因此客户端-服务端使用同样的包标识符参与并发消息校验

2.2.2 属性

属性包含一个标识,用于定义用途和数据类型,紧跟一个值。属性为一个可变字节整数。一个控制包含对应包类型非法的标识或不属于特定数据类型的值,为非法包。 如果接受到非法包,需用CONNACK 或DISCONNECT包附带结果0x81。

MQTT系列--MQTT控制包格式 - 图6MQTT系列--MQTT控制包格式 - 图7

尽管属性标识被定义为可变整数长度,但本版本其认为1字节常。

负荷数据(Payload)

部分MQTT最后一部分包含负荷数据。

MQTT系列--MQTT控制包格式 - 图8

2.4 消息码(Reason code)

消息码为1字节常,标识操作结果。消息码洗浴0x80表明操作成功完成,通常成功消息为0x00.

CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, DISCONNECT及AUTH控制包的可变头有一字节的消息码。

SUBACK和UNSUBACK包的负荷消息里有一个或多个消息码。

MQTT系列--MQTT控制包格式 - 图9

MQTT系列--MQTT控制包格式 - 图10

MQTT系列--MQTT控制包格式 - 图11

MQTT系列--MQTT控制包格式 - 图12