2. MQTT控制包结构
MQTTT控制包含最多3部分,顺序如下:
2.1 固定头
每个控制包都包含一个固定头,如下所示:
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]设置值。
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 。
- 发布包OoS设置为0是,不可包含包标识符。
- 每次客户端发送一个新的 订阅(SUBSCRIBE),取消订阅(UNSUBSCRIBE),或 PUBLISH(QoS > 0),MQTT控制包必须分配一个当前未用的非0控制包标识号。
- 每次服务端发送一个新的PUBLISH(QoS > 0)控制包时,必须分配一个当前未用的非0包标识号。
- 包标识号在发送者处理完当前进程后即可重用。
- 发布,发布接收,发布释放,或发布接收必须使用与原始发送的同样的包标识号。
- SUBACK和UNSUBACK必须包含对应SUBSCRIBE和UNSUBSCRIBE的包标识号。
- 客户daunt和服务端各自独立分配包标识符,因此客户端-服务端使用同样的包标识符参与并发消息校验
2.2.2 属性
属性包含一个标识,用于定义用途和数据类型,紧跟一个值。属性为一个可变字节整数。一个控制包含对应包类型非法的标识或不属于特定数据类型的值,为非法包。 如果接受到非法包,需用CONNACK 或DISCONNECT包附带结果0x81。
尽管属性标识被定义为可变整数长度,但本版本其认为1字节常。
负荷数据(Payload)
部分MQTT最后一部分包含负荷数据。
2.4 消息码(Reason code)
消息码为1字节常,标识操作结果。消息码洗浴0x80表明操作成功完成,通常成功消息为0x00.
CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, DISCONNECT及AUTH控制包的可变头有一字节的消息码。
SUBACK和UNSUBACK包的负荷消息里有一个或多个消息码。