心跳包是否能通过主题或者 hook 方式获取到

环境信息

  • EMQX 版本:v4.3

问题描述

最近在考虑业务系统层否能通过监听心跳包来判断设备是否在线,所以想咨询下这种方式实现的可能性。

如果通过监听系统主题(设备上下线)作为设备是否在线的逻辑,有一个点需要需要处理:

  • 如果设备上线的时候,业务系统 client 没有在线(剔除,或者更新,下线,反正是没有会话存在),那么当业务系统 client 上线后,无法感知之前已经连接上的设备(设备下线也同理)

借此也想请教下大家有没有完善一点的方案可以讨论下

不行的。emqx 没将心跳包的事件对外暴露的(太多了,也没有必要)

一般用 client.connected, 和 client.disconnected 的事件来拿设备的上下线事件就可以了

像这种情况下,client.connected, 和 client.disconnected 的事件 不会重复发,有什么比较好的规避方案吗。
我这里想到一个:监听这2个事件,把上下线状态持久化(db, redis),不在内存中保存(因为服务可能 crash后丢失),如果服务crash掉,在销毁前重新上线就不会丢失2个事件的消息

是的,我们一般的做法有两种,
a. 使用 MQTT 客户端连接到 emqx 然后,共享订阅到上下线事件,并持久化。
b. 使用规则引擎处理这类事件,并推到kafka