我正在尝试通过mqtt连接向我发送消息,然后对收件箱中收集到的消息执行任务。问题是,当我运行代码时,尚未收到消息,并且代码中应根据消息中的信息起作用的部分没有再次运行。
我曾考虑过使用while True:
循环,但是根本无法访问mqtt脚本。这是行不通的。
这可能是一个非常基本的问题,但是如何实现连续运行mqtt客户端并在以后的某个时刻处理收集到的消息呢?
import paho.mqtt.client as client
hostname = 'test.mosquitto.org'
topic = "personal/topic"
# receiving the data
inbox = []
def on_message(client, userdata, msg):
msg = msg.payload.decode()
inbox.append(msg)
print("Received Message No. %s: %s" % (len(inbox), msg))
def on_connect(client, userdata, flags, rc):
print("Connection returned result: " + str(rc))
client.subscribe(topic)
# this is where I want to perform a task on the message
y = []
X = []
for msg in inbox:
label, data = msg.split(': ')
data = data.split(', ')
y.append(label)
X.append(data)
# the mqtt part
client = client.Client()
client.on_message = on_message
client.on_connect = on_connect
client.connect(hostname)
client.loop_forever()
这是在脚本末尾使用client.loop_start()
的构造(与@hardillb的答案有关):
# the mqtt part
client = client.Client()
client.on_message = on_message
client.on_connect = on_connect
client.connect(hostname)
client.loop_start()
while True:
y = []
X = []
for msg in inbox:
label, data = msg.split(': ')
data = data.split(', ')
y.append(label)
X.append(data)
client.disconnect()
client.loop_stop()
答案 0 :(得分:1)
paho客户端可以使用client.loop_start()
函数在单独的线程上启动它的网络工作者。
此后,您可以开始自己的处理循环,但是on_message
回调函数将在客户端的网络工作线程上运行,因此,如果要将排队的传入消息排队以便以后处理,则需要确保当您存储消息时,它是以线程安全的方式完成的。