Python MQTT仅在有限的时间内连接

时间:2016-12-25 15:32:13

标签: python mqtt terminate paho

我有一个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()

我已经尝试使用while语句来循环并计算在启动脚本和获取消息之间传递的时间,但它似乎(显然)没有逃避循环,即使它得到消息。

有没有办法可以说它连接了多长时间,当它超过那个时间时,只需完全终止脚本?

或许,是否有一种方法(我之前尝试过)制作一个循环,但也考虑在循环中传递的消息?

感谢您的建议!

1 个答案:

答案 0 :(得分:2)

尝试这样的事情

接收消息应该等待大约5秒钟然后退出。您可以通过在waitTime循环

之前更改值while来调整等待时间

我使用了mqtt网络循环函数的版本,该函数只运行一小段时间并将其置于while循环中。循环还会检查已用时间,并在退出循环之前干净地断开客户端。我还在收到邮件时添加了一个干净的客户端退出。

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