Python Paho MQTT 全局变量未存储消息
Python Paho MQTT Global Variable not Storing Message
使用paho mqtt,在函数中声明了全局变量,但是想在函数外调用变量时却不起作用。 (on_message 函数之外的最后一行打印函数)。它每 1 秒发布一次消息,但是执行此操作时,没有消息显示。
import paho.mqtt.client as mqtt
from datetime import datetime
message = ''
def on_connect (client, userdata, flags, rc):
print('Connected successful with attempt: {}'.format(str(rc)))
client.subscribe('imax123')
def on_message (client, userdata, msg):
global message
message = str(msg.payload)
client = mqtt.Client('IMAXCLIENT')
client.on_connect = on_connect
client.on_message = on_message
client.connect('mqtt.eclipseprojects.io')
client.loop_forever()
print(message)
正如@Brits 在评论中指出的那样,代码永远不会通过 client.loop_forever()
调用。
此调用将在 MQTT 客户端的生命周期内阻塞。
你如何前进将在很大程度上取决于你需要实现的目标。如果您只想接收一条消息,那么有一个 helper 包装器可以做到这一点
import paho.mqtt.subscribe as subscribe
msg = subscribe.simple("paho/test/simple", hostname="mqtt.eclipse.org")
print("%s %s" % (msg.topic, msg.payload))
如果您需要做更多,那么您可能需要考虑将 client.loop_forever()
换成 client.loop_start()
,这将启动后台线程到 运行 客户端网络循环。即使进行了此更改,您的代码仍然需要做更多的工作,因为 message
全局在消息到达之前不会更新,这可能需要很长时间,因此尝试立即打印它可能不会提供您期望的结果。
使用paho mqtt,在函数中声明了全局变量,但是想在函数外调用变量时却不起作用。 (on_message 函数之外的最后一行打印函数)。它每 1 秒发布一次消息,但是执行此操作时,没有消息显示。
import paho.mqtt.client as mqtt
from datetime import datetime
message = ''
def on_connect (client, userdata, flags, rc):
print('Connected successful with attempt: {}'.format(str(rc)))
client.subscribe('imax123')
def on_message (client, userdata, msg):
global message
message = str(msg.payload)
client = mqtt.Client('IMAXCLIENT')
client.on_connect = on_connect
client.on_message = on_message
client.connect('mqtt.eclipseprojects.io')
client.loop_forever()
print(message)
正如@Brits 在评论中指出的那样,代码永远不会通过 client.loop_forever()
调用。
此调用将在 MQTT 客户端的生命周期内阻塞。
你如何前进将在很大程度上取决于你需要实现的目标。如果您只想接收一条消息,那么有一个 helper 包装器可以做到这一点
import paho.mqtt.subscribe as subscribe
msg = subscribe.simple("paho/test/simple", hostname="mqtt.eclipse.org")
print("%s %s" % (msg.topic, msg.payload))
如果您需要做更多,那么您可能需要考虑将 client.loop_forever()
换成 client.loop_start()
,这将启动后台线程到 运行 客户端网络循环。即使进行了此更改,您的代码仍然需要做更多的工作,因为 message
全局在消息到达之前不会更新,这可能需要很长时间,因此尝试立即打印它可能不会提供您期望的结果。