web-dev-qa-db-ja.com

MQTT-クライアントがまだ接続されているかどうかを確認する方法はありますか

クライアントがまだMQTTブローカーに接続されているかどうかを確認する方法はありますか?

何かのようなもの

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

編集:Raspberry Piがまだ実行されているにもかかわらず(外観からは、コードは更新された結果を表示していました)、クライアントからの受信を停止する場合がありました。

私が何か間違ったことをしているかもしれないので、これがコードです:

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

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

不在だったので、なぜ止まったのかわからない!ブローカーを再起動した場合にのみ、ブローカーは再び受信を開始します。

10
Ahmed Al-haddad

On_connectでフラグをアクティブにし、on_disconnectで非アクティブにすることができます。このようにして、クライアントが接続されているかどうかを知ることができます。

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
7
Alejandro D

doc に表示されませんが、独自の状態変数を設定するために使用できるon_disconnecton_connectコールバックがあります

編集:

loop 関数のいずれかを呼び出して、ネットワーク操作を処理するためのクライアントサイクルを与える必要があります。

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)
3
hardillb

pythonでは、任意のオブジェクトにメンバーを追加できます。@ hardibが言ったように、次のようなことができます。

def on_connect(client, ...):
    client.is_connected = True

def on_disconnect(client, ...):
    client.is_connected = False

client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
...
client.connect()
if client.is_connected:
    do something

しかし、これはテストしませんでした。関係のない理由で、クライアントオブジェクトがグローバルとして定義されているmqttクライアントのみを使用したため、そこに値を割り当てました。これは関係なく機能するはずです。

0
jaaq