如何恢复或保持MQTT连接?

2024-06-16 09:05:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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

Tags: todebugselfclientloopappportconnection