2017-07-28 371 views
0

我有下面的簡單代碼。 我想能夠在其外部打印var形式的on_message,但如果我把我的print(msg.payload)放在循環之外顯然是行不通的,但是因爲loop_forever初始化函數on_message,所以打印(msg .payload)內循環不起作用既不(如函數未初始化。paho.mqtt - 獲取msg.payload打印在on_message函數之外

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

爲什麼該函數未初始化?行打印('on_message:'+ my_buffer)應該工作。 – fhossfel

+0

我不清楚 - 函數啓動和('on_message:'+ my_buffer)工作,但另一個:打印(mybuffer)運行前打印什麼都沒有 - 我真的在使用On-message功能之外的打印 – Andrzej

+1

你需要查看'global'關鍵字。 – ralight

回答

0

有兩個問題與您的代碼(ralight和hardlib已經提到)。首先,程序不退出loop_forever( ),因此不能執行更多的命令;其次,你需要將mybuffer定義爲一個全局變量,以便它從on_message回調中傳遞出來,這有點笨拙,但是(據我所知),這是最好的方法你正試圖去做。

第一個問題的解決方案僅僅是使用loop_start()而不是loop_forever()。我的懷疑是,當你嘗試這個之前,你沒有拖延,讓腳本有時間接收消息。第二個問題可以簡單地通過在on_message回調中添加行全局mybuffer來解決。這告訴python這是一個全局變量,而不是本地變量。

下面是一些工作的代碼說明了這一點:

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) 

然而,這是不是爲了實現什麼你正在嘗試做的,因爲它無法預測的方式處理多個消息的最佳方式。更好的辦法是將所有代碼包裝到ON_MESSAGE回調是這樣的:

import paho.mqtt.client as paho 
import time 


def on_subscribe(client, userdata, mid, granted_qos): 
    print('Subscribed') 

def on_message(client, userdata, msg): 
    mybuffer = str(msg.payload) 
    print('on_message: '+ mybuffer) 
    print(mybuffer) 

client = paho.Client() 
client.on_subscribe = on_subscribe 
client.on_message = on_message 
client.connect('test.mosquitto.org') 
client.subscribe('$SYS/#') 

client.loop_forever() 

這是一個更強大的解決問題的方法,並從我的角度來看,是比較容易理解。