Ondřej Chládek
Ondřej Chládek

Reputation: 45

Reading subscribed MQTT messages after reconnect

I am trying to read messages on a MQTT server. In some cases, the connection is unstable and requires to reconnect. But after reconnect, I am not able to receive any message from the topic that I previously subscribed to. I am using paho's python package to handle MQTT connection. Here is some code I am using

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

If my internet goes down, I am no longer able to receive messages. I have tried to subscribe again to the topic, also I have tried to call loop_start in the on_disconnect method, neither of those worked. Any solution would be helpful. Also to point out messages are being sent, I can see them in the browser on MQTT wall

Upvotes: 2

Views: 2024

Answers (2)

hardillb
hardillb

Reputation: 59608

You have not shown where you are calling connect, but the usual safe pattern is to put the calls to subscribe() in the on_connect() callback attached to the client.

This means that calls to subscribe will

  1. Always wait until the connection has completed
  2. Get called again automatically when a reconnect had happend

Upvotes: 3

JD Allen
JD Allen

Reputation: 944

Not sure what module you are using, but most will require you to re-subscribe if you disconnect. Add your subscribe() call after your .reconnect() call and you should be good to go. Also, keep in mind that at QOS level 0, any messages that the broker received while you were disconnect, your client will NOT receive...only messages while the client is subscribed will be received by your client. If messages are published with the Retain flag, you client will receive the LAST one received by the broker...even if the client previously received it.

Upvotes: 0

Related Questions