Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MQTT - Is there a way to check if the client is still connected

Tags:

python

mqtt

Is there a way to check if the client is still connected to the MQTT broker?

Something like

if client.isConnected(): # for example
    # if True then do stuff

Edit: There was instance where my Raspberry Pi stopped receiving from the client although it was still (from the look of it, the code was still showing updated results) running.

Here is the code since I may be doing something wrong:

client = mqtt.Client()
client.connect(address, 1883, 60)

while True:
    data = getdata()
    client.publish("$ahmed/",data,0)
    time.sleep(0.2)

The thing is that I was away, so I am not even sure why it stopped! Only if I restart my broker then it will start receiving again.

like image 640
Ahmed Al-haddad Avatar asked Mar 18 '16 19:03

Ahmed Al-haddad


People also ask

What is client connection status in MQTT?

The MQTT connection is always between one client and the broker. Clients never connect to each other directly. To initiate a connection, the client sends a CONNECT message to the broker. The broker responds with a CONNACK message and a status code.

How do I ping MQTT broker?

MQTT uses a TCP/IP connection that is normally left open by the client so that is can send and receive data at any time. To detect a connection failure MQTT uses a ping system where it sends messages to the broker at a pre-determined interval if no messages have been sent after a certain period (KeepAlive).


2 Answers

You can activate a flag in on_connect and deactivate it in on_disconnect. In this way you can know if the client is connected or not.

import paho.mqtt.client as mqtt

flag_connected = 0

def on_connect(client, userdata, flags, rc):
   global flag_connected
   flag_connected = 1

def on_disconnect(client, userdata, rc):
   global flag_connected
   flag_connected = 0

client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect(server,port)
client.loop_forever()
if flag_connected == 1:
   # Publish message
else:
   # Wait to reconnect
like image 132
Alejandro D Avatar answered Sep 21 '22 12:09

Alejandro D


I can't see one in the doc but there are the on_disconnect on_connect callbacks that can be used to set your own state variable

EDIT:

You need to call one of the loop functions to give the client cycles to handle the network operations:

client = mqtt.Client()
client.connect(address, 1883, 60)

while True:
    data = getdata()
    client.publish("$ahmed/",data,0)
    client.loop(timeout=1.0, max_packets=1)
    time.sleep(0.2)
like image 25
hardillb Avatar answered Sep 18 '22 12:09

hardillb