MQTT控制报文
1. MQTT控制报文结构
1.1 MQTT控制报文结构
1.2 MQTT控制报文,固定头部结构
1.3 MQTT控制报文固定头部,报文类型列表
1.4 MQTT控制报文固定头部,报文类型标志位(Byte1 bit3-bit0)
注释:
- DUP:标记PUBLISH报文是否为重发报文
- QoS:PUBLISH报文服务质量,占2bit:QoS0,QoS1,QoS2
- RETAIN:PUBLISH报文的保留标志
报文类型的标志必须为上表的内容,否则收到非法的标志,服务端会关闭连接。
1.5 MQTT控制报文固定头部,报文剩余长度(Byte2)
剩余长度的定义: 表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码。更大的值按下面的方式处理。低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节。每个字节可以编码128个数值和一个延续位,剩余长度字段最大4个字节。
1.6 MQTT控制报文可变头部
在对应的控制报文中详细描述。
1.7 MQTT控制报文有效负载(payload)
在对应的控制报文中详细描述。
2. CONNECT 连接服务端控制报文
2.1 CONNECT控制报文实例
MQ Telemetry Transport Protocol Connect Command 0001 0000 = Header Flags: 0x10 (Connect Command) Msg Len: 81 Protocol Name: MQTT Version: 4 1100 0000 = Connect Flags: 0xc0 (clean session) Keep Alive: 60 Client ID: GID_LRF_01@@@sn123456 User Name: LTAIL8wdMJopj9Tb Password: wPFuMuJYhjK+I2tDtytpRJqTpWI=
2.2 CONNECT控制报文的可变报头格式
2.3 CONNECT报文可变报头关键字段解析
2.3.1 Connect Flags
- User Name Flag:为1则表示Payload包括用户名
- Password Flag:为1则表示Payload包括用户名对应的密码
- Clean Session:为1则表示清理会话标志
2.3.2 Keep Alive
设备端发送保活心跳的时间间隔。
2.4 Clean Session字段详细说明
2.4.1 清理会话(CleanSession)标志被设置为0
a. 永久的会话生命周期(连接成功不需要重新订阅主题)
b. 服务端必须基于当前会话(同一client_id的会话)状态恢复与客户端的通信,如果会话不存在就开始一个新的会话。
c. 会话连接断开之后,服务端将之后的QoS1和QoS2级别的消息保存为会话状态的一部分。
2.4.2 清理会话标志被设置为1
a. 会话生命周期与网络连接同样长的时间。
b. 服务端必须丢弃之前的任何会话并开始一个新的会话。
c. 在每次连接成功后都需要重新订阅任何相关的主题。
3. CONNECTACK 服务端应答控制报文
3.1 CONNECTACK控制报文实例
MQ Telemetry Transport Protocol
Connect Ack
0010 0000 = Header Flags: 0x20 (Connect Ack)
Msg Len: 2
0000 0000 = Connection Ack: Connection Accepted (0)
3.2 CONNECTACK控制报文的可变报头
3.2.1 连接确认标志 Connect Acknowledge Flags(byte1)
只有当服务器端收到cleansession为0的连接且保存了clientid对应的会话状态,必须将CONNACK报文中的当前会话标志设置为1,其他情况都设置为0。
3.2.2 连接返回码Connect Return code(byte2)
3.3 CONNACK报文没有有效载荷
4. PUBLISH 发布消息控制报文
4.1 PUBLISH发布消息控制报文实例
QoS1 实例
MQ Telemetry Transport Protocol Publish Message 0011 0010 = Header Flags: 0x32 (Publish Message) Msg Len: 35 Topic: aliyun_mqtt_test Message Identifier: 2 Message: hello mqtt demo
QoS0 实例
MQ Telemetry Transport Protocol Publish Message 0011 0000 = Header Flags: 0x30 (Publish Message) Msg Len: 33 Topic: aliyun_mqtt_test Message: hello mqtt demo
4.2 PUBLISH控制报文可变报头
4.3 有效载荷
包含将被发布的应用消息。
4.4 PUBLISH控制报文服务质量
5. PUBACK 发布消息应答(QOS1)控制报文
5.1 PUBACK控制报文实例
MQ Telemetry Transport Protocol Publish Ack 0100 0000 = Header Flags: 0x40 (Publish Ack) Msg Len: 2 Message Identifier: 2
5.2 可变报头
包含等待确认的PUBLISH报文的报文标识符。
5.3 有效载荷
PUBACK报文没有有效载荷。
6. SUBSCRIBE 设备端订阅主题控制报文
6.1 SUBSCRIBE控制报文实例
MQ Telemetry Transport Protocol Subscribe Request 1000 0010 = Header Flags: 0x82 (Subscribe Request) Msg Len: 21 Message Identifier: 1 Topic: aliyun_mqtt_test
6.2 可变报头
6.2.1 报文标识字段
6.3 有效载荷
6.4 SUBSCRIBE控制报文服务质量
7. SUBACK 设备端订阅主题应答控制报文
7.1 SUBACK控制报文实例
MQ Telemetry Transport Protocol Subscribe Ack 1001 0000 = Header Flags: 0x90 (Subscribe Ack) Msg Len: 3 Message Identifier: 1
7.2 可变报头
包含等待确认的SUBSCRIBE报文的报文标识符。
7.3 有效负载
包含一个返回码清单(QOS服务质量清单),每个返回码对应等待确认的SUBSCRIBE报文中的一个主题过滤器。返回码的顺序必须和SUBSCRIBE报文中主题过滤器的顺序相同。
8. UNSUBSCRIBE 设备端取消订阅主题控制报文
8.1 UNSUBSCRIBE控制报文实例
MQ Telemetry Transport Protocol Unsubscribe Request 1010 0010 = Header Flags: 0xa2 (Unsubscribe Request) Msg Len: 20 Message Identifier: 12 Topic: aliyun_mqtt_test
8.2 可变报头
包含等待确认的UNSUBSCRIBE报文的报文标识符。
8.3 有效负载
包含客户端想要取消订阅的主题过滤器列表。
9. UNSUBACK 设备端取消订阅主题应答控制报文
9.1 UNSUBACK控制报文实例
MQ Telemetry Transport Protocol Unsubscribe Ack 1011 0000 = Header Flags: 0xb0 (Unsubscribe Ack) Msg Len: 2 Message Identifier: 12
9.2 可变报头
包含等待确认的UNSUBSCRIBE报文的报文标识符。
9.3 有效负载
没有有效载荷。
10. PINGREQ 设备端心跳请求控制报文
10.1 PINGREQ控制报文实例
MQ Telemetry Transport Protocol Ping Request 1100 0000 = Header Flags: 0xc0 (Ping Request) Msg Len: 0
10.2 无可变报头
10.3 无有效载荷
11. PINGRESP 服务端心跳应答控制报文
11.1 PINGRESP控制报文实例
MQ Telemetry Transport Protocol Ping Response 1101 0000 = Header Flags: 0xd0 (Ping Response) Msg Len: 0
11.2 无可变报头
11.3 无有效载荷
12. DISCONNECT 设备端断开连接控制报文
12.1 DISCONNECT控制报文实例
MQ Telemetry Transport Protocol Disconnect Req 1110 0000 = Header Flags: 0xe0 (Disconnect Req) Msg Len: 0