python - 如何恢复或保持 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
解决方案
推荐阅读
- asp.net - 如何使用 MVC 5 在控制器外部访问 HttpContext?
- azure-devops - 条件内带有 bash 表达式的 Azure Pipeline
- c# - 我想调用一个位于多个 GameObjects 上的脚本上的函数。但我希望该函数在该实例中仅激活一个对象
- r - 在这种情况下如何正确使用 label_wrap_gen ?
- sql - 从同一张表中计算雇用后的年数
- javascript - 获取 SVG 地图以在点击时更改颜色
- amazon-web-services - 无法连接到 vpc 外部的数据库
- powershell - Powershell - 以递归方式将文本附加到子目录中的文件名末尾
- excel - 如何在使用自动过滤器过滤结果后复制一个特定的列 - VBA
- r - 将 NA 替换为 0 并将所有其他值/文本替换为 1