我有以下简单的代码。 我希望能够在它之外打印var form on_message,但如果我把我的print(msg.payload)放在循环之外显然不起作用,但是当loop_forever初始化函数on_message时,循环中的print(msg.payload)也不起作用(因为函数没有初始化。
mybuffer = ''
def on_subscribe(client, userdata, mid, granted_qos):
print('Subscribed')
def on_message(client, userdata, msg):
mybuffer = str(msg.payload)
print('on_message: '+ mybuffer)
client = paho.Client()
client.on_subscribe = on_subscribe
client.on_message = on_message
client.connect('broker', 1883)
client.subscribe('/andrzej/sensorki')
client.loop_forever()
print(mybuffer)
答案 0 :(得分:1)
您的代码存在两个问题(ralight和hardlib提到了这些问题)。首先,程序永远不会退出loop_forever(),因此无法执行更多命令。其次,您需要将mybuffer定义为全局变量,以便它从on_message回调中传出。这感觉有点笨重,但(据我所知),这是你做你想做的最好的方式。
第一个问题的解决方案就是使用loop_start()而不是loop_forever()。我的怀疑是,当你尝试这个之前,你没有延迟让脚本有时间接收消息。第二个问题可以通过在on_message回调中添加行全局mybuffer来解决。这告诉python这是一个全局变量,而不是本地变量。
以下是一些说明这一点的工作代码:
getTransactionList
但是,这不是完成您尝试执行的操作的最佳方法,因为它无法以可预测的方式处理多条消息。更好的方法是将所有代码包装到on_message回调中,如下所示:
import paho.mqtt.client as paho
import time
mybuffer = ''
def on_subscribe(client, userdata, mid, granted_qos):
print('Subscribed')
def on_message(client, userdata, msg):
global mybuffer
mybuffer = str(msg.payload)
print('on_message: '+ mybuffer)
client = paho.Client()
client.on_subscribe = on_subscribe
client.on_message = on_message
client.connect('test.mosquitto.org')
client.subscribe('$SYS/#')
client.loop_start()
time.sleep(1)
client.loop_stop()
print(mybuffer)
对于这个问题,这是一个更强大的解决方案,从我的角度来看,更容易理解。