Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MQTT Paho Python可靠连接_Python_Mqtt - Fatal编程技术网

MQTT Paho Python可靠连接

MQTT Paho Python可靠连接,python,mqtt,Python,Mqtt,我试图让我的MQTT Paho Python脚本保持连接(并在断开连接时重新连接)。遗憾的是,我不知道该怎么做 这就是说,机器是通过WiFi连接的,因此,如果信号丢失或USB加密狗出现故障,我不想让代码泄露给我,因此我尝试覆盖所有异常/错误 下面是我尝试使用的一段代码: mqttc = mqtt.Client(machine_id, clean_session=False) mqttc.username_pw_set(machine_id, mqtt_pwd) mqttc.connect(mqt

我试图让我的MQTT Paho Python脚本保持连接(并在断开连接时重新连接)。遗憾的是,我不知道该怎么做

这就是说,机器是通过WiFi连接的,因此,如果信号丢失或USB加密狗出现故障,我不想让代码泄露给我,因此我尝试覆盖所有异常/错误

下面是我尝试使用的一段代码:

mqttc = mqtt.Client(machine_id, clean_session=False)
mqttc.username_pw_set(machine_id, mqtt_pwd)
mqttc.connect(mqtt_host, mqtt_port)
mqttc.subscribe(machine_id, qos=1)

def on_disconnect(client, userdata, rc):
        if rc != 0:
                print "Unexpected MQTT disconnection. Attempting to reconnect."
                try:
                        mqttc.reconnect()
                except socket.error:
                            ??????
mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.on_disconnect = on_disconnect
mqttc.loop_forever()
我没能走得更远,因为我不知道如何才能让它再次连接?除非它能够第一次重新连接,否则我似乎无法进行正确的重新连接循环

任何建议都会很有帮助

谢谢

读取source(),
loop\u forver()
方法在无限阻塞循环中调用
loop()
方法。它是
loop()
方法,确保使用代理维护发布/订阅消息和mqtt keepalive通信
loop\u forver()
如果连接断开,也会自动重新连接

还要注意,
loop\u forever()
阻塞,直到客户端显式调用
disconnect()
。因此,如果您只想在程序中运行MQTT客户机,那么它将非常有用。我更喜欢
loop\u start()
/
loop\u stop()
方法

mqttc = mqtt.Client(machine_id, clean_session=False)
mqttc.username_pw_set(mqtt_user, mqtt_pwd)
mqttc.connect(mqtt_host, mqtt_port)
mqttc.subscribe(mqtt_topic, qos=1)

def on_disconnect(client, userdata, rc):
    if rc != 0:
        print("Unexpected MQTT disconnection. Will auto-reconnect")

mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.on_disconnect = on_disconnect
mqttc.loop_forever()

不确定为什么在
用户名设置()和
订阅()调用中使用
机器id
。更改了它们。

永远循环()
不会启动线程,这是不正确的。不过,正如你所说,它确实会阻塞。谢谢@ralight。你给客户写信了。如果需要进一步更正,我必须将子脚本移动到连接上的
处理程序,以便在重新连接后重新订阅,否则我将不再订阅,这是有道理的。最好是
客户端。异步连接
,否则,如果没有初始连接,您将得到一个
OSError