MQTT订阅主题就会收到消息的问题--Retained

项目中本地作为MQTT的订阅者和发送者,接收订阅消息处理后发往云服务端。订阅主题后会收到服务器消息,原因是publish数据时设置了Retained。设置该参数后,客户端订阅主题会收到之前设置Retained的publish数据。解决办法是发无数据且Retained为false的消息,后续publish不带Retained或代码里设为false。
部署运行你感兴趣的模型镜像

MQTT订阅主题就会收到消息的问题–Retained

之前的项目使用了mqtt消息队列作为第三方消息的接收和发送,本地作为mqtt的订阅者也作为发送者。
本地本地接受到mqtt订阅的消息,作处理后再重新发送到云服务端。这里遇到一个坑(其实是自己造成的),在订阅主题后就会收到mqtt服务器发送的消息,查找资料后发现是在publish某条数据时,设置了Retained(默认是ture,这里选择后为false)。
在这里插入图片描述
详细资料可以查看https://blog.youkuaiyun.com/libaineu2004/article/details/78667726
大意是设置了Retained,那每次有客户端订阅该主题,就会发送你之前设置了Retained的publish的数据。
解决的办法就是再publish一条无数据的带Retained(false)的消息即可。
在这里插入图片描述
之后再publish就不要带Retained![在这里插入图片描述](https://img-blog.csdnimg.cn/20190530100013360.png
或者在代码里设置MqttMessage的Retained为false。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>好的,我现在需要解决用户的问题MQTT客户端在发布消息到某个主题时,如何避免接收到自己发布的消息。这个问题我之前可能接触过,但需要仔细分析协议规范和客户端实现方式。 首先,回忆一下MQTT的基本机制。当客户端发布消息到一个主题时,如果它自己订阅了这个主题,Broker默认会将消息转发给所有订阅者,包括发布者自己。这可能导致消息循环或其他问题。用户希望过滤掉自己发布的消息,避免这种情况。 接下来,我需要确定MQTT协议是否有内置的机制来处理这个问题。比如,是否有一些标志或选项可以在发布时设置,让Broker不将消息返回给发布者。查阅MQTT协议文档,发现MQTT v5.0引入了“No Local”选项,订阅时设置这个选项可以让Broker不发送该客户端自己发布的消息到该订阅。而MQTT v3.x版本可能不支持这个特性,这时候可能需要其他方法。 然后,考虑用户使用的MQTT版本。如果用户使用的是v5.0,解决方案就比较直接,通过配置订阅选项即可。但如果是v3.1.1或更早的版本,可能需要客户端在应用层处理,比如在消息中添加标识符,客户端收到消息后检查是否是自己发出的,然后选择忽略。 另外,用户可能使用的客户端工具是否支持这些特性?比如引用中提到的MQTTX和MQTT-Explorer,查看它们的文档,看看是否有相关设置。例如,MQTTX作为支持MQTT5的客户端,可能在订阅时可以设置No Local选项。而MQTT-Explorer可能因为版本限制或功能不支持,需要其他处理方式。 还需要考虑消息的Payload是否有唯一标识符,例如在发布的消息中包含Client ID或某个UUID,订阅者在接收消息时检查该标识符,若匹配则丢弃。这种方法需要客户端在发布和订阅时都做处理,适用于所有MQTT版本,但增加了应用层的逻辑。 总结可能的解决方案:1. 使用MQTT v5的No Local选项;2. 在应用层添加消息过滤;3. 客户端工具是否支持相关配置。需要向用户说明不同版本的解决方法,并推荐最合适的方案。 可能还需要提醒用户检查Broker是否支持MQTT v5,因为即使客户端支持,Broker也必须支持才能使用No Local选项。如果用户的环境无法升级到v5,那么只能采用应用层过滤的方法。 最后,生成相关问题,帮助用户深入了解相关主题,比如性能影响、其他过滤方法或不同客户端的配置步骤。</think>针对MQTT客户端发布消息接收自身消息问题,可通过以下两种核心方案实现消息过滤: ### 一、MQTT v5.0协议原生支持方案 在MQTT v5.0中,订阅时可设置`NO_LOCAL`标志,该选项能直接阻止客户端接收自己发布的消息: $$ \text{SUBSCRIBE Packet} \rightarrow \text{Subscription Options} \rightarrow \text{No Local = 1} $$ **实现步骤**: 1. 客户端订阅主题时添加`No Local`选项 2. Broker自动过滤来自该客户端的发布消息 3. 该功能需要同时满足: - Broker支持MQTT v5.0协议(如EMQX 5.0+、HiveMQ 4.0+) - 客户端工具支持设置订阅选项(如MQTTX客户端支持该配置) ### 二、应用层标识过滤方案(兼容所有版本) 对于MQTT v3.x及以下版本,可通过消息元数据标识实现过滤: 1. **消息添加唯一标识**: ```python # 发布时注入client_id payload = { "sender": "client123", "data": "message content" } client.publish("topic", json.dumps(payload)) ``` 2. **订阅端过滤逻辑**: ```python def on_message(client, userdata, msg): message = json.loads(msg.payload) if message.get("sender") != current_client_id: process_message(message) ``` ### 三、客户端工具配置示例 以MQTTX(支持v5.0)为例: 1. 创建新连接时选择MQTT版本5.0 2. 订阅主题时勾选"No Local"选项 3. 发布消息至已订阅主题时将自动过滤自身消息[^4] ### 四、方案对比 | 方案 | 协议要求 | 实现复杂度 | 消息开销 | 可靠性 | |------|----------|------------|----------|--------| | MQTT v5原生 | 需要v5.0支持 | 低 | 无额外开销 | 高 | | 应用层过滤 | 全版本兼容 | 中 | 增加元数据 | 依赖实现 | **建议优先使用v5.0原生方案**,若环境受限则采用应用层过滤。注意保留消息Retained Message)仍需特殊处理,建议通过`$SYS`主题监控消息流[^1]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值