IOT-MQTT协议-控制数据包-UNSUBSCRIBE

3.10取消订阅 - 取消订阅主题

客户端向服务器发送UNSUBSCRIBE数据包,以取消订阅主题。

3.10.1固定标题

图3.28 - UNSUBSCRIBE数据包固定标头

7

6

5

4

3

2

1

0

字节1

MQTT控制包类型(10)

保留的

 

1

0

1

0

0

0

1

0

字节2

剩余长度

 UNSUBSCRIBE控制包的固定标题的第3,2,1和0位保留,并且必须分别设置为0,0,1和0。服务器必须将任何其他值视为格式错误并关闭网络连接 [MQTT-3.10.1-1]

剩余长度字段

这是变量头的长度(2个字节)加上有效载荷的长度。

3.10.2 Varliable 变量头

变量头包含数据包标识符。第2.3.1节提供了有关数据包标识符的更多信息。

图3.29 - UNSUBSCRIBE数据包变量头

7

6

4

3

2

1

0

字节1

包标识符MSB

字节2

包标识符LSB

3.10.3 Payload 有效载荷

UNSUBSCRIBE数据包的有效负载包含客户希望取消订阅的主题过滤器列表。UNSUBSCRIBE数据包中的主题过滤器必须是第1.5.3 节中定义的UTF-8编码字符串,连续打包[MQTT-3.10.3-1]

UNSUBSCRIBE数据包的有效载荷必须包含至少一个主题过滤器。没有有效载荷的UNSUBSCRIBE数据包是协议违规 [MQTT-3.10.3-2]。有关处理错误的信息,请参见第4.8节。

 

3.10.3.1 有效载荷非规范性示例

图3.30-有效载荷字节格式非规范性示例显示了表3.7中简要描述的UNSUBSCRIBE数据包的有效载荷- 有效载荷非规范示例

表3.7 - 有效载荷非规范性示例

主题过滤器

“A / B”

主题过滤器

“光盘”

图3.30 - 有效载荷字节格式非规范示例

 

描述

7

6

5

4

3

2

1

0

主题过滤器

字节1

长度MSB(0)

0

0

0

0

0

0

0

0

字节2

长度LSB(3)

0

0

0

0

0

0

1

1

字节3

'a'(0x61)

0

1

1

0

0

0

0

1

字节4

'/'(0x2F)

0

0

1

0

1

1

1

1

字节5

'b'(0x62)

0

1

1

0

0

0

1

0

主题过滤器

字节6

长度MSB(0)

0

0

0

0

0

0

0

0

字节7

长度LSB(3)

0

0

0

0

0

0

1

1

字节8

'c'(0x63)

0

1

1

0

0

0

1

1

字节9

'/'(0x2F)

0

0

1

0

1

1

1

1

字节10

'd'(0x64)

0

1

1

0

0

1

0

0

3.10.4 Response 回应

必须逐个字符地比较UNSUBSCRIBE数据包中提供的主题过滤器(无论它们是否包含通配符)与服务器为客户端保存的当前主题过滤器集。如果任何过滤器完全匹配,则删除其拥有的订阅,否则不会发生其他处理 [MQTT-3.10.4-1]。 
 

如果服务器删除订阅:

  • 它必须停止添加任何新消息以传递给客户端 [MQTT-3.10.4-2]
  • 它必须完成已开始发送给客户端 [MQTT-3.10.4-3] 的任何QoS 1或QoS 2消息的传递
  • 它可以继续提供缓冲的任何现有消息,以便传递给客户端。

服务器必须通过发送UNSUBACK数据包来响应UNSUBSUBCRIBE请求。UNSUBACK数据包必须具有与UNSUBSCRIBE数据包 [MQTT-3.10.4-4] 相同的数据包标识符。 即使没有删除主题订阅,服务器也必须使用UNSUBACK [MQTT-3.10.4-5]进行响应。

如果服务器收到包含多个主题过滤器的UNSUBSCRIBE数据包,它必须处理该数据包,就好像它已经收到多个UNSUBSCRIBE数据包的序列,除了它只发送一个UNSUBACK响应 [MQTT-3.10.4-6]。 

猜你喜欢

转载自blog.csdn.net/leeahuamsg/article/details/93473302