MQTT: невозможно отправлять и получать сообщения одновременно и в одном файле - PullRequest
0 голосов
/ 07 мая 2020

Я написал код, который может выполнять как публикацию, так и подписку в одном и том же файле python. Моя цель - иметь возможность бесконечно отправлять цветовую температуру на лампу и получать обратно ее состояние (включено / выключено или онлайн / офлайн).

Однако, когда я запускаю код, я могу отправлять сообщения на лампу но я ничего не получаю (учтите, что издатель и подписчик работали по отдельности)

import paho.mqtt.client as mqtt
import sys
import time

topic = "testtopic/3" 
topic_casa = "testtopic/1"

def on_connect(client, userdata, flags, rc):
    print("Connection to the broker. Result : "+str(rc))
    client.subscribe(topic_casa, qos=1)
    client.publish(topic, light.circadianLight())

def on_message(client, userdata, msg):
    Message = str(msg.payload)
    print("[MSG RECEBIDA] Topico: "+msg.topic+" / Mensagem: "+Message)

def on_publish(client,userdata,result): 
    client.publish(topic, light.circadianLight())
    time.sleep(10)

def on_disconnect(client, userdata, rc):
    if rc != 0:
        print("Unexpected disconnection.")  

try:

    print("[STATUS] Inicializando MQTT...")
    #inicializa MQTT:
    client = mqtt.Client()
    client.username_pw_set(username, password)
    client.on_connect     = on_connect
    client.on_message     = on_message
    client.on_disconnect  = on_disconnect

    client.on_publish = on_publish #with this callback we won't be able to 
#receive messages

    client.connect(Broker, PortaBroker, KeepAliveBroker)

    client.loop_forever()

except KeyboardInterrupt:
    print ("\nCtrl+C pressionado, encerrando aplicacao e saindo...")
    sys.exit(0)

1 Ответ

0 голосов
/ 07 мая 2020

Проблема двоякая: сначала вы вызываете time.sleep(10) в обратном вызове on_publish().

Это блокирует клиентскую сеть MQTT l oop, поэтому он не будет отправлять / получать сообщения в течение 10 секунд каждый раз, когда вы публикуете sh сообщение.

Вы не должны выполнять какие-либо блокирующие или длительные задачи в любом из обратных вызовов клиента MQTT.

Другая проблема заключается в том, что без во время сна клиент будет тратить все свое время на публикацию сообщений (потому что каждый раз, когда он заканчивает публикацию сообщения, он запускает обратный вызов on_publish(), который запускает другую публикацию sh. Он никогда не дойдет до обработки входящих сообщений.

Если вы хотите публиковать sh сообщения с регулярным интервалом, вам нужно запустить отдельный поток для этого, а не пытаться делать это в обратных вызовах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...