PUBLISH-发布消息
固定报头
固定报头包含了报文类型,重发标志DUP,服务质量QoS,保留标志RETAIN
这儿我们不重发,服务质量为00(QoS0),无需服务器保留
则报文为:
30 XX
其中XX为我们后面报文的长度
可变报头
PUBLISH的可变报头包含了主题名和报文标识符,
| 描述 |
---|
byte1 | 长度 MSB |
byte2 | 长度LSB |
byte3… | n个主题字节 |
byte… | 报文标识符 |
其中长度为主题字节+报文标识符的长度。
对于QoS0的报文来说,只有主题名,没有报文标识符。
假设我们发布的主题为
testpublish
则对应的报文为00 0B为主题长度:
[00 0b]74 65 73 74 70 75 62 6C 69 73 68
有效载荷
对于PUBLISH报文,有效载荷不需要长度,直接跟有效载荷即可。
有效载荷的长度即剩余长度-可变报文长度
如我们要发布
"Hello World!"
报文。
则有效载荷为:
22 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 22
则我们最终构建的PUBLISH报文为
30 XX [00 0b]74 65 73 74 70 75 62 6C 69 73 68 [22 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 22]
XX的长度是27,对应的HEX值是1B
所以最终的发布报文时:
30 1B 00 0b 74 65 73 74 70 75 62 6C 69 73 68 22 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 22
发布报文测试
测试使用串口透传+EMQ X服务器
我们在EMQ X服务器上,新建一个账号,用来订阅该主题,看我们是否能够使用我们构建的报文成功发布消息。
我们使用透传工具,登录我们之前创建的0000000000用户,使用MQTT.FX登录另外一个账号,并订阅testpublish主题。
可以看到,当我们使用串口透传PUBLISH数据包后,MQTT.FX的另外一个用户正常收到了我们发布的报文信息。
至此,我们根据MQTT协议,完成了PUBLISH报文的构建。
下一步我们需要使用Subscribe报文进行主题的订阅。