首页 > 解决方案 > 如何恢复或保持 MQTT 连接?

问题描述

我正在使用 gmqtt 连接到服务以捕获通知推送。一切正常,但工作大约 20 小时后,连接断开。我不知道如何恢复或保留它。

我使用 gmqtt 和 asyncio

这是我打开连接的方式:

if __name__ == "__main__":
    loop = asyncio.get_event_loop()

    try:
        loop.run_until_complete(listener_worker())
    except asyncio.CancelledError:
        pass

问题是我如何在失去连接后恢复连接?

日志:

...
2021-02-27T14:22:51.137758390Z app[web.1]: DEBUG:gmqtt.client:[KEEP ALIVE]
2021-02-27T14:22:51.170936955Z app[web.1]: DEBUG:gmqtt.mqtt.handler:[CMD 0xd0] b''
2021-02-27T14:22:51.171640770Z app[web.1]: DEBUG:gmqtt.mqtt.handler:[PONG REQUEST] 0xd0 b''
...
2021-02-27T14:30:21.140431995Z app[web.1]: DEBUG:gmqtt.client:[KEEP ALIVE]
...
2021-02-27T14:37:51.142950695Z app[web.1]: DEBUG:gmqtt.client:[KEEP ALIVE]
2021-02-27T14:37:51.176334802Z app[web.1]: DEBUG:gmqtt.mqtt.handler:[CMD 0xd0] b''
2021-02-27T14:37:51.176967526Z app[web.1]: DEBUG:gmqtt.mqtt.handler:[PONG REQUEST] 0xd0 b''
...
2021-02-27T14:45:21.145039908Z app[web.1]: DEBUG:gmqtt.client:[KEEP ALIVE]
...
2021-02-27T14:46:58.985163975Z app[web.1]: INFO:gmqtt.mqtt.protocol:[CONN CLOSE NORMALLY]
2021-02-27T14:46:58.985715987Z app[web.1]: DEBUG:gmqtt.mqtt.handler:[CMD 0xe0] b''
...
2021-02-27T14:52:51.146237434Z app[web.1]: WARNING:gmqtt.mqtt.protocol:[TRYING WRITE TO CLOSED SOCKET]
2021-02-27T14:52:51.146868660Z app[web.1]: DEBUG:gmqtt.client:[KEEP ALIVE]
...
2021-02-27T15:00:21.152518544Z app[web.1]: WARNING:gmqtt.mqtt.protocol:[TRYING WRITE TO CLOSED SOCKET]
2021-02-27T15:00:21.153076405Z app[web.1]: DEBUG:gmqtt.client:[KEEP ALIVE]
...
2021-02-27T15:07:51.157319919Z app[web.1]: WARNING:gmqtt.mqtt.protocol:[TRYING WRITE TO CLOSED SOCKET]
2021-02-27T15:07:51.157989641Z app[web.1]: DEBUG:gmqtt.client:[KEEP ALIVE]
...
2021-02-27T15:15:21.162938438Z app[web.1]: WARNING:gmqtt.mqtt.protocol:[TRYING WRITE TO CLOSED SOCKET]
2021-02-27T15:15:21.163468707Z app[web.1]: DEBUG:gmqtt.client:[KEEP ALIVE]
...
2021-02-27T15:22:51.169491883Z app[web.1]: WARNING:gmqtt.mqtt.connection:[LOST HEARTBEAT FOR 1800 SECONDS, GOING TO CLOSE CONNECTION]
2021-02-27T15:22:51.170344849Z app[web.1]: DEBUG:gmqtt.client:[KEEP ALIVE]
...

就是这样。通知不来,我必须手动重新启动。

连接功能:

async def connect(self, host, port=1883, ssl=False, keepalive=900):
    # Init connection
    self._host = host
    self._port = port
    self._ssl = ssl
    self._keepalive = keepalive

    self._connection = await self._create_connection(
        host, port=self._port, ssl=self._ssl, clean_session=self._clean_session, keepalive=keepalive)

    await self._connection.auth(self.fbns_auth, will_message=self._will_message,
                                **self._connect_properties)
    await self._connected.wait()

    loop = asyncio.get_event_loop()
    while not await self._persistent_storage.is_empty:
        await loop.create_future()

    if self._error:
        raise self._error

标签: pythonsocketsmqttpython-asyncio

解决方案


推荐阅读