2016-12-25 61 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