2016-12-26 64 views
0

對於MQTT和Python我有點經驗,這讓我在最後一個小時左右感到困惑。MQTT不會通過Python發佈

這是我的工作腳本:

#!/usr/bin/python 
import json 
import socket 
import paho.mqtt.client as mqtt 

client = mqtt.Client() 
try: 
     client.connect('localhost', 4444) 
except: 
     print "ERROR: Could not connect to MQTT." 

mode_msg = { 
     'mode': '2' 
} 

client.publish("set", payload=json.dumps(mode_msg), qos=2, retain=False) 

此代碼將無法運行。我不知道爲什麼。大多數情況下,當我在底部添加「client.loop_forever()」時,它會運行...

我試着在底部添加「client.disconnect()」以使它斷開正確,但這一切都無濟於事。有什麼我現在失蹤了嗎?

回答

2

看起來你要發佈一個消息中提到,泛美衛生組織的客戶端有一個特定的消息只是做那。

#!/usr/bin/python 
import paho.mqtt.publish as publish 
mode_msg = { 
     'mode': '2' 
} 

publish.single("paho/test/single", payload=json.dumps(mode_msg), qos=2, hostname="localhost", port=4444) 

與你原來的代碼的問題是,你需要運行網絡環路處理髮布(因爲你用的QoS = 2,需要回復的出版經紀人確認發佈) ,您可以按如下做到這一點:

#!/usr/bin/python 
import json 
import paho.mqtt.client as mqtt 

run = True 

def on_publish(client, userdata, mid): 
    run = False; 

client = mqtt.Client() 
client.on_publish = on_publish 
try: 
     client.connect('localhost', 4444) 
except: 
     print "ERROR: Could not connect to MQTT." 

mode_msg = { 
     'mode': '2' 
} 

client.publish("set", payload=json.dumps(mode_msg), qos=2, retain=False) 
while run: 
    client.loop() 
client.disconnect() 

client.loop_forever()不會工作,因爲它不正是顧名思義,它永遠循環,因此不會到達你的client.disconnect()。這使用on_publish回調突破呼叫client.loop()的循環,然後斷開連接。

0

paho.mqtt客戶端庫圍繞必須運行的事件循環構建,以正確處理和維護MQTT協議。

因此使事情發生,你需要調用一些loop()功能,如documentation

相關問題