paho.mqtt - 让msg.payload打印在on_message函数之外

时间:2017-07-28 07:20:40

标签: python mqtt

我有以下简单的代码。 我希望能够在它之外打印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)

1 个答案:

答案 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)

对于这个问题,这是一个更强大的解决方案,从我的角度来看,更容易理解。