Python 3.x 如何在断开网络重新连接后加快mqtt订阅消息的恢复

Python 3.x 如何在断开网络重新连接后加快mqtt订阅消息的恢复,python-3.x,mqtt,iot,paho,Python 3.x,Mqtt,Iot,Paho,我有一个python项目代码,需要服务器向设备发送mqtt消息,它需要解决设备和云服务器应用程序操作和信息同步的问题。我找到了s Client函数有一个参数Client(Client_id=”“,clean_session=True),用于恢复未连接的订阅以接收脱机期间发送的消息。但我在实验中发现,断开连接的时间越长,恢复所需的时间就越长,发送的消息也就越慢 如果你们能给我一些建议,加快恢复速度,或者提供有关云设备应用程序操作和信息同步的相关参考资料,我将不胜感激 我有笔试 云彩 装置 def

我有一个python项目代码,需要服务器向设备发送mqtt消息,它需要解决设备和云服务器应用程序操作和信息同步的问题。我找到了s Client函数有一个参数
Client(Client_id=”“,clean_session=True)
,用于恢复未连接的订阅以接收脱机期间发送的消息。但我在实验中发现,断开连接的时间越长,恢复所需的时间就越长,发送的消息也就越慢

如果你们能给我一些建议,加快恢复速度,或者提供有关云设备应用程序操作和信息同步的相关参考资料,我将不胜感激

我有笔试

云彩

装置

def on_message(client, userdata, msg):
    info = msg.payload.decode('utf-8')
    print("##################info=",info)

def wait_to_handle("Device/#", mqtt_host, mqtt_port):
    client = mqtt.Client(client_id="wait_to_handle", clean_session=False)
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect(mqtt_host,mqtt_port,60)
    client.subscribe(topic=topics,qos=2)
    client.loop_forever()

def send_data_func():
    client = mqtt.Client('SendToCloud',clean_session=False)
    client.on_publish = on_publish
    client.connect(MQTT_IP, MQTT_PORT , 60)
    client.loop_start()
    count = 0
    while 1:
        print(count)
        client.publish('Cloud/count',str(count),2)
        count += 1
        time.sleep(2)
设备结果

...
much Device sent message
...
Device sent message
Device sent message
Device sent message
Device sent message
Device sent message
Device sent message
18666
18667
18668
wait handle : Connected with result code 0
##################info= create
##################info= delete
##################info= modify
##################info= create
##################info= delete
##################info= modify
##################info= create
##################info= delete
##################info= modify
##################info= create
##################info= delete
##################info= modify
18669
18670
18671
18672
18673
18674
Device sent message
Device sent message
Device sent message
Device sent message
...
...

正如您所注意到的,通过禁用
clean_session
标志来使用持久会话,可以维护所有活动订阅,这样客户端就不需要重新订阅,并且在客户端临时断开连接并重新连接时,可以对消息(仅QoS 1或QoS 2)进行排队

代理将按配置的数量排队,可能有数千条消息——因此,恢复时间与断开连接的时间成正比

你的选择是:

  • clean_session
    标志设置为
    true
    ,这将禁用所有错过消息的排队,但也要求您重新订阅感兴趣的主题
  • 保持
    clean_session
    标记为
    false
    以维护订阅,但主题的发布者必须以QoS为0的方式发布以绕过排队
    • 此外,发布者可以在发布的消息上将
      retained
      标志设置为
      true
      ,这将使代理保留该主题的最新消息,并在重新连接时将其发送给客户端
  • clean_session
    标志设置为
    true
    ,但确保制作人在发布时将
    retained
    标志设置为
    true
    ,这将使代理保留该主题的最新消息,并在重新连接时将其发送给客户端,但将支持任何QoS
  • 配置代理以将较少的丢失消息排队
...
much Device sent message
...
Device sent message
Device sent message
Device sent message
Device sent message
Device sent message
Device sent message
18666
18667
18668
wait handle : Connected with result code 0
##################info= create
##################info= delete
##################info= modify
##################info= create
##################info= delete
##################info= modify
##################info= create
##################info= delete
##################info= modify
##################info= create
##################info= delete
##################info= modify
18669
18670
18671
18672
18673
18674
Device sent message
Device sent message
Device sent message
Device sent message
...
...