我编写了一个代码,可以在同一个 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()
回调,从而启动另一个发布。它永远不会处理传入的消息。
如果您想定期发布消息,那么您需要启动一个单独的线程来执行此操作,而不是尝试在回调中执行此操作。
添加回答
举报
0/150
提交
取消