我編寫了一個代碼,可以在同一個 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
提交
取消