在本文中,我们取消订阅testpublish主题。
UNSUBSCRIBE –取消订阅
客户端发送UNSUBSCRIBE报文给服务端,用于取消订阅主题。
取消订阅报文包含三部分:固定报头、可变报头和有效载荷
固定报头 | 类型码1字节+剩余字节长度1字节(或更多) |
---|---|
可变报头 | 报文标识符2字节 |
有效载荷 | 主题长度(2字节)+主题(n字节) |
UNSUBSCRIBE报文固定报头
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
byte 1 | MQTT控制报文类型 (10) | 保留位 | ||||||
1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | |
byte 2 | 剩余长度 |
所以我们报文头为:
A2 XX
其中XX为剩余长度,等于可变报头的长度加上有效载荷的长度。我们最后补充
可变报头
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
byte 1 | 报文标识符 MSB | |||||||
byte 2 | 报文标识符 LSB |
可变报头即为我们的报文标识符,报文标识符实际上是ID,阿里云会返回这个ID,便于程序进行判断。由于我们订阅报文是ID为10,这儿我们使用11,即订阅的ID+1
此时报文体变为
A2 XX 00 0B
有效载荷
有效载荷包含了两个字节的长度,和主题信息。例如我们取消订阅"a/b"主题,则有效载荷如下:
描述 | 。 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|
主题过滤器 | |||||||||
byte 1 | Length MSB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
byte 2 | Length LSB (3) | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
byte 3 | ‘a’ (0x61) | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
byte 4 | ‘/’ (0x2F) | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
byte 5 | ‘b’ (0x62) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
我们取消的是testpublish报文,所以载荷为:
00 0B 74 65 73 74 70 75 62 6C 69 73 68
此时报文为:
A2 XX 00 0A 00 0B 74 65 73 74 70 75 62 6C 69 73 68
我们计算XX的值,后面报文总长度为15,所以XX 为0F
A2 0F 00 0B 00 0B 74 65 73 74 70 75 62 6C 69 73 68
示例测试
我们仍旧使用串口调试助手操作无线模块进行数据透传。
- 1.登录
- 2.发布主题消息 “HelloWorld!”
- 3.订阅主题 testpublish
- 4.发布主题消息 “HelloWorld!”
- 5.取消订阅 testpublish
- 6.重新发布主题消息 “HelloWorld!”
从下面图上,我们可以看出,订阅后我们可以收到我们发布的消息;取消订阅后,服务器不再推送消息