解决mqtt有时候收不到消息

项目场景:

mqtt订阅之后有时候收不到消息

使用测试工具发订阅消息


问题描述

mqtt订阅之后有时候收不到消息

原因分析:

cleanSession: true

每次客户端 连接到 MQTT Broker 时,都会创建一个新的会话,原来的订阅、未完成的 QoS1、QoS2 消息会全部丢弃。


解决方案:

cleanSession: false

  • 持久化会话,当客户端断开后,Broker 仍然会保留客户端的订阅关系和 QoS1/QoS2 等未收到的消息。
  • 断线后,Broker 会继续为该客户端缓存消息,下次该客户端用同一个 clientId 重新连接后,会收到断线期间的消息。
### MQTT 数据接收流程概述 MQTT 是一种基于 C/S 架构的发布/订阅模式的消息传输协议,其核心设计目标是轻量级、易实现和高效运行[^2]。为了理解 MQTT 的数据接收过程,可以将其分为以下几个主要阶段: #### 1. 客户端连接到服务器 客户端通过 TCP/IP 协议建立与 MQTT Broker 的网络连接,并发送 CONNECT 报文来发起会话请求。CONNECT 报文中包含了客户端的身份标识(Client ID)、用户名密码(可选)以及其他配置参数。 Broker 接收并验证 CONNECT 报文后返回 CONNACK 报文,告知客户端连接状态是否成功。如果认证失败,则断开连接;否则进入下一步操作[^4]。 #### 2. 订阅主题 (Subscribe) 当需要接收特定类型的数据时,客户端向 Broker 发送 SUBSCRIBE 报文指定感兴趣的一个或多个主题名称及其 QoS 等级。Broker 将记录该映射关系以便后续分发匹配的消息给对应订阅者列表中的成员[^2]。 每次成功订阅都会触发一个 SUBACK 响应包回传至发出方确认级别设置情况[^4]。 #### 3. 消息传递机制 一旦某个已注册过的 Topic 下产生了新事件或者更新内容,生产者的应用层就会构建 PUBLISH 指令连同负载一起递交出去。经过路由分析之后找到所有符合条件的目标消费者群体并将副本逐一投递给它们[^2]。 在这个过程中可能会涉及到持久化存储功能用于处理离线用户的缓存需求以及保障高可靠性通讯链路下的重复交付控制等问题解决办法。 #### 4. 处理接收到的信息 最终,当目标节点实际获取到来自远程源端推送过来的有效载荷部分时候,就可以依据业务逻辑做进一步解析运算等工作了。例如,在 Python 中可以通过回调函数捕获这些动态变化的通知实例[^3]。 ```python def on_message(client, userdata, message): log.info(f"收到消息 {str(message.payload.decode('utf-8'))} ,开始执行命令") print(f"{message.topic}: {str(message.payload.decode('utf-8'))}") if str(message.topic) == 'sync-single-work': process_command(str(message.payload.decode('utf-8'))) ``` 以上代码片段展示了如何定义 `on_message` 函数作为每当有新的消息到达时被调用的方法之一。 --- ### 总结 综上所述,整个 MQTT 数据接收流程大致可分为四个关键环节:首先是创建可靠的物理信道关联;接着明确表达自身的关注领域范围;再由系统自动完成信息筛选分类后的精准投放动作;最后落实具体的应用场景适配转换工作以满足不同场合下多样化的要求[^2][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值