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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions