MQTT协议(四)

一.SUBSCRIBE报文

客户端向服务器发送SUBSCRIBE报文订阅一个或多个主题。服务器发送PUBLISH报文给那些订阅主题的客户端。SUBSCRIBE报文也指定了最大的QoS等级, 服务器根据Qos等级分发消息给客户端

1、固定报头

(1) SUBSCRIBE控制报固定报头的保留位, 必须设置为0,0,1,0。 服务器会把任何值都当做是不合法的并关闭网络连接

(2) 剩余长度字段:等于可变报头的长度( 2字节) 加上有效载荷的长度。

2、可变报头

示例(报文标识符设置为10时的可变报头)

3、有效载荷
SUBSCRIBE报文的有效载荷包含了一个主题过滤器列表,它们表示客户端想要订阅的主题。SUBSCRIBE报文有效载荷中的主题过滤器列表是UTF-8编码字符串,服务器应该支持包含通配符的主题过滤器,如果不支持包含通配符的主题过滤器, 必须拒绝任何包含通配符过滤器的订阅请求。每一个过滤器后面跟着一个字节,这个字节被叫做服务质量要求Requested QoS,它给出了服务器分发给客户端应用消息所允许的最大QoS等级。SUBSCRIBE报文的有效载荷必须包含至少一个主题过滤器和QoS等级字段组合,没有有效载荷的SUBSCRIBE报文是违反协议的。请求的最大服务质量等级字段为一个字节, 它后面跟着UTF-8编码的主题名, 主题过滤器和QoS等级组合是连续的

4、有效载荷格式

如果QoS不等于0,1或2, 服务器会认为SUBSCRIBE报文是不合法的并关闭网络连接

示例


4、响应
服务器收到客户端发送的一个SUBSCRIBE报文时, 必须使用SUBACK报文响应。SUBACK报文必须和等待确认的SUBSCRIBE报文有相同的报文标识符。允许服务器在发送SUBACK报文之前就开始发送相应订阅的PUBLISH报文。如果服务器收到一个SUBSCRIBE报文,报文的主题过滤器与一个以前订阅的主题过滤器相同,那么必须使用新的订阅替换以前的订阅,如果新订阅的主题过滤器和之前订阅最大QoS值不同,那么这个主题过滤器上任何现存的保留消息必须被重发。如果主题过滤器不同于任何现存订阅的过滤器, 服务器会创建一个新的订阅并发送所有已经发布匹配主题过滤器的保留消息。服务器发送给客户端SUBACK报文上的返回码表示那个订阅被授予的最大QoS等级,或者表示这个订阅失败,服务器也可以授予比订阅者要求的低QoS等级

PS:对某个特定的主题过滤器, 如果正在订阅的客户端被授予的最大QoS等级是1, 那么客户端发布QoS为0的应用消息会按QoS为0的等级分发给这个客户端,这意味着客户端最多收到这个消息一次。 从另一方面说,客户端发布QoS为2的应用消息的消息会被服务器降级到QoS等级1再分发给客户端, 因此客户端可能会收到重复的消息

二.SUBACK报文

服务器发送SUBACK报文给客户端, 用于确认它已收到并且正在处理SUBSCRIBE报文。SUBACK报文包含返回码字段, 用于指定了SUBSCRIBE授予订阅被的最大QoS等级

1、固定报头

剩余长度字段:等于可变报头的长度加上有效载荷的长度

2、可变报头
可变报头包含等待确认的SUBSCRIBE报文的报文标识符

3、有效载荷
有效载荷包含一个返回码列表,每个返回码对应等待确认的SUBSCRIBE报文中的一个主题滤器。返回码的顺序必须和SUBSCRIBE报文中主题过滤器的顺序相同


允许的返回码值:

  • 0x00 - 最大QoS0
  • 0x01 - 成功 – 最大QoS1
  • 0x02 - 成功 – 最大QoS2
  • 0x80 - Failure 失败

三.UNSUBSCRIBE报文

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

1、固定报头

UNSUBSCRIBE报文固定报头的保留位必须设置为0,0,1,0,服务器认为任何其它的值都是不合法的并会关闭网络连接

剩余长度字段:等于可变报头的长度加上有效载荷的长度

2、可变报头

可变报头包含一个报文标识符

3、有效载荷
UNSUBSCRIBE报文的有效载荷包含客户端想要取消订阅的主题过滤器列表。UNSUBSCRIBE报文中的主题过滤器必须是连续的UTF-8编码字符串。UNSUBSCRIBE报文的有效载荷必须至少包含一个主题过滤器。没有有效载荷的UNSUBSCRIBE报文是违反协议的

示例


4、响应
UNSUBSCRIBE报文提供的主题过滤器(无论是否包含通配符)必须与服务器持有的这个客户端的当前主题过滤器集合逐个字符比较,如果过滤器完全匹配, 那么服务端的订阅将被删除,否则不会处理。服务器必须发送UNSUBACK报文响应客户端的UNSUBSCRIBE报文,报文里必须包含和UNSUBSCRIBE报文相同的报文标识符,而且即使没有删除任何主题订阅, 服务器也必须发送一个UNSUBACK响应给客户端

四.UNSUBACK报文

服务器发送UNSUBACK报文给客户端用于确认收到UNSUBSCRIBE报文

1、固定报头

剩余长度字段:表示可变报头的长度, 对UNSUBACK报文这个值等于2

2、可变报头

3、有效载荷:没有

猜你喜欢

转载自blog.csdn.net/qq_21231413/article/details/88299476
今日推荐