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

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

1. 概述

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

2. 订阅SUBSCRIBE

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

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对,否则服务器会断开链接。

负载示例:

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

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

3. SUBACK——订阅确认

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

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 数据包,以取消订阅主题。UNSUBSCRIBE 数据包中的主题过滤器必须是第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 数据包。

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

  • 【MQTT从入门到提高系列 | 01】从0到1快速搭建MQTT测试环境
  • 【MQTT从入门到提高系列 | 02】MQTT3.1.1TLS加密传输
  • 【MQTT从入门到提高系列 | 03】一文掌握MQTT3.1.1协议框架
  • 【MQTT从入门到提高系列 | 04】MQTT应用协议之CONNECT
  • 【MQTT从入门到提高系列 | 05】MQTT3.1.1之PUBLISH发布工作流
  • 【MQTT从入门到提高系列 | 06】MQTT3.1.1之SUBSCRIBE订阅工作流
  • 【MQTT从入门到提高系列 | 07】MQTT3.1.1之链路保活及断开
  • 【MQTT从入门到提高系列 | 08】MQTT3.1.1主题Topic详解
  • 【MQTT从入门到提高系列 | 09】WireShark抓包分析MQTT报文

写在末尾:

  • 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!
  • 专栏简介:从0到1掌握MQTT分布式协议。
  • 面向人群:零基础编程爱好者
  • 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待
    • Python零基础快速入门系列
    • 快速入门Python数据科学系列
    • 人工智能开发环境搭建系列
    • 机器学习系列
    • 物体检测快速入门系列
    • 自动驾驶物体检测系列

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

  1. 【MQTT从入门到提高系列 | 01】从0到1快速搭建MQTT测试环境

    这是机器未来的第24篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125532208 1. mosquitto概述 Ecl ...

  2. ASP.NET 2.0入门与提高系列课程(视频课程讲师:徐栋)

    ASP.NET 2.0入门与提高系列课程(1):揭开Orcas神秘的面纱.zip 讲座内容:做为Visual Studio和.NET Framework下一个版本的"Orcas"吊 ...

  3. 【Python数据科学快速入门系列 | 06】Matplotlib数据可视化基础入门(一)

    这是机器未来的第52篇文章 原文首发地址:https://robotsfutures.blog.csdn.net/article/details/126899226 <Python数据科学快速入 ...

  4. 《深入浅出WPF》系列视频(特辑)——MVVM入门与提高(难度300+)

    原文地址为: <深入浅出WPF>系列视频(特辑)--MVVM入门与提高(难度300+) <深入浅出WPF>系列视频(特辑)--MVVM入门与提高(难度300+) 一年多没有推出 ...

  5. 关东升的iOS实战系列图书 《iOS实战:入门与提高卷(Swift版)》已经上市

                承蒙广大读者的厚爱我的 <iOS实战:入门与提高卷(Swift版)>京东上市了,欢迎广大读者提出宝贵意见.http://item.jd.com/11766718 ...

  6. mysql入门很简单系列视频-学习笔记

    mysql入门很简单系列视频-学习笔记 视频链接:mysql入门很简单系列视频 https://www.bilibili.com/video/av14920200/ 以前主要就了解DDL.DML.DC ...

  7. 体系解读罗克韦尔MES平台FTPC-跟我入门MES/MOM系列特别篇

    写在面前 前面我们介绍了西门子.罗克韦尔.施耐德.达索等巨头的MES/MOM平台: 最全解读西门子MES/MOM平台Opcenter,100多亿美金的数字化之路 Wonderware MES-施耐德M ...

  8. 零基础编程入门python视频-Python编程零基础小白快速入门完整全系列精品课

    1. 课程咨询加老师助理微信:助理1微信: chenjinglei88 ,助理2微信: omf6757 2. 决定购买并想得到陈敬雷老师亲自指导(课程或自己项目难题均可)加老师微信: chenjing ...

  9. Docker 实战教程之从入门到提高 (五)

    本系列的前四篇文章,我们学习了如何在 Ubuntu 操作系统安装 Docker,并且通过实战练习,了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的 ...

  10. Docker 实战教程之从入门到提高 (四)

    本系列的前三篇文章,我们学习了如何在 Ubuntu 操作系统安装 Docker,并且通过实战练习,了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的 ...

最新文章

  1. python 字符串拼接
  2. flask_restplus的fields中怎么定义字典_Quora | 成功的定义是什么?
  3. Struts2 Hibernate Spring 整合的基本流程和步骤及其相关配置细节
  4. CF 287(div 2) B Amr and Pins
  5. 12-1 12 防盗链 访问控制 php解析 代理
  6. 如何给对方邮箱发照片_朋友圈如何发心形拼图九宫格照片?
  7. js获取页面宽度给JS div设宽度
  8. c语言输出中文为乱码_C语言输出乱码问题
  9. 基于stm32的银行排队叫号机设计
  10. 邮件群发系统 php,QQ邮箱群发PHP源码
  11. app store 注册账号生成证书上传app完整的教程
  12. php把十二生肖排列,12生肖怎么排 十二生肖如何排序
  13. MATLAB画立体包络图
  14. 自动计算所有包围盒的中心点
  15. setTimeout/setIntervel 的类型定义
  16. 用R语言建立logistic回归模型
  17. c语言水果程序,C语言写的简易水果管理系统
  18. 人脸活体检测资料整理
  19. 广告业务系统 之 辅助决策 —— “ AB 实验平台”
  20. c语言如何重命名文件夹,VC 复制移动删除重命名文件文件夹

热门文章

  1. puppet知识简记
  2. F - Game on Plane ( SG博弈 )
  3. Java项目(前端vue后台java微服务)在线考试系统(java+vue+springboot+mysql+maven)
  4. JNI数据与方法操作实例
  5. COSTDOWN版本的NRF51802和NRF51822的复位问题
  6. 王者荣耀服务器维护什么时间结束,3月26日全服不停机更新公告
  7. 鸿蒙会出电脑系统吗,鸿蒙有没有可能出PC操作系统?
  8. 江西省九江市瑞昌市高考成绩查询2021,2021江西省地区高考成绩排名查询,江西省高考各高中成绩喜报榜单...
  9. java forward怎么用_【后端开发】java中forward是什么
  10. 2020年4大安全会议及论文