为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

噜噜哒 2022-11-09 16:47:13
我编写了一个代码,可以在同一个 python 文件中进行发布和订阅。我的目标是能够无休止地向灯发送色温并接收其状态(开/关或在线/离线)。但是,当我运行代码时,我可以向灯发送消息,但我什么也没收到(请注意,发布者和订阅者分别工作得很好)import paho.mqtt.client as mqttimport sysimport timetopic = "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 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

问题有两个方面,首先是您time.sleep(10)on_publish()回调中调用。

这会阻塞 MQTT 客户端网络循环,因此每次发布消息时它都不会在 10 秒内发送/接收任何消息。

您不应在任何 MQTT 客户端回调中执行任何阻塞或长时间运行的任务。

另一个问题是,如果没有睡眠,客户端将花费所有时间发布消息(因为每次它完成发布消息时都会触发on_publish()回调,从而启动另一个发布。它永远不会处理传入的消息。

如果您想定期发布消息,那么您需要启动一个单独的线程来执行此操作,而不是尝试在回调中执行此操作。


查看完整回答
反对 回复 2022-11-09
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信