MQTT-Java 订阅主题系列协议

115 阅读5分钟

目标

理解客户端订阅不同QoS值(0,1,2)的主题流程协议(PUBLISH,PUBACK)

准备

  1. 参见 “MQTT 实践” ,“MQTT-Java 连接协议” 完成测试工程配置
  2. 通过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协议

固定头

包类型剩余长度
0011000000010011
参见“3.3.1 PUBLISH Fixed Header”19个字节

可变头(9个字节)

Topic Name + Packet Identifier + Properties

000000000000011001101000011000010111001001110110011001010111100100000000
主题长度(6)harvey属性长度(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协议

固定头

包类型剩余长度
0011001000010101
0011(类型) 0(DUP) 01(QoS) 0(RATAIN)
参见“3.3.1 PUBLISH Fixed Header”21个字节

可变头(11个字节)

Topic Name + Packet Identifier + Properties

0000000000000110011010000110000101110010011101100110010101111001000000000000000100000000
主题长度(6)harveyPacket Identifier MSBPacket Identifier LSB属性长度(0)

payload(10个字节)

验: 11101001 10101010 10001100
证: 11101000 10101111 10000001
Q: 01010001
o: 01101111
S: 01010011
1: 00110001

PUBACK协议

固定头

包类型剩余长度
0100000000000010
参见“3.4.1 PUBACK Fixed Header”2个字节

可变头(2个字节)

0000000000000001
Packet Identifier MSBPacket Identifier LSB

格式详情参见 “3.4.2 PUBACK Variable Header”