重新连接后读取订阅的 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()
回调中。
这意味着订阅调用将
- 始终等到连接完成
- 重新连接时自动再次调用
我正在尝试读取 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()
回调中。
这意味着订阅调用将
- 始终等到连接完成
- 重新连接时自动再次调用