Python MQTT订阅消息QOS=1的注意点

QoS0:最多发送一次,到达不到达发布者不管,发布者(客户端,服务端做为发送端的时候)只发送一次,不管接收端是否收到数据;

QoS1:至少到达一次,发布者需要到达后有确认,发布者(客户端,服务端做为发送端的时候)发布消息后等待接收者(客户端,服务端做为接收端的时候)的确认信息报文;如果发布都没有收到确认报文,发布者会一直发送消息;

QoS2:只有一次到达,发布者需要到达后确认,接收者需要发布者再次确

按照介绍的MQTT消息的三个等级如上所示,

按照我之前的理解是如果消息等级是1 ,那么至少应该有一个客户端能收到消息。

但是这里需要注意的是如果消息发送时,没有任何订阅客户端连接到Mqtt 服务器,那么无论你的消息等级有多高,新连接的订阅客户端是不会收到这条消息的。

具体的场景是:

(1)我发送了一条qos=1的消息,然后我启动了一个订阅客户端,这时我的订阅客户端是收不到消息的。

(2)为了能收到qos=1的消息,订阅客户端需要使用固定clientid登陆mqtt 服务器,并且订阅某个主题,这时如果订阅客户端断线,断线期间有消息发送,那么订阅客户端在重连之后是可以收到消息的。

下面用python paho-mqtt举例

#发送端 设置消息级别是1
mqttclient.publish("topic1", payload="hello world", qos=1)
#clean_session=False 是需要设置的参数,表示客户端是一个永久性客户端,短线
#重连后,可以收到错过的消息
scribeclient = mqtt.Client(client_id="clientid11111", clean_session=False)

#连接后订阅的级别同样需要有参数qos=1
self.client.publish(topic, payload=msg, qos=1)

猜你喜欢

转载自blog.csdn.net/wxtcstt/article/details/126786099