【MQTT从入门到提高系列 | 06】MQTT3.1.1之SUBSCRIBE订阅工作流

这是机器未来的第32篇文章

原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125829341?spm=1001.2014.3001.5501

mqtt-slogon-5

1. 概述

本文描述了MQTT的订阅SUBSCRIBE工作流。

2. 订阅SUBSCRIBE

客户端可以向Broker创建一个或多个订阅,每个订阅适配一个或多个主题(主题过滤器)。服务器收到发布者发布的PUBLISH数据包后,将消息分发到订阅该主题的客户端。
24

2.1 固定包头

  • PackageType
    固定为8

  • Reversed
    这里需要注意,这个值必须为0x02,否则服务器会关闭链接。

4.8.2 负载

负载包含主题过滤器和QoS服务质量,主题过滤器指示客户端想要订阅的主题,QoS指示向客户端发送应用程序消息的最大 QoS。

怎么理解【QoS指示向客户端发送应用程序消息的最大 QoS】?
服务器分发【发布者】发布消息的QoS取【发布者】Pub和【订阅者】Sub QoS的最小值。
举个例子:
(1)pub qos为0,sub qos=2,则服务器向客户端发送的pub qos=0
(2)pub qos为2,sub qos=0,则服务器向客户端发送的pub qos=0

注意:Qos负载中至少包含一个主题过滤器/QoS对,否则服务器会断开链接。

负载示例:

image-20220717023415169

当服务器接收到来自客户端的 SUBSCRIBE 数据包时,服务器必须以 SUBACK 数据包 [MQTT-3.8.4-1] 进行响应。SUBACK 数据包必须具有与它正在确认的 SUBSCRIBE 数据包相同的数据包标识符 [MQTT-3.8.4-2]。

如果服务器接收到包含与现有订阅的主题过滤器相同的主题过滤器的订阅数据包,那么它必须用新的订阅完全替换现有的订阅。新订阅中的主题过滤器将与之前订阅中的相同,尽管其最大 QoS 值可能不同。必须重新发送与主题过滤器匹配的任何现有保留消息,但不得中断发布流 [ MQTT-3 .8.4-3]。

3. SUBACK——订阅确认

服务器向客户端发送一个 SUBACK 数据包,以确认接收和处理订阅数据包。

26

SUBACK 数据包包含一个返回代码列表,这些代码和SUBSCRIBE 请求的每个订阅中授予的最大 QoS 级别对应。
允许的返回码:

Code 描述
0x00 成功 - 最大 QoS 0
0x01 成功 - 最大 QoS 1
0x02 成功 - 最大 QoS 2
0x80 失败
除了 0x00、0x01、0x02 和 0x80 以外的 SUBACK 返回码是保留的,不得使用 [MQTT-3.9.3-2] 。

4. UNSUBSCRIBE – 退订主题

客户端向服务器发送一个 UNSUBSCRIBE 数据包,以取消订阅主题。28UNSUBSCRIBE 数据包中的主题过滤器必须是第1.5.3节中定义的 UTF-8 编码字符串,并连续打包。

  • UNSUBSCRIBE 数据包的有效负载必须包含至少一个主题过滤器

  • UNSUBSCRIBE 控制包的固定报头的第 3、2、1 和 0 位被保留,必须分别设置为 0、0、1 和 0。服务器必须将任何其他值视为格式错误并关闭网络连接

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

服务器执行动作:
如果服务器删除订阅:

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

响应:

  • 服务器必须通过发送一个 UNSUBACK 数据包来响应一个UNSUBSUBCRIBE 请求。
  • UNSUBACK 数据包必须具有与 UNSUBSCRIBE 数据包[MQTT-3.10.4-4]相同的数据包标识符
  • 即使没有删除任何主题订阅,服务器也必须以 UNSUBACK [MQTT-3.10.4-5] 进行响应。
  • 如果服务器接收到一个包含多个主题过滤器的 UNSUBSCRIBE 数据包,它只发送一个 UNSUBACK 响应 [MQTT-3.10.4-6]。

5. UNSUBACK——取消订阅确认

UNSUBACK 数据包由服务器发送给客户端以确认收到 UNSUBSCRIBE 数据包。29

《MQTT快速入门系列》快速导航:

写在末尾:

  • 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!
  • 专栏简介:从0到1掌握MQTT分布式协议。
  • 面向人群:零基础编程爱好者
  • 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待

猜你喜欢

转载自blog.csdn.net/RobotFutures/article/details/125829341
今日推荐