2016-12-25 1 views
3

私はMQTTサーバーに接続しているPythonスクリプトを持っています。私が購読しているトピックを通してメッセージを受け取ることを期待していますが、メッセージを受け取らないと、スクリプトを完全に終了したいのです。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秒間待つ必要があり、この

のようなものを試してみてください。 ループの直前の値をwaitTimeに変更して調整することができます。

私は短い時間だけ実行してwhileループに入れるバージョンのmqttネットワークループ関数を使用しています。また、ループは経過時間をチェックして、ループから脱出する前にクライアントを正常に切断します。また、メッセージを受信したときにクリーンなクライアント出口を追加しました。

#!/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

関連する問題