lakshjaisinghani
lakshjaisinghani

Reputation: 181

How do I continue my program to run even when my MQTT client does not connect?

I'm writing a python program that runs on the raspberry pi and connects to the pic-camera. As I'm using MQTT, when the client does not connect by program freezes. is there any way to continue to run the program even if the client does not connect, i.e. I don't receive any data but the camera still runs.

As an example, how do I print x even if the client does not connect?

import time
import paho.mqtt.client as mqtt
import json


def on_connect(client, userdata, rc):
    print ("Connected with rc: " + str(rc))
    client.subscribe("demo/test1")

def on_message(client, userdata, msg):
    data_json = msg.payload
    data = json.loads(data_json)

print(data['ant_plus_power'])

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

x = client.connect("118.138.47.99", 1883, 60)
print(x)

client.loop_forever()

Upvotes: 3

Views: 2662

Answers (1)

glhr
glhr

Reputation: 4537

Edit: I ran your code on my end and I get a TimeoutError exception after about 30 seconds: "A connection attempt failed because the connected party did not properly respond after a period of time". You need to handle that exception in your code, so that the program continues running even when it fails to connect:

try:
    client.connect("118.138.47.99", 1883, 60)
    client.loop_forever()
except:
    print("failed to connect, moving on")

print("rest of the code here")

This outputs:

failed to connect, moving on
rest of the code here

However, using connect() and loop_forever() isn't suitable for your needs since they are blocking functions (meaning, they block the execution of your code and prevent it from doing anything else). With the code above, if the client successfully connects, print("rest of the code here") will never be reached due to loop_forever().

Instead, try using connect_async() in conjunction with loop_start() to connect in a non-blocking manner (meaning, your program can continue doing other things while attempting to connect in the background):

client.connect_async("118.138.47.99", 1883, 60)
client.loop_start()

print("rest of the code here")

while True:
    time.sleep(1)

This outputs rest of the code here and continues running indefinitely (in the infinite while loop) regardless of whether the connection was successful or not.

Note that your on_connect() definition is missing one argument. It should be:

on_connect(client, userdata, flags, rc)

Also it might be a good idea to check the return code of on_connect, and only subscribe if the connection is successful:

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        client.connected_flag = True # set flag
        print("Connected OK")
        client.subscribe("demo/test1")
    else:
        print("Bad connection, RC = ", rc)
        mqtt.Client.bad_connection_flag = True

# create flags so you can check the connection status throughout the script
mqtt.Client.connected_flag = False 
mqtt.Client.bad_connection_flag = False

See https://www.eclipse.org/paho/clients/python/docs/ and http://www.steves-internet-guide.com/client-connections-python-mqtt/.

For quickly testing a successful connection, you can connect to test.mosquitto.org (see https://test.mosquitto.org/).

Upvotes: 3

Related Questions