-
Notifications
You must be signed in to change notification settings - Fork 70
Description
我在使用iot设备(4G DTU)登录broker时,由于掉线、断电引起的设备掉线,
broker无法检测到,无法断开连接,sessio一直存在,直到我手动停止broker服务。
这种iot设备的特性:
永远不会有正常退出登录的机制,所以当设备维护、断电时,无法在broker有正确的断线机制。
我在config加入了 下面的参数也没用:
"timeout_disconnect_delay": 0,
"session_expiry_interval": 0,
我的event监听器如下,但是意外离线的设备,无法捕捉callback
async def on_broker_client_connected(
self, *, client_id: str, client_session: Session
) -> None:
logger.info(f"client_id:{client_id} 已连接")
async def on_broker_client_disconnected(
self, *, client_id: str, client_session: Session
) -> None:
logger.info(f"client_id:{client_id} 已断开")
给一些日志参考:
设备正常连接,每分钟发上来数据:
2025-12-25 22:41:07/INFO/main.py:40/MQTT server start on port 1883
2025-12-25 22:41:11/INFO/plugins.py:134/client_id:device_867920073518756 已连接
2025-12-25 22:41:45/INFO/plugins.py:144/发布消息 device_867920073518756:device/867920073518756/pub {"noise":"41.80","cmd":"data"}
此时设备刚发布了消息,我手动给设备断电,但是broker一直不知道设备断开了,持续了10多分钟
直到22:55我重启了broker(使用 pm2 restart)
2025-12-25 22:55:50/INFO/plugins.py:139/client_id:device_867920073518756 已断开
2025-12-25 22:55:50/INFO/main.py:47/MQTT server down due to cancellation
随着broker的结束服务前的处理机制,才检测到iot设备断开。
2025-12-25 22:55:50/INFO/main.py:41/MQTT server start on port 1883
接下来服务器重新启动,22:56设备我通电,设备正常上线。
2025-12-25 22:56:12/INFO/plugins.py:134/client_id:device_867920073518756 已连接
2025-12-25 22:56:14/INFO/plugins.py:144/发布消息 device_867920073518756:device/867920073518756/pub {"cmd":"online","iccid":"898604781025D0265385"}
其他的功能插件非常完美,我用mysql进行用户、主题验证,效果非常好,感谢作者!