MQTT:无法同时在同一个文件中发送和接收消息

我编写了一个代码,可以在同一个 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)


噜噜哒
浏览 144回答 1
1回答

白衣非少年

问题有两个方面,首先是您time.sleep(10)在on_publish()回调中调用。这会阻塞 MQTT 客户端网络循环,因此每次发布消息时它都不会在 10 秒内发送/接收任何消息。您不应在任何 MQTT 客户端回调中执行任何阻塞或长时间运行的任务。另一个问题是,如果没有睡眠,客户端将花费所有时间发布消息(因为每次它完成发布消息时都会触发on_publish()回调,从而启动另一个发布。它永远不会处理传入的消息。如果您想定期发布消息,那么您需要启动一个单独的线程来执行此操作,而不是尝试在回调中执行此操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python