IOT平台需要emqx推送连接建立事件,通过这个连接建立事件来知道设备上线了。但是,存在部分设备存在emqx一直不断的推送连接建立事件,没有推送连接断开事件,这种异常情况怎么处理?是设备端问题还是emqx配置不对呢。
EMQX 正常情况下断开都会有这个断开事件的,你可以自己搞个客户端模拟一下(这个应该很好模拟)。
PS: 以前出过有一些极端情况会出现个别没有断开事件的 bug,后面新版本应该都修好了。最好报一个你的 emqx 是怎么版本的。
V5.8.9 版本,这种情况也是偶尔发生,出现之后就是不断推送连接建立事件,通过webhook。
不能只看业务侧的上线日志。
截图里的记录是业务系统写出来的“设备上线”事件,不能证明 EMQX 没有产生断开事件。v5.8.9 里 client.disconnected 事件会带 reason、connected_at、disconnected_at,先把同一个 Client ID 的完整事件链打出来。
排查顺序:
- 在 EMQX Dashboard 开日志追踪,按这个设备的 Client ID 过滤,等它复现一次。重点看断开原因:
keepalive_timeout、tcp_closed、takenover、discarded。 - Webhook / 规则里确认同时监听了连接建立和连接断开事件,不要只选了“连接建立”。断开事件对应
$events/client/disconnected。 - 业务侧更新在线状态时用
connected_at做幂等:如果收到旧连接的断开事件,不要覆盖更新连接的在线状态。 - 如果同一个 Client ID 的
connected_at一直变化,基本就是设备端、网络/NAT 或同 Client ID 多实例在重连;这时重点查设备 keepalive、TCP 断链、是否有多个客户端用了同一个 Client ID。
感谢大佬的回复,我先排查一下。
