目标
理解客户端订阅不同QoS值(0,1,2)的主题流程协议(PUBLISH,PUBACK)
准备
- 参见 “MQTT 实践” ,“MQTT-Java 连接协议” 完成测试工程配置
- 通过MQTTX客户端分别发布QoS0,QoS1,QoS2的消息主题
QoS Level 下的协议流程概况
(S): 发送; (R): 接收
QoS Level | 协议流程 |
---|---|
0 | (R)PUBLISH |
1 | (R)PUBLISH -> (S)PUBACK |
2 | (R)PUBLISH -> (S)PUBACK |
总结:客户端接收QoS1和QoS2的消息流程是一致的 |
QoS-0
实验日志
2023-08-31 10:38:06:811 Receive 包类型:PUBLISH
2023-08-31 10:38:06:813 Receive Message Header(二进制内容) : 00110000 00010011 00000000 00000110 01101000 01100001 01110010 01110110 01100101 01111001 00000000
2023-08-31 10:38:06:813 Receive Message Header(字符串内容) : 0�harvey�
2023-08-31 10:38:06:814 Receive Message payload(二进制内容) : 11101001 10101010 10001100 11101000 10101111 10000001 01010001 01101111 01010011 00110000
2023-08-31 10:38:06:815 Receive Message payload(字符串内容) : 验证QoS0
PUBLISH协议
固定头
包类型 | 剩余长度 |
---|---|
00110000 | 00010011 |
参见“3.3.1 PUBLISH Fixed Header” | 19个字节 |
可变头(9个字节)
Topic Name + Packet Identifier + Properties
00000000 | 00000110 | 01101000 | 01100001 | 01110010 | 01110110 | 01100101 | 01111001 | 00000000 |
---|---|---|---|---|---|---|---|---|
主题 | 长度(6) | h | a | r | v | e | y | 属性长度(0) |
注意:
“主题长度” 在MQTT规范中没有直接说明,参见“3.3.2.1 Topic Name”,能知晓长度占两个字节约束可参见"Figure 3-9 - PUBLISH packet Variable Header non-normative example"
payload(10个字节)
验: 11101001 10101010 10001100
证: 11101000 10101111 10000001
Q: 01010001
o: 01101111
S: 01010011
0: 00110000
QoS-1
实验日志
2023-08-31 10:38:37:950 Receive 包类型:PUBLISH
2023-08-31 10:38:37:951 Receive Message Header(二进制内容) : 00110010 00010101 00000000 00000110 01101000 01100001 01110010 01110110 01100101 01111001 00000000 00000001 00000000
2023-08-31 10:38:37:951 Receive Message Header(字符串内容) : 2�harvey��
2023-08-31 10:38:37:952 Receive Message payload(二进制内容) : 11101001 10101010 10001100 11101000 10101111 10000001 01010001 01101111 01010011 00110001
2023-08-31 10:38:37:952 Receive Message payload(字符串内容) : 验证QoS1
2023-08-31 10:38:37:960 Send 包类型:PUBACK
2023-08-31 10:38:37:960 Send Message Header(二进制内容) : 01000000 00000010 00000000 00000001
2023-08-31 10:38:37:961 Send Message Header(字符串内容) : @�
2023-08-31 10:38:37:961 Send Message payload(二进制内容) :
2023-08-31 10:38:37:962 Send Message payload(字符串内容) : 内容长度=0,内容=
PUBLISH协议
固定头
包类型 | 剩余长度 |
---|---|
00110010 | 00010101 |
0011(类型) 0(DUP) 01(QoS) 0(RATAIN) | |
参见“3.3.1 PUBLISH Fixed Header” | 21个字节 |
可变头(11个字节)
Topic Name + Packet Identifier + Properties
00000000 | 00000110 | 01101000 | 01100001 | 01110010 | 01110110 | 01100101 | 01111001 | 00000000 | 00000001 | 00000000 |
---|---|---|---|---|---|---|---|---|---|---|
主题 | 长度(6) | h | a | r | v | e | y | Packet Identifier MSB | Packet Identifier LSB | 属性长度(0) |
payload(10个字节)
验: 11101001 10101010 10001100
证: 11101000 10101111 10000001
Q: 01010001
o: 01101111
S: 01010011
1: 00110001
PUBACK协议
固定头
包类型 | 剩余长度 |
---|---|
01000000 | 00000010 |
参见“3.4.1 PUBACK Fixed Header” | 2个字节 |
可变头(2个字节)
00000000 | 00000001 |
---|---|
Packet Identifier MSB | Packet Identifier LSB |
格式详情参见 “3.4.2 PUBACK Variable Header”