Python MQTT-是否有方法检查客户端是否仍处于连接状态

Python MQTT-是否有方法检查客户端是否仍处于连接状态,python,mqtt,Python,Mqtt,是否有方法检查客户端是否仍然连接到MQTT代理 差不多 if client.isConnected(): # for example # if True then do stuff 编辑:有一个例子,我的Raspberry Pi停止从客户端接收信息,尽管它仍然在运行(从外观上看,代码仍然显示更新的结果) 以下是代码,因为我可能做错了什么: client = mqtt.Client() client.connect(address, 1883, 60) while True:

是否有方法检查客户端是否仍然连接到MQTT代理

差不多

if client.isConnected(): # for example
    # if True then do stuff
编辑:有一个例子,我的Raspberry Pi停止从客户端接收信息,尽管它仍然在运行(从外观上看,代码仍然显示更新的结果)

以下是代码,因为我可能做错了什么:

client = mqtt.Client()
client.connect(address, 1883, 60)

while True:
    data = getdata()
    client.publish("$ahmed/",data,0)
    time.sleep(0.2)
问题是我不在,所以我甚至不知道为什么它停止了!只有当我重新启动我的代理时,它才会再次开始接收。

我在中看不到一个,但是在断开连接上有
,可以用来设置您自己的状态变量

编辑:

您需要调用其中一个函数,为客户端提供处理网络操作的周期:

client = mqtt.Client()
client.connect(address, 1883, 60)

while True:
    data = getdata()
    client.publish("$ahmed/",data,0)
    client.loop(timeout=1.0, max_packets=1)
    time.sleep(0.2)

您可以在on_connect中激活标志,并在on_disconnect中停用标志。通过这种方式,您可以知道客户端是否已连接

import paho.mqtt.client as mqtt

flag_connected = 0

def on_connect(client, userdata, flags, rc):
   global flag_connected
   flag_connected = 1

def on_disconnect(client, userdata, rc):
   global flag_connected
   flag_connected = 0

client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect(server,port)
client.loop_forever()
if flag_connected == 1:
   # Publish message
else:
   # Wait to reconnect

您可以使用
will
消息来执行此操作

client=mqtt.Client()
client.will_set('will_message_topic',payload=time.time(),qos=2,retain=True)
client.connect(address,1883,60)
client.publish('will_message_topic',payload='I am alive',qos=2,retain=True)
client.loop_start()#this line is important
while 1:#faster than while True
    you loop

通过留下一条
will
消息,您可以使用另一个客户来确定该客户是否在线。

我已经在我的问题中加入了更多细节以及问题背后的原因。编辑答案以适应实际问题它工作了大约两个小时,但后来我不得不重新启动客户的代码,因为代理再次停止接收。至少我现在不需要重新启动Raspberry Pi,但是如果客户端仍然显示更新的结果,为什么客户端会停止呢?我在publish行之后打印
sent
。因为调用publish实际上并不发送消息,所以它会将消息排队等待循环函数处理。尝试增加它仍有问题的最大数据包数显示您的建议是什么,这样不会降低性能?请看这里:。代码是为php客户端编写的。顺便说一句,
loop\u forever()
是一个阻塞调用。如果flag_connected==1:
行,我们永远不会到达
。调用
loop()
会起作用吗?
loop\u start()
是一个选项,用于启动一个线程,该线程调用
loop\u forever()
或者您可以执行一个while循环,该循环调用
loop()
。while 1:和while True:1对于Python 3是相同的。但我只是在谷歌上搜索了一下,在python 2中差别很大。哦,我想我错过了。谢谢