Skip to content

Latest commit

 

History

History
261 lines (227 loc) · 7.23 KB

0310-UNSUBSCRIBE.md

File metadata and controls

261 lines (227 loc) · 7.23 KB

3.10 UNSUBSCRIBE –取消订阅请求

客户端发送UNSUBSCRIBE报文给服务端,用于取消订阅主题。

3.10.1 UNSUBSCRIBE 固定报头 UNSUBSCRIBE Fixed Header

图 3-28 – UNSUBSCRIBE报文固定报头
Bit 7 6 5 4 3 2 1 0
byte 1 MQTT控制报文类型 (10) 保留位
1 0 1 0 0 0 1 0
byte 2 剩余长度

UNSUBSCRIBE固定报头的第3,2,1,0位是保留位且必须分别设置为0,0,1,0。服务端必须认为任何其它的值都是不合法的并关闭网络连接 [MQTT-3.10.1-1]。

剩余长度字段
等于可变报头长度(2字节)加上有效载荷长度,编码为变长字节整数。

3.10.2 UNSUBSCRIBE 可变报头 UNSUBSCRIBE Variable Header

UNSUBSCRIBE报文可变报头按顺序包含以下字段:报文标识符和属性(Properties)。2.2.1节提供了有关报文标识符的更多信息。属性的编码规则,如2.2.2节所述。

3.10.2.1 UNSUBSCRIBE 属性 UNSUBSCRIBE Properties

3.10.2.1.1 属性长度 Property Length

SUBSCRIBE可变报头中属性的长度被编码为变长字节整数。

3.10.2.1.2 用户属性 User Property

38 (0x26) ,用户属性(User Property)标识符。
跟随其后的是一个UTF-8字符串对。

用户属性允许出现多次,以表示多个名字/值对。相同的名字可以出现多次。

非规范评注

UNSUBSCRIBE报文中的用户属性可以被客户端用来向服务端发送订阅相关的属性。本规范不定义这些属性的意义。

3.10.3 3.10.3 UNSUBSCRIBE 载荷 UNSUBSCRIBE Payload

UNSUBSCRIBE报文有效载荷包含一列客户端希望取消订阅的主题过滤器。UNSUBSCRIBE报文中的主题过滤器必须为1.5.4节所述的UTF-8编码字符串 [MQTT-3.10.3-1] ,且连续填充。

UNSUBSCRIBE报文有效载荷必须包含至少一个主题过滤器 [MQTT-3.10.3-2]。不包含有效载荷的UNSUBSCRIBE报文将造成协议错误(Protocol Error)。错误处理信息,参考4.13节。

非规范示例

图 3-30 展示了UNSUBSCRIBE报文的载荷示例,包括两个主题过滤器 “a/b”和“c/d”。

图 3-30 - 载荷字节格式非规范示例 Payload byte format non-normative example
说明 7 6 5 4 3 2 1 0
主题过滤器
byte 1 长度MSB (0) 0 0 0 0 0 0 0 0
byte 2 长度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
主题过滤器
byte 6 长度MSB (0) 0 0 0 0 0 0 0 0
byte 7 长度LSB (3) 0 0 0 0 0 0 1 1
byte 8 ‘c’ (0x63) 0 1 1 0 0 0 1 1
byte 9 ‘/’ (0x2F) 0 0 1 0 1 1 1 1
byte 10 ‘d’ (0x64) 0 1 1 0 0 1 0 0

3.10.4 UNSUBSCRIBE 行为 UNSUBSCRIBE Actions

服务端必须对客户端的UNSUBSCRIBE报文中提供的主题过滤器(不管是否包含通配符)逐个字符与当前持有的主题过滤器集进行比较。如果任何过滤器完全匹配,则必须删除其拥有的订阅 [MQTT-3.10.4-1],否则不会进行额外的处理。

当服务端收到UNSUBSCRIBE报文:

  • 必须停止添加为了交付给客户端的与主题过滤器相匹配的任何新消息 [MQTT-3.10.4-2]。
  • 必须完成任何已经开始发送给客户端的、与主题过滤器相匹配的、QoS等级为1或2的消息 [MQTT-3.10.4-3]。
  • 可以继续交付任何为交付给客户端而缓存的消息。

服务端必须发送UNSUBACK报文以响应客户端的UNSUBSCRIBE请求 [MQTT-3.10.4-4]。UNSUBACK报文必须包含和UNSUBSCRIBE报文相同的报文标识符。即使没有删除任何主题订阅,服务端也必须发送一个UNSUBACK响应 [MQTT-3.10.4-5]。

如果服务端收到的UNSUBSCRIBE报文包含多个主题过滤器,服务端必须当做收到一系列多个UNSUBSCRIBE报文来处理--除了将它们的响应组合为单个SUBACK响应 [MQTT-3.10.4-6]。

如果某个主题过滤器代表一个共享订阅,此会话将被从该共享订阅中删除。如果此会话是该共享订阅所关联的唯一会话,该共享订阅被删除。共享订阅的处理,参考4.8.2节。

第三章目录 MQTT控制报文

项目主页