【MQTT协议学习】四、取消订阅主题UnSubscribe报文构建

时间:2024-03-25 20:42:15

在本文中,我们取消订阅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!”

从下面图上,我们可以看出,订阅后我们可以收到我们发布的消息;取消订阅后,服务器不再推送消息

【MQTT协议学习】四、取消订阅主题UnSubscribe报文构建