You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QoS为2时MQTT无法发送数据问题求助

解决MQTT QoS 2无法发送数据的问题

你的代码核心问题是没有启动MQTT客户端的网络循环。MQTT QoS 2的消息传递需要客户端与Broker完成四次握手的确认流程,这个流程依赖客户端的网络循环来处理收发的控制报文。QoS 0/1之所以能临时工作,是因为它们的确认逻辑更简单,但这并不是规范用法,场景复杂时必然出问题。

修改步骤:

  1. 连接Broker后启动后台网络循环,让客户端自动处理消息交互
  2. 断开连接前先停止网络循环,避免资源泄漏
  3. 可选:等待QoS 2的发布流程完成,确保消息被Broker确认

修改后的完整代码:

from paho.mqtt import client as mqtt


class MqttClient:
    """ Manage connection """

    def __init__(self, clientId, port, ip) -> None:
        self.clientId = clientId
        self.port = port
        self.broker = ip
        self.connect()

    def connect(self):
        """ Connects to an mqtt client """
        client = mqtt.Client(client_id=self.clientId)
        client.connect(self.broker, self.port)
        client.loop_start()  # 启动后台线程处理网络循环
        self._client = client

    def pub(self, topic: str, payload: str):
        result = self.client.publish(topic, payload, qos=2)
        result.wait_for_publish()  # 等待QoS 2的发布流程完成

    def disconnect(self):
        self.client.loop_stop()  # 先停止网络循环
        self.client.disconnect()

    @property
    def client(self):
        return self._client

关键说明:

  • loop_start():启动后台线程,自动处理MQTT心跳、消息确认等网络操作,这是QoS 2流程必须的环节
  • wait_for_publish():阻塞当前线程直到Broker确认消息接收完成,确保QoS 2的可靠性要求被满足
  • loop_stop():断开连接前停止后台循环,避免线程资源无法正常释放

内容的提问来源于stack exchange,提问作者santhosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:28:14