MQTT - 有没有办法检查客户端是否仍然连接

问题描述 投票:0回答:6

有没有办法检查客户端是否仍然连接到 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)

问题是我不在,所以我什至不知道为什么它停止了!只有当我重新启动我的经纪人时,它才会再次开始接收。

python mqtt
6个回答
17
投票

您可以在 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

3
投票

我在 doc 中看不到,但有

on_disconnect
on_connect
回调可用于设置您自己的状态变量

编辑:

您需要调用

loop
函数之一来为客户端提供处理网络操作的周期:

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)

0
投票

您可以使用

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
,您可以使用其他客户端来确认该客户端是否在线。


0
投票

您还可以查看这篇文章:如何在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

0
投票

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

-1
投票

这里是可用的 API。 您只需使用 client.is_connected() 返回 True 或 False 即可。

© www.soinside.com 2019 - 2024. All rights reserved.