【问题标题】:Reading subscribed MQTT messages after reconnect重新连接后读取订阅的 MQTT 消息
【发布时间】:2021-03-14 13:35:52
【问题描述】:

我正在尝试读取 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 墙上的浏览器中看到它们

【问题讨论】:

  • self.mqttClient.subscribe(TopicName) 将默认为 QOS 0,spec 不要求代理在此 QOS 级别保留消息。试试 QOS 1/2(例如subscribe(TopicName, qos=1))。

标签: python mqtt paho


【解决方案1】:

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

这意味着订阅的调用将

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

【讨论】:

  • 我不知道,谢谢。 on_connect 重新连接后仍被调用?
【解决方案2】:

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

【讨论】:

  • 不接收对我来说很好,因为消息在 10 分钟内发送一次,并且丢失一些比计算两次要好,所以保留标志在这里是不行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多