paho mqtt python 客户端在向 GCP IoT Core 发送状态和事件后经常断开连接,并出现错误代码 7“连接丢失”

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

编辑:在这个问题的初始版本中,我使用的是Python paho-mqtt客户端版本

paho-mqtt 1.5.1
。我收到的该版本的错误消息是
on_disconnect 1: Out of memory. error code 1
。建议安装较新版本 (1.6) 的 paho-mqtt 客户端并重新运行代码。我这样做了,仍然遇到同样的自发断开连接,但较新的版本有更多描述性错误消息,在 1.6 版本中,我收到断开连接错误代码 7,这意味着“连接丢失”。

我正在模拟物联网设备。作为此模拟的一部分,我创建了一个 Messenger 类,该类在实例化时,通过 MQTT 协议与 Google Cloud 的 IoT 核心上的虚拟设备进行通信。我使用的客户端经常断开连接,导致消息丢失。我希望找到一种方法来防止客户端随机断开连接。

用于此通信的客户端嵌入在 Messenger 类中,是 python paho mqtt 客户端。 客户端 ID 使用以下代码从project_id、cloud_region、registry_id 和 device_id 派生而来

client_id = "projects/{}/locations/{}/registries/{}/devices/{}".format(project_id, cloud_region, registry_id, device_id)

客户端通过三种不同的方式与 IoT 核心进行通信:

  1. 它将数据发布到事件主题
sub_topic = "events"
mqtt_topic = "/devices/{}/{}".format(self.device_id, sub_topic)
client.publish(mqtt_topic, payload, qos=1)
  1. 订阅虚拟设备的配置主题
mqtt_config_topic = "/devices/{}/config".format(self.device_id)
sub_status = client.subscribe(mqtt_config_topic, qos=1)
  1. 它以不大于每 12 秒一次的频率向设备的状态主题发送状态信息。 (Google Cloud 建议每 10 秒不超过一次,因此我添加了几秒钟的回旋余地)。
sub_topic = "state"
mqtt_topic = "/devices/{}/{}".format(self.device_id, sub_topic)
payload = json.dumps(new_state)
client.publish(mqtt_topic, payload, qos=0)

最初我注意到并非所有发送到事件主题的数据都已发送。检查日志文件后,我确定问题是由于客户端频繁断开连接造成的。为客户端断开连接给出的错误代码为 1,从技术上讲,这是一个“内存不足”错误,但在 GCP 断开客户端连接时也会发生。我认为问题在于 GCP 断开客户端连接,但我不完全确定

以下是日志文件的摘录:


DEBUG Controller4.testA [04/Nov/2021:12:54:57.862] new client created
DEBUG Controller4.testA [04/Nov/2021:12:54:57.865] Publishing state to /devices/<DeviceID>/state
DEBUG Controller4.testA [04/Nov/2021:12:54:57.867] Sending PUBLISH (d0, q0, r0, m2), 'b'/devices/<DeviceID>/state'', ... (197 bytes)
DEBUG Controller4.testA [04/Nov/2021:12:54:57.870] Not publishing state: Previous state update 0:00:00.004303 seconds ago
DEBUG Controller4.testA [04/Nov/2021:12:54:57.870] on_publish client: <paho.mqtt.client.Client object at 0x15bf73670> userdata: None mid: 2
DEBUG Controller4.testA [04/Nov/2021:12:54:57.871] Sending PUBACK (Mid: 1)
DEBUG Controller4.testA [04/Nov/2021:12:54:57.947] Received CONNACK (0, 0)
DEBUG Controller4.testA [04/Nov/2021:12:54:57.951] on_connect Connection Accepted.
DEBUG Controller4.testA [04/Nov/2021:12:54:57.976] Received SUBACK
DEBUG Controller4.testA [04/Nov/2021:12:54:57.976] Subscribed: (1,)
DEBUG Controller4.testA [04/Nov/2021:12:54:57.978] Received PUBLISH (d0, q1, r0, m1), '/devices/<DeviceID>/config', ...  (20 bytes)
INFO Controller4.testA [04/Nov/2021:12:54:57.979] Received new state message '{"osmo": 6, "pH": 4}' on topic '/devices/<DeviceID>/config' with Qos 1
DEBUG Controller4.testA [04/Nov/2021:12:54:57.980] Not publishing state: Previous state update 0:00:00.114637 seconds ago
DEBUG Controller4.testA [04/Nov/2021:12:54:57.981] Sending PUBACK (Mid: 1)
DEBUG Controller4.testA [04/Nov/2021:12:55:01.958] on_disconnect 7: The connection was lost. error code 7<paho.mqtt.client.Client object at 0x15bf60b80>None

我目前正在开发虚拟私有云,但我不确定这是否重要。

为什么客户端老是断线?我该如何进一步解决这个问题?

python google-cloud-platform mqtt paho google-cloud-iot
1个回答
0
投票

我遇到了同样的错误:断开连接,原因代码为 7。就我而言,问题是由于订阅了太多主题(10+)引起的,因此我减少了订阅的主题数量。我知道你两年前问过这个问题,但这可能对其他人有帮助。

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