有兩個問題與您的代碼(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()
這是一個更強大的解決問題的方法,並從我的角度來看,是比較容易理解。
來源
2017-07-28 17:59:15
blp
爲什麼該函數未初始化?行打印('on_message:'+ my_buffer)應該工作。 – fhossfel
我不清楚 - 函數啓動和('on_message:'+ my_buffer)工作,但另一個:打印(mybuffer)運行前打印什麼都沒有 - 我真的在使用On-message功能之外的打印 – Andrzej
你需要查看'global'關鍵字。 – ralight