前言
客户端发送UNSUBSCRIBE报文给服务端,用于取消订阅主题。
UNSUBSCRIBE – 取消订阅请求
UNSUBSCRIBE固定报头
UNSUBSCRIBE固定报头的第3,2,1,0位是保留位且必须分别设置为0,0,1,0。服务端必须认为任何其它的值都是不合法的并关闭网络连接。
剩余长度字段
等于可变报头长度加上有效载荷长度,编码为变长字节整数。
可变报头
UNSUBSCRIBE报文可变报头按顺序包含以下字段:报文标识符和属性(Properties)。
MQTT 3.1.1没有属性
UNSUBSCRIBE属性
属性长度
SUBSCRIBE可变报头中属性的长度被编码为变长字节整数。
用户属性
38 (0x26)Byte,用户属性(User Property)标识符。
跟随其后的是一个UTF-8字符串键值对。
用户属性允许出现多次,以表示多个名字/值对。相同的名字可以出现多次。
UNSUBSCRIBE报文中的用户属性可以被客户端用来向服务端发送订阅相关的属性。MQTT5不定义这些属性的意义。
UNSUBSCRIBE载荷
UNSUBSCRIBE报文的有效载荷包含一列客户端想要取消订阅的主题过滤器列表。UNSUBSCRIBE报文中的主题过滤器必须是连续填充的UTF-8编码字符串。
UNSUBSCRIBE报文的有效载荷必须至少包含一个消息过滤器。没有有效载荷的UNSUBSCRIBE报文是违反协议的。
下图展示了MQTT的UNSUBSCRIBE报文的载荷示例,包括两个主题过滤器 “a/b”和“c/d”。
MQTT5和MQTT3.1.1一致
UNSUBSCRIBE行为
UNSUBSCRIBE报文提供的主题过滤器(无论是否包含通配符)必须与服务端持有的这个客户端的当前主题过滤器集合逐个字符比较。如果有任何过滤器完全匹配,那么它(服务端)自己的订阅将被删除,否则不会有进一步的处理。
如果服务端删除了一个订阅:
在MQTT5时改成了当服务端收到UNSUBSCRIBE报文时
- 它必须停止添加任何与主题过滤器匹配的新消息,以传递给客户端。
- 它必须完成任何与主题过滤器匹配的QoS 1或QoS 2消息的传递,并且已经开始发送给客户端。
- 它可以继续传递任何缓冲的现有消息,以便传递给客户端。
服务端必须发送UNSUBACK报文响应客户端的UNSUBSCRIBE请求。UNSUBACK报文必须包含和UNSUBSCRIBE报文相同的报文标识符。即使没有删除任何主题订阅,服务端也必须发送一个SUBACK响应。
如果服务端收到包含多个主题过滤器的UNSUBSCRIBE报文,它必须如同收到了一系列的多个UNSUBSCRIBE报文一样处理那个报文,除了将它们的响应合并到一个单独的UNSUBACK报文外。
【MQTT 5】
如果某个主题过滤器代表一个共享订阅,此会话将被从该共享订阅中删除。如果此会话是该共享订阅所关联的唯一会话,该共享订阅被删除。
MQTT3没有所谓的共享订阅概念