2016-12-25 86 views
3

我有一個Python腳本,其中我已連接到MQTT服務器。我期望通過我訂閱的主題獲得消息,但是如果我沒有收到消息,我想完全終止腳本。Python MQTT僅在有限時間連接

我與長相的工作如下腳本:使用了一段真實的說明中循環,並計算啓動腳本,它得到的消息之間傳遞的時間

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

def on_message(client, userdata, msg): 
     if msg.topic == "discovery": 
       data = json.loads(msg.payload) 
       serial = data['serial'] 
       print "test successful!" 
       sys.exit(0) 

def on_connect(client, userdata, flags, rc): 
     client.subscribe([("discovery", 2)]) 

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

我都試過了,但它即使在收到消息時,似乎(顯然)也不能逃脫循環。

有沒有一種方法可以說它連接了多長時間,當它超過那個時間時,就完全終止腳本?

或者,有沒有一種方法(正如我之前所做的那樣)創建一個循環,但也要考慮在循環中傳遞的消息?

感謝您的建議!

回答

2

嘗試類似這樣的

它應該等待大約5秒鐘,然後退出傳入消息。您可以通過只while

我用的是隻運行了很短的時間,並把它放在一個while循環的MQTT網絡環路功能的版本之前,改變價值waitTime調整等待時間。該循環還檢查流逝的時間並在退出循環之前乾淨地斷開客戶端。當收到消息時,我還添加了一個乾淨的客戶端出口。

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

def on_message(client, userdata, msg): 
     if msg.topic == "discovery": 
       data = json.loads(msg.payload) 
       serial = data['serial'] 
       print "test successful!" 
       client.disconnect() 
       sys.exit(0) 

def on_connect(client, userdata, flags, rc): 
     client.subscribe([("discovery", 2)]) 

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

client.on_connect = on_connect 
client.on_message = on_message 
startTime = time.time() 
waitTime = 5 
while True: 
     client.loop() 
     elapsedTime = time.time() - startTime 
     if elapsedTime > waitTime: 
       client.disconnect() 
       break 
+0

完美地工作,謝謝! – user5740843