MQTT 订阅选项的使用

这篇具有很好参考价值的文章主要介绍了MQTT 订阅选项的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 MQTT 发布/订阅模式介绍这篇博客中,我们已经了解到,我们需要先向服务端发起订阅,才能从服务端接收对应的消息。如果说订阅时指定的主题过滤器决定了服务端将向我们转发哪些主题下的消息,那么订阅选项则是允许我们进一步定制服务端的转发行为。

在本文中,我们将重点介绍在 MQTT 中哪些订阅选项可供我们使用,以及它们的使用方法。

订阅选项

在 MQTT 中,一个订阅由一个主题过滤器和对应的订阅选项组成。所以理论上,我们可以为每个订阅都设置不同的订阅选项。

MQTT 5.0 提供了 4 个订阅选项,分别是 QoS、No Local、Retain As Published、Retain Handling,而 MQTT 3.1.1 则仅提供了 QoS 这一个订阅选项。不过这些 MQTT 5.0 新增的订阅选项的默认行为,仍与 MQTT 3.1.1 保持一致,如果你正准备从 MQTT 3.1.1 升级到 MQTT 5.0,这会非常地友好。

现在,让我们一起看看这些订阅选项的作用吧。

QoS

QoS 是最常用的一个订阅选项,它表示服务端在向订阅端发送消息时可以使用的最大 QoS 等级。

客户端可能会在订阅时指定一个小于 2 的 QoS,因为它的实现不支持 QoS 1 或者 QoS 2。而如果服务端支持的最大 QoS 小于客户端订阅时请求的最大 QoS,那么显然服务端将无法满足客户端的要求,这时服务端就会通过订阅的响应报文(SUBACK)告知订阅端最终授予的最大 QoS 等级,订阅端可以自行评估是否接受并继续通信。

MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

一个简单的计算公式:

服务端最终授予的最大 QoS = min ( 服务端支持的最大 QoS, 客户端请求的最大 QoS )

但是,我们在订阅时请求的最大 QoS,并不能限制发布端发布消息时使用的 QoS。当我们订阅时请求的最大 QoS,小于消息发布时的 QoS 时,为了尽可能地投递消息,服务端不会忽略这些消息,而是会在转发时对这些消息的 QoS 进行降级处理。

MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

同样,我们也有一个简单的计算公式:

消息被转发时的 QoS = min ( 消息原始的 QoS, 服务端最终授予的最大 QoS )

No Local

No Local 只有 0 和 1 两个可取值,为 1 表示服务端不能将消息转发给发布这个消息的客户端,为 0 则相反。

这个选项通常被用在桥接场景中。桥接本质上是两个 MQTT Server 建立了一个 MQTT 连接,然后相互订阅一些主题,Server 将客户端的消息转发给另一个 Server,而另一个 Server 则可以将消息继续转发给它的客户端。

MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

那么最简单的一个例子,我们假设两个 MQTT Server 分别是 Server A 和 Server B,它们分别向对方订阅了 # 主题。现在,Server A 将一些来自客户端的消息转发给了 Server B,而当 Server B 查找匹配的订阅时,Server A 也会位于其中。如果 Server B 将消息转发给了 Server A,那么同样 Server A 在收到消息后又会把它们再次转发给 Server B,这样就陷入了无休止的转发风暴。

而如果 Server A 和 Server B 在订阅 # 主题的同时,将 No Local 选项设置为 1,就可以完美地避免这个问题。

Retain As Published

Retain As Published 同样只有 0 和 1 两个可取值,为 1 表示服务端在向此订阅转发应用消息时需要保持消息中的 Retain 标识不变,为 0 则表示必须清除。

Retain As Published 与 No Local 一样,同样也是主要适用于桥接场景。我们知道当服务端收到一条保留消息时,除了将它存储起来,还会将它像普通消息一样转发给当前已经存在的订阅者,并且在转发时会清除消息的 Retain 标识。

这在桥接场景下带来了一些问题。我们继续沿用前面的设定,当 Server A 将保留消息转发给 Server B 时,由于消息中的 Retain 标识已经被清除,Server B 将不会知道这原本是一条保留消息,自然不会再存储它。这就导致了保留消息无法跨桥接使用。

那么在 MQTT 5.0 中,我们可以让桥接的服务端在订阅时将 Retain As Published 选项设置为 1,来解决这个问题。

MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

Retain Handling

Retain Handling 这个订阅选项被用来向服务端指示当订阅建立时,是否需要发送保留消息。

我们知道默认情况下,只要订阅建立,那么服务端中与订阅匹配的保留消息就会下发。

但某些时候,客户端可能并不想接收保留消息,比如客户端在连接时复用了会话,但是客户端无法确认上一次连接中是否成功创建了订阅,所以它可能会再次发起订阅。如果订阅已经存在,那么可能保留消息已经被消费过了,也可能服务端已经在会话中缓存了一些离线期间到达的消息,这时客户端可能并不希望服务端发布保留消息。

另外,客户端也可能在任何时刻都不想收到保留消息,即使是第一次订阅。比如我们将开关状态作为保留消息发送,但对某个订阅端来说,开关事件将触发一些操作,那么在这种情况下不发送保留消息是很有用的。

这三种不同的行为,我们可以通过 Retain Handling 来选择。

  • 将 Retain Handling 设置为 0,表示只要订阅建立,就发送保留消息;

  • 将 Retain Handling 设置为 1,表示只有建立全新的订阅而不是重复订阅时,才发送保留消息;

  • 将 Retain Handling 设置为 2,表示订阅建立时不要发送保留消息。

演示

订阅选项 QoS 的演示

  1. 在 Web 浏览器上访问 MQTTX Web。

  2. 创建一个使用 WebSocket 的 MQTT 连接,并且连接免费的 公共 MQTT 服务器:

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

  3. 连接成功后,我们订阅主题 mqttx_4299c767/demo,并指定 QoS 为 0。由于公共服务器可能同时被很多人使用,为了避免主题与别人重复,我们可以将 Client ID 作为主题前缀:

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

  4. 订阅成功后,我们向主题 mqttx_4299c767/demo 发布一条 QoS 1 消息,这时我们将看到,我们发出的是 QoS 1 消息,但收到的却是 QoS 0 消息,这说明发生了 QoS 降级:

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

订阅选项 No Local 的演示

  1. 在 Web 浏览器上访问 MQTTX Web。

  2. 创建一个使用 WebSocket 的 MQTT 连接,并且连接免费的公共 MQTT 服务器。

  3. 连接成功后,我们订阅主题 mqttx_4299c767/demo,并且将 No Local 设置为 true:

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

  4. 订阅成功后,与前面 QoS 的演示一样,我们还是由订阅端自己来发布消息,但这一次我们会发现订阅端将无法收到消息:

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

订阅选项 Retain As Published 的演示

  1. 在 Web 浏览器上访问 MQTTX Web。

  2. 创建一个使用 WebSocket 的 MQTT 连接,并且连接免费的公共 MQTT 服务器。

  3. 连接成功后,我们先订阅主题 mqttx_4299c767/rap0,并且将 Retain As Published 设置为 false,然后订阅主题 mqttx_4299c767/rap1,并且将 Retain As Published 设置 true:

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

  4. 订阅成功后,我们分别向主题 mqttx_4299c767/rap0mqttx_4299c767/rap1 发布一条保留消息,我们将看到前者收到的消息中 Retain 标识被清除,而后者收到的消息中 Retain 标识被保留:

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

订阅选项 Retain Handling 的演示

  1. 在 Web 浏览器上访问 MQTTX Web。

  2. 创建一个使用 WebSocket 的 MQTT 连接,并且连接免费的公共 MQTT 服务器。

  3. 连接成功后,我们先向主题 mqttx_4299c767/rh 发布一条保留消息。然后订阅主题 mqttx_4299c767/rh,并且将 Retain Handling 设置为 0:

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

  4. 订阅成功后,我们将收到服务端发送的保留消息:

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

  5. 取消当前订阅,重新订阅主题 mqttx_4299c767/rh,并且将 Retain Handling 设置为 2。不过这一次订阅成功后,我们将不会收到服务端发送的保留消息:

    MQTT 订阅选项的使用,mqtt,MQTT,订阅选项

在 MQTTX 中,我们没有办法演示 Retain Handling 设置为 1 时的效果。不过你可以在 这里 获取订阅选项的 Python 示例代码。

版权声明: 本文为 EMQ 原创,转载请注明出处。
原文链接:https://www.emqx.com/zh/blog/an-introduction-to-subscription-options-in-mqtt文章来源地址https://www.toymoban.com/news/detail-588020.html

到了这里,关于MQTT 订阅选项的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文搞懂MQTT,如何在SpringBoot中使用MQTT实现消息的订阅和发布&MQTT 客户端重连

    简介: 之前介绍了RabbitMQ以及如何在SpringBoot项目中整合使用RabbitMQ,看过的朋友都说写的比较详细,希望再总结一下目前比较流行的MQTT。所以接下来,就来介绍什么MQTT?它在IoT中有着怎样的作用?如何在项目中使用MQTT? 之前介绍了RabbitMQ以及如何在SpringBoot项目中整合使用

    2024年02月05日
    浏览(46)
  • 使用Node.js连接和发布/订阅MQTT消息

    Node.js是一种基于事件驱动的异步I/O服务器端JavaScript运行环境,因为其非阻塞I/O和事件驱动模型,使得它非常适合处理大量并发请求的场景。MQTT是一种轻量级的消息传递协议,它是基于发布/订阅模式的,适用于传输小量数据,且具有低带宽、低电量消耗和可靠性高等特点。这

    2024年02月06日
    浏览(41)
  • vue2.0使用mqtt协议订阅阿里云物联网获取实时数据

    最近在公司要开发物联网项目,需要使用mqtt协议监听设备实时数据,因为要采用到后台展示不是很方便,可以使用阿里云服务器来做简单演示。 当然使用mqtt时需要两个软件结合使用,一个是 技小新MQTT编程工具 ,一个是 mqtt.fx 软件,为了方便大家下载,我把软件已经整理好

    2024年04月27日
    浏览(45)
  • 【物联网】手把手完整实现STM32+ESP8266+MQTT+阿里云+APP应用——第1节-阿里云配置+MQTT.fx模拟与使用AT命令发布订阅消息

    🌟博主领域:嵌入式领域人工智能软件开发 本节目标: 通过MQTT.fx模拟连接或通过串口连接ESP8266发送AT命令,实现阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266 ESP-01来连接网络,获取设备数据发送到阿里云物联网平台并显示且oled显

    2024年02月03日
    浏览(65)
  • MQTT-发布与订阅的报文

    MQTT发布订阅流程 在MQTT发布/订阅模式中,一个客户端既可以是发布者,也可以是订阅者,也可以同时具备这两个身份。当客户端发布一条消息时,它会被发送到代理,然后代理将消息路由到该主题的所有订阅者。当客户端订阅一个主题时,它会收到代理转发到该主题的所有消

    2023年04月21日
    浏览(32)
  • 【Python】Flask + MQTT 实现消息订阅发布

    本次项目主要使用到的库: flask_mqtt 1.创建Flask项目 2创建py文件: mqtt_demo.py 3.代码实现 4.项目运行 运行项目前可在Pycharm中设置 host 和 port 设置好后直接运行项目 使用 MQTTX 进行消息测试 1、测试消息接收 创建连接 Host :为代码中定义好的 broker.emqx.io Port :为代码中定义好的

    2024年02月04日
    浏览(48)
  • spring boot集成mqtt协议发送和订阅数据

    maven的pom.xml引入包 mqtt.yml配置文件 初始化MQTT配置bean mqtt发送数据网关配置 发送数据到mqtt伪代码 参考链接: https://blog.csdn.net/sinat_21184471/article/details/87186186 https://blog.csdn.net/qq_29467891/article/details/107043225?utm_source=app https://blog.csdn.net/myinsert/article/details/107715538

    2024年02月11日
    浏览(44)
  • MQTT记录(概述,docker部署,基于spring-integration-mqtt实现消息订阅与发布,客户端工具测试)

    需要spring-boot集成spring-integration-mqtt代码的直接跳到第5部分 1.1 MQTT是什么呢? message queue telemetry translation 是一种基于发布与订阅的轻量级消息传输协议.适用于低带宽或网络不稳定的物联网应用.开发者可以使用极少的代码来实现物联网设备之间的消息传输.mqtt协议广泛应用于物

    2024年02月12日
    浏览(47)
  • ESP32+MQTT+MySQL实现发布订阅【气味数据收集】

    🔮🔮🔮🔮🔮相关文章🔮🔮🔮🔮🔮 ESP32连接MQ Sensor实现气味反应 🔗 https://blog.csdn.net/ws15168689087/article/details/131365573 ESP32连接云服务器【WebSocket】 🔗 https://blog.csdn.net/ws15168689087/article/details/131406163 个人云服务器搭建MQTT服务器 🔗 https://blog.csdn.net/ws15168689087/article/details/

    2024年02月17日
    浏览(39)
  • 【Ubuntu搭建MQTT Broker及面板+发布消息、订阅主题】

    根据自己的服务器是否开始了防火墙放行端口(18083 默认面板端口) 访问:域名:18083 用户名是admin,初始密码是public。登陆后需要立即修改密码,还可以新增用户 至此搭建完成,我们使用本地的进行发布订阅测试 最后一个免费版本下载点击链接下载 https://newbie-typora.oss-cn-

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包