on_disconnect не запускается питоном - PullRequest
0 голосов
/ 03 ноября 2019

Я пробовал несколько итераций этого кода. Это последняя попытка, и я в тупике. Он никогда не видит опубликованное сообщение в дополнение к отсутствию отключения при подключении.

#!/usr/bin/python3
import paho.mqtt.client as mqtt  #import the client1
import time

def on_message(client, userdata, message):
  print("received message =",str(message.payload.decode("utf-8")))

def on_disconnect(client, userdata, flags, rc):
    client.connected_flag=False #set flag
    print("disconnected OK")

def on_connect(client, userdata, flags, rc):
    if rc==0:
        client.connected_flag=True #set flag
        print("connected OK")
        client.subscribe("Phone/announcet")#subscribe
        print("subscribed OK")
    else:
        print("Bad connection Returned code=",rc)

mqtt.Client.connected_flag=False#create flag in class
broker="192.168.1.71"
client = mqtt.Client()             #create new instance 
print("Connecting to broker ",broker)
client.username_pw_set(username="zzz",password="xxx")
while True:
    client.on_connect=on_connect  #bind call back function
    client.on_disconnect=on_disconnect
    client.connect(broker)      #connect to broker
    client.loop_start()
    while not client.connected_flag: #wait in loop
        print("In wait loop")
        time.sleep(1)
    print("in Main Loop")
    time.sleep(2)
    client.loop_stop()    #Stop loop 
    client.disconnect() # disconnect
    print("After disconnect")

Вот как выглядит вывод:

Connecting to broker  192.168.1.71
In wait loop
connected OK
subscribed OK
in Main Loop
After disconnect
in Main Loop
connected OK
subscribed OK
After disconnect
in Main Loop
connected OK
subscribed OK
After disconnect

Спасибо, Джим

1 Ответ

1 голос
/ 03 ноября 2019

Во-первых, вы не устанавливаете обратный вызов on_message на клиенте, поэтому вы не получаете сообщений.

Во-вторых, нет никакой выгоды в установке обратных вызовов внутри цикла, они лучше перемещаются за пределыосновной цикл.

В-третьих, вы останавливаете цикл перед вызовом разъединения, так как все обратные вызовы выполняются в цикле событий клиента, on_disconnect никогда не будет вызван. У вас также есть дополнительный аргумент в on_disconnect, там не должно быть flags.

Я также не уверен, что ваш connected_flag когда-либо будет работать, его следует переместить в глобальную переменную

#!/usr/bin/python3
import paho.mqtt.client as mqtt  #import the client1
import time

connected_flag=False

def on_message(client, userdata, message):
    print("received message =",str(message.payload.decode("utf-8")))

def on_disconnect(client, userdata, rc):
    global connected_flag 
    connected_flag=False #set flag
    print("disconnected OK")

def on_connect(client, userdata, flags, rc):
    global connected_flag
    if rc==0:
        connected_flag=True #set flag
        print("connected OK")
        client.subscribe("Phone/announcet") #subscribe
        print("subscribed OK")
    else:
        print("Bad connection Returned code=",rc)

broker="192.168.1.71"
client = mqtt.Client()             #create new instance 
print("Connecting to broker ",broker)
client.username_pw_set(username="zzz",password="xxx")
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect

while True:
    client.connect(broker)      #connect to broker
    client.loop_start()
    while not connected_flag: #wait in loop
        print("In wait loop")
        time.sleep(1)
    print("in Main Loop")
    time.sleep(3)
    print(connected_flag)
    client.disconnect() # disconnect
    print("After disconnect")
    print(connected_flag)
    client.loop_stop()
...