重新连接后读取订阅的 MQTT 消息

Reading subscribed MQTT messages after reconnect

我正在尝试读取 MQTT 服务器上的消息。在某些情况下,连接不稳定,需要重新连接。但是重新连接后,我无法收到来自我之前订阅的主题的任何消息。我正在使用 paho 的 python 包来处理 MQTT 连接。这是我正在使用的一些代码

TopicName='some/topic/name'

class Counter:
    def __init__(self, mqttClient):
        self.messages_recieved = 0
        self.mqttClient = mqttClient
        self.mqttClient.subscribe(TopicName)
        self.mqttClient.on_message = self.on_message
        self.mqttClient.on_disconnect = self.on_disconnect
        self.mqttClient.loop_start()

    def on_message(self, client, userdata, message):
        self.messages_received += 1

    def on_disconnect(self, client, userdata, rc):
        if rc != 0:
            print("Trying to reconnect")
            while not self.mqttClient.is_connected():
                try:
                    self.mqttClient.reconnect()
                except OSError:
                    pass

如果我的互联网出现故障,我将无法再接收消息。我试图再次订阅该主题,我也试图在 on_disconnect 方法中调用 loop_start,但都没有用。任何解决方案都会有所帮助。还要指出正在发送消息,我可以在 MQTT 墙上的浏览器中看到它们

不确定您使用的是什么模块,但如果您断开连接,大多数都会要求您重新订阅。在您的 .reconnect() 调用之后添加您的 subscribe() 调用,您应该一切顺利。另外,请记住,在 QOS 级别 0 时,代理在您断开连接时收到的任何消息,您的客户端都不会收到……只有在客户端订阅时才会收到消息。如果使用 Retain 标志发布消息,您的客户将收到经纪人收到的最后一条消息......即使客户之前收到过它。

您没有显示调用连接的位置,但通常的安全模式是将对 subscribe() 的调用放在附加到客户端的 on_connect() 回调中。

这意味着订阅调用将

  1. 始终等到连接完成
  2. 重新连接时自动再次调用