Skip to content

iot设备异常退出时,没有触发disconnect #308

@simplebing

Description

@simplebing

我在使用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进行用户、主题验证,效果非常好,感谢作者!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions