【MQTT从入门到提高系列 | 06】MQTT3.1.1之SUBSCRIBE订阅工作流_mqtt subscribe_机器未来的博客-程序员秘密

技术标签: MQTT  MQTT从入门到提高系列  分布式消息中间件  物联网  IoT  

这是机器未来的第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分布式协议。
  • 面向人群:零基础编程爱好者
  • 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/RobotFutures/article/details/125829341

智能推荐

Could not find com.android.support:appcompat-v7:27.1.1.问题解决_能运行就行的博客-程序员秘密

allprojects { repositories { jcenter() maven { url "https://maven.google.com" }//添加这个就可以 }}

flink_flink按分割标准划分为_code学习社的博客-程序员秘密

Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能。现有的开源计算方案,会把流处理和批处理作为两种不同的应用类型,因为它们所提供的SLA(Service-Level-Aggreement)是完全不相同的:流处理一般需要支持低延迟、Exactly-once保证,而批处理需要支持高吞吐、高...

VsCode 修改默认HTML样式_程序员的快乐你不懂的博客-程序员秘密

1.找到vsCode安装目录中的expand-full.js文件可以直接搜索,或者如下图按路径一步一步找:2.用vscode打开然后ctrl+f搜索一段代码如下: "!!!": "{<!DOCTYPE html>}",3.替换4.对比如下:一次修改终身受用...

express 框架之session(express框架session 内存存储)_fenggui的博客-程序员秘密

express-session 是基于express框专门用于处理session的中间件。这里不谈express-session怎么安装,只给出相应的实例代码。另外,session的认证机制离不开cookie,需要同时使用cookieParser 中间件,有关的介绍可以专门参考https://github.com/expressjs/session/blob/master/README.md,或者

Variance Calculation in Cost Object Accounting_ctf63282的博客-程序员秘密

1 Variance calculation in Cost Object Accounting is used for monitoring the financial aspects of day to day ...

关于计算机动画制作的过程,关于计算机制作动画的过程_赤水.鲁的博客-程序员秘密

关于计算机制作动画的过程 关于计算机制作动画的过程 较量争论灵便画妙技_2_动画制作过程1.txt41滴水能穿石,只由于它永久加害统一点。42洋火假定躲避点火的苦楚,它的一辈子都将昏暗无光。 本文由imaginationhyq进献 ppt文档可能在WAP端阅读体验欠佳。倡始您优先决议TXT,或下载源文件到本机检查。 2009 计算矫捷画妙技 第二讲 动画产进程 北京航空航天大学合计机学院 孟宪海 ...

随便推点

Codeforces Round 1338 简要题解_mayaohua2003的博客-程序员秘密

A. Powered Addition略B. Edge Weight Assignment略C. Perfect Triples找找规律容易发现答案跟四进制相关。考虑将数字写成四进制,容易观察并归纳证明:所有匹配的(a,b,c)(a,b,c)(a,b,c)位数都相同,并且位数相同,最高位为111,222和333的数字分别会作为aaa,bbb和ccc出现,互相匹配,且aaa从小到大取遍所...

PHP类的自动加载与命名空间_WencoChen的博客-程序员秘密

       作为一名合格的程序员,必定会有一个从面向过程编程到面向对象编程的转化过程,在这个过程中诸如命名空间,类,继承,接口,类自动加载等等都是需要我们去掌握的,之前对这些概念都不是很熟悉,只是能够基础地使用,在这里系统的记录一下关于命名空间与类的自动加载知识。类的自动加载什么是自动加载类?&nb

Scala 隐式(implicit)详解_冽夫的博客-程序员秘密

阅读目录目录阅读目录文章正文1、Spark 中的隐式思考2、Scala 隐式使用方式2.1隐式值2.2 隐式视图2.3 隐式类3、Scala 隐私注意事项3.1 转换时机3.2 解析机制3.3 转换前提文章参考文章正文通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码。1、Spark 中的隐式思考隐式转换是Sc...

ARM——三级流水线结构,以及PC指针_猪哥-嵌入式的博客-程序员秘密

    首先科普几个概念:    MIPS——Million instruction Per Second 每秒多少百万条指令,比如0.9MIPS,表示每秒90万条指令。    MIPS/MHz表示CPU在1MHz的运行速度下可以执行多少个MIPS,比如0.9MIPS/MHz表示如果CPU运行在1MHz的频率下,每秒可执行90万条指令.    这两个概念常用作描述ARM类的CPU执行速度,比如ST...

java单元测试(@Test)[email protected]_m0_55070913的博客-程序员秘密

初学者在写java代码的时候,可能会因为写一个小功能就要写一个类,写一个main方法而苦恼。其实java的工程师在很早的时候就提供了解决的方案。就是我们今天要讲 的Junit测试。在使用的时候首先需要配置环境:一、英文:选中一个java工程 右击鼠标 -> 选择properties -> 选择Java Build Path (在左边的菜单中) -> 在右边选择标签 Libraries-> 单击按钮“Add Library”-> 选择JUnit , 单击按钮 “Next&g

ArcGIS for Android 10.2.9(5):GraphicsLayer移除Graphic,GraphicsLayer常用API_graphiclayer.remove_qq_36699930的博客-程序员秘密

**API提供三个移除Graphic的方法: 1.public void removeAll ()删除所有Graphic。 2.public void removeGraphic (int id)使用唯一ID删除Graphic。 3.public void removeGraphics (int [] ids)使用唯一ID数组删除Graphic。**如果想移除指定Graphic,就必须获...

推荐文章

热门文章

相关标签