在这篇文章中,我们将重点介绍 MQTT 中的发布、订阅和取消订阅。在本系列的前面,我们介绍了发布/订阅模型的基础知识。在这篇文章中,我们深入探讨了 MQTT 协议中发布/订阅的细节。如果您还没有阅读有关发布/订阅模式的基础知识,我们强烈建议您先阅读该文章。

发布

MQTT 客户端可以在连接到代理后立即发布消息。MQTT 在代理上利用基于主题的消息过滤。每条消息都必须包含一个主题,代理可以使用该主题将消息转发给感兴趣的客户端。通常,每条消息都有一个有效载荷,其中包含要以字节格式传输的数据。MQTT 与数据无关。客户端的用例决定了有效负载的结构。发送客户端(发布者)决定是否要发送二进制数据、文本数据,甚至是成熟的 XML 或 JSON。

MQTT 中的 PUBLISH 消息有几个我们要详细讨论的属性:

数据包标识符 数据包标识符唯一地标识一条消息,因为它在客户端和代理之间流动。数据包标识符仅与大于零的 QoS 级别相关。客户端库和/或代理负责设置此内部 MQTT 标识符。

主题名称 主题名称是一个简单的字符串,它以正斜杠作为分隔符进行分层结构。例如,“myhome/livingroom/temperature”或“Germany/Munich/Octoberfest/people”。详细信息会在第5节中进行介绍。

服务质量级别 QoS 此数字表示消息的服务质量级别 (QoS)。共有三个级别:0、1 和 2。服务级别决定了消息对于到达预期接收者(客户端或代理)的保证类型。有关 QoS 的详细信息,第6节中将会进行介绍。

保留标志 此标志定义消息是否由代理保存为指定主题的最后一个已知良好值。当新客户端订阅某个主题时,他们会收到保留在该主题上的最后一条消息。有关保留消息的详细信息,第8节中将会进行介绍。

Payload 这是消息的实际内容。MQTT 与数据无关。可以发送任何编码的图像、文本、加密数据以及几乎所有二进制数据。

DUP 标志 该标志表示消息是重复的,并且由于预期的接收者(客户端或代理)没有确认原始消息而被重新发送。这仅与大于 0 的 QoS 相关。通常,重新发送/复制机制由 MQTT 客户端库或代理作为实现细节处理。有关更多信息,请参考第6节内容。

当客户端向MQTT 代理发送消息以进行发布时,代理读取消息、确认消息(根据 QoS 级别)并处理消息。代理的处理包括确定哪些客户端已订阅该主题并将消息发送给他们。

最初发布消息的客户端只关心将 PUBLISH 消息传递给代理。代理收到 PUBLISH 消息后,有责任将消息传递给所有订阅者。发布客户端不会收到任何关于是否有人对发布的消息感兴趣或有多少客户端从代理收到消息的反馈。

订阅

如果没有人收到消息,那么发布消息就没有意义。换句话说,如果没有客户端订阅消息的主题。要接收有关感兴趣主题的消息,客户端会向MQTT 代理发送一条SUBSCRIBE消息。这个订阅消息非常简单,它包含一个唯一的数据包标识符和一个订阅列表。

数据包标识符 数据包标识符唯一地标识一条消息,因为它在客户端和代理之间流动。客户端库和/或代理负责设置此内部 MQTT 标识符。

订阅列表 一条 SUBSCRIBE 消息可以包含一个客户端的多个订阅。每个订阅都由一个主题和一个 QoS 级别组成。订阅消息中的主题可以包含通配符,使订阅主题模式而不是特定主题成为可能。如果一个客户端有重叠订阅,则代理会传递该主题的具有最高 QoS 级别的消息。

订阅反馈

为了确认每个订阅,代理向客户端发送一个SUBACK确认消息。此消息包含原始订阅消息的数据包标识符(以清楚地识别消息)和返回代码列表。

数据包标识符 数据包标识符是用于标识消息的唯一标识符。它与 SUBSCRIBE 消息中的相同。

返回代码 代理为它在 SUBSCRIBE 消息中收到的每个主题/QoS 对发送一个返回代码。例如,如果 SUBSCRIBE 消息有五个订阅,则 SUBACK 消息包含五个返回码。返回代码确认每个主题并显示代理授予的 QoS 级别。如果代理拒绝订阅,则 SUBACK 消息包含该特定主题的失败返回代码。例如,如果客户端没有足够的权限订阅主题或主题格式错误。

返回码 返回码响应
0 成功 - 最大 QoS 0
1 成功 - 最大 QoS 1
2 成功 - 最大 QoS 2
128 失败

客户端成功发送 SUBSCRIBE 消息并收到 SUBACK 消息后,它会获取与 SUBSCRIBE 消息包含的订阅中的主题匹配的每条已发布消息。

退订

SUBSCRIBE 消息的对应物是UNSUBSCRIBE消息。此消息删除代理上客户端的现有订阅。UNSUBSCRIBE 消息与 SUBSCRIBE 消息类似,具有包标识符和主题列表。

数据包标识符 数据包标识符唯一地标识一条消息,因为它在客户端和代理之间流动。客户端库和/或代理负责设置此内部 MQTT 标识符。

主题 列表 主题列表可以包含客户端想要取消订阅的多个主题。只需发送主题(无 QoS)。无论最初订阅的 QoS 级别如何,代理都会取消订阅该主题。

退订反馈

为了确认取消订阅,代理向客户端发送一个UNSUBACK确认消息。此消息仅包含原始 UNSUBSCRIBE 消息的数据包标识符(以清楚地识别消息)。

包标识符 包标识符唯一地标识消息。如前所述,这与 UNSUBSCRIBE 消息中的数据包标识符相同。

客户端收到代理的 UNSUBACK 后,可以假设 UNSUBSCRIBE 消息中的订阅被删除。

MQTT 基础--MQTT 发布、订阅和取消订阅 :第 4 部分相关推荐

  1. 【MQTT基础篇(五)】发布、订阅和取消订阅

    文章目录 发布.订阅和取消订阅 1 PUBLISH – 发布消息 1.1 topicName – 主题名 1.2 QoS – 服务质量等级 1.3 packetId – 报文标识符 1.4 retai ...

  2. MQTT协议-取消订阅和取消订阅确认

    MQTT协议-取消订阅和取消订阅确认 客户端向服务器取消订阅 取消订阅的前提是客户端已经通过CONNECT报文连接上服务器,并且订阅了一个主题 UNSUBSCRIBE-取消订阅 取消订阅的报文同样是由 ...

  3. 学习太极创客 — MQTT(五)发布、订阅和取消订阅

    视频链接:https://www.bilibili.com/video/BV1G541157NZ/?spm_id_from=333.788.recommend_more_video.-1&vd ...

  4. MQTT发布订阅和取消订阅

    在之前的课程里,我们学习了如何使用MQTT客户端连接MQTT服务端.在这节课里,我们学习客户端如何实现发布消息.订阅主题以及取消订阅主题.在本节课里我们将重点讲解以下MQTT报文: PUBLISH – ...

  5. 1.4 发布、订阅和取消订阅

    文章目录 PUBLISH – 发布消息 topicName – 主题名 QoS – 服务质量等级 packetId – 报文标识符 retainFlag – 保留标志 Payload – 有效载荷 d ...

  6. 关于Linux邮件列表的订阅与取消订阅具体方法

    学习Linux内核可以订阅Linux的邮件列表,订阅的方法如下: 1.登录网站:http://vger.kernel.org/vger-lists.html 2.选择用户感兴趣的Linux内核模块,例 ...

  7. Linux邮件列表的订阅与取消订阅

    学习Linux内核可以订阅Linux的邮件列表,订阅的方法如下: 1.登录网站:http://vger.kernel.org/vger-lists.html 2.选择用户感兴趣的Linux内核模块,例 ...

  8. mqtt session保持 订阅消息_MQTT系列 | MQTT消息的发布和订阅

    1. MQTT的发布 MQTT发布中最重要的是PUBLISH数据包,PUBLISH数据包是用于sender和receiver之间传输消息数据的.当Publisher要向某个Topic发布一条消息的时候 ...

  9. MQTT协议之发布订阅

    女主宣言 在之前的文章中,我们介绍了MQTT如何创建客户端与服务端,接下来就是如何进行消息的传递,本篇文章将进一步介绍MQTT的发布和订阅细节. PS:丰富的一线技术.多元化的表现形式,尽在" ...

  10. mqtt 传文件断开连接的原因_MQTT——取消订阅报文和断开连接报文

    笔者已经把连接报文,订阅报文,发布报文都讲解了完了.而接下来就是取消订阅报文和断开连接报文.和其他的报文比较的话,他们显示非常简单.甚至笔者觉得可以不必要拿出来讲.只要看一下MQTT文档就没有什么不清 ...

最新文章

  1. 【Dlib】dlib和opencv的互转
  2. ethereumjs/ethereumjs-vm-2-API文档
  3. rocketmq同步发送超时时间_RocketMQ系列(一)基本概念
  4. raid5数据恢复方法,服务器磁盘阵列数据恢复成功案例
  5. Linux Top 命令解析 比较详细
  6. VTK:小部件之ImageTracerWidget
  7. java开发工具包jdk包括哪些
  8. 任正非:做芯片砸钱不行 得砸数学家、物理学家、化学家
  9. 【ASP.NET Core】处理异常(下篇)
  10. 20200224:跳跃游戏(leetcode55)
  11. 常见问题与常见算法的时间复杂度
  12. EOSPlatform+Dubbo+Zookeeper最佳实践
  13. 如何更新 Ubuntu Linux
  14. 穿越机用途和机架尺寸
  15. EXCEL去掉所有英文
  16. HearthBuddy卡牌无法识别
  17. 项目经历——地图定位神器
  18. LDA 与 KNN 算法
  19. 正则表达式中/g的用法
  20. 【XSY3490】线段树(广义线段树,树上莫队)

热门文章

  1. 有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。 现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠。 (老鼠的使用量越少越好,注意,毒性1周后才会发作,而且一周后必须出
  2. TDXWIN®-WAD新型智能轮轴识别器
  3. 专车数据层「架构进化」往事
  4. CENTOS7架设邮件服务器(实测1000以上用户)postfix+dovecot+cyrus-sasl+openwebmail
  5. python可视化库_Python中除了matplotlib外还有哪些数据可视化的库?
  6. 如何在直播教学中保护你的隐私?
  7. Spring Boot 静态资源和拦截器处理
  8. 智能优化算法:白鲨优化算法-附代码
  9. 【极客营】LINQ入门篇—LINQ,类似SQL的集成化查询语言
  10. 计算机工程师属于什么职积,阿里巴巴JAVA工程师面试经验