gpt4 book ai didi

Python Paho MQTT : Unable to publish immediately in a function

转载 作者:太空宇宙 更新时间:2023-11-04 00:51:25 25 4
gpt4 key购买 nike

我正在实现一个程序,该程序会监听特定主题并在我的 ESP8266 发布新消息时对其使用react。当从 ESP8266 收到一条新消息时,我的程序将触发回调并执行一组任务。我在我的回调函数中发布两条消息回到 Arduino 正在监听的主题。但是,消息仅在函数退出后才发布。

提前感谢您的宝贵时间。

我尝试在回调函数中使用超时为 1 秒的 loop(1)。程序会立即发布消息,但似乎卡在了循环中。有人能给我一些指示,我如何才能在我的回调函数中立即执行每个发布函数,而不是在整个回调完成并返回主 loop_forever() 时执行?

import paho.mqtt.client as mqtt
import subprocess
import time

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))

# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe("ESP8266")

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client.publish("cooking", '4')
client.loop(1)
print("Busy status published back to ESP8266")
time.sleep(5)
print("Starting playback.")
client.publish("cooking", '3')
client.loop(1)
print("Free status published published back to ESP8266")
time.sleep(5)
print("End of playback.")


client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("192.168.1.9", 1883, 60)
#client.loop_start()

# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()

最佳答案

您不能这样做,在调用发布时您已经处于消息处理循环(这就是所谓的 on_message 函数)中。这会将传出消息排队,以供循环的下一次迭代处理,这就是一旦 on_message 返回就发送它们的原因。

当你调用 loop 方法时挂起,因为循环已经在运行。

无论如何,你不应该在 on_message 回调中进行阻塞( sleep )调用,如果你需要做一些需要时间的事情,启动第二个线程来做这些。通过这样做,您可以释放网络循环来处理传出的发布。

关于Python Paho MQTT : Unable to publish immediately in a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36961758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com