有没有办法检查客户端是否仍然连接到 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)
问题是我不在,所以我什至不知道为什么它停止了!只有当我重新启动我的经纪人时,它才会再次开始接收。
您可以在 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
,您可以使用其他客户端来确认该客户端是否在线。
您还可以查看这篇文章:如何在Python中使用MQTT(Paho) 回答您问题的文章中的一段代码:
from paho.mqtt import client as mqtt_client
broker = 'broker.io'
port = 8888
client_id = 'client_id '
username = 'username'
password = 'password'
def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
# Set Connecting Client ID
client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client
paho mqtt 客户端有一个可以使用的 is_connected() 方法。
这是一个例子
import paho.mqtt.client as mqtt
this.mClientName = "MQ_Client_" + "your unique client name"
this.mClientMq = mqtt.Client(this.mClientName)
retVal = this.mClientMq.connect(this.mBrokerIp, this.mBrokerPort)
def getMqClientStatus():
val = this.mClientMq.is_connected()
valStr = "Connected"
if val == 0:
valStr = "Not Connected"
return val, valStr
这里是可用的 API。 您只需使用 client.is_connected() 返回 True 或 False 即可。