我編寫(xiě)了一個(gè)代碼,可以在同一個(gè) python 文件中進(jìn)行發(fā)布和訂閱。我的目標(biāo)是能夠無(wú)休止地向燈發(fā)送色溫并接收其狀態(tài)(開(kāi)/關(guān)或在線/離線)。但是,當(dāng)我運(yùn)行代碼時(shí),我可以向燈發(fā)送消息,但我什么也沒(méi)收到(請(qǐng)注意,發(fā)布者和訂閱者分別工作得很好)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貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊
問(wèn)題有兩個(gè)方面,首先是您time.sleep(10)
在on_publish()
回調(diào)中調(diào)用。
這會(huì)阻塞 MQTT 客戶(hù)端網(wǎng)絡(luò)循環(huán),因此每次發(fā)布消息時(shí)它都不會(huì)在 10 秒內(nèi)發(fā)送/接收任何消息。
您不應(yīng)在任何 MQTT 客戶(hù)端回調(diào)中執(zhí)行任何阻塞或長(zhǎng)時(shí)間運(yùn)行的任務(wù)。
另一個(gè)問(wèn)題是,如果沒(méi)有睡眠,客戶(hù)端將花費(fèi)所有時(shí)間發(fā)布消息(因?yàn)槊看嗡瓿砂l(fā)布消息時(shí)都會(huì)觸發(fā)on_publish()
回調(diào),從而啟動(dòng)另一個(gè)發(fā)布。它永遠(yuǎn)不會(huì)處理傳入的消息。
如果您想定期發(fā)布消息,那么您需要啟動(dòng)一個(gè)單獨(dú)的線程來(lái)執(zhí)行此操作,而不是嘗試在回調(diào)中執(zhí)行此操作。
添加回答
舉報(bào)
0/150
提交
取消