求助在设备离线消息获取问题?

使用的EMQX 版本为 [5.8.4 (Open Source)]

$SYS/brokers/${node}/clients/connected 和disconnected 事件中,怎么没有连接属性,用的MQTT V5 协议连接也没有? 这正常么?

$events/client_connected 和 disconnected 事件中有连接属性,但在离线事件中不带对应的上线时间? 而系统主题中的离线事件,却带 对应的上线时间 这正常么?

$events/client_disconnected 事件中,可以带上对应的上线时间么? 因为在实际测试中,客户端网络不好的情况下,设备会多次断开重连,其中断开消息会晚于最新的在线消息,导致覆盖掉最新的消息;

实测数据如下:
序号为1的离线事件,是序号3 在线事件对应的事件
序号2 为设备的最终状态,但序号3 的离线事件,在业务逻辑中不特殊处理的情况下,会覆盖掉设备的最终状态

 1、 {\"ipaddress\":\"36.110.46.106\",\"disconnected_at\":1740160870627,\"sockport\":8883,\"connected_at\":1740160813688,\"proto_name\":\"MQTT\",\"proto_ver\":5,\"clientid\":\"80482C7B0FE8\",\"username\":\"80482C7B0FE8\",\"ts\":1740160870627,\"protocol\":\"mqtt\",\"reason\":\"ssl_closed\"}"
 2、 {\"ipaddress\":\"36.110.46.106\",\"expiry_interval\":5000,\"clean_start\":false,\"sockport\":8883,\"connected_at\":1740160856111,\"proto_name\":\"MQTT\",\"proto_ver\":5,\"clientid\":\"80482C7B0FE8\",\"username\":\"80482C7B0FE8\",\"ts\":1740160856111,\"protocol\":\"mqtt\",\"keepalive\":60}"
 3、 {\"ipaddress\":\"36.110.46.106\",\"expiry_interval\":5000,\"clean_start\":false,\"sockport\":8883,\"connected_at\":1740160813688,\"proto_name\":\"MQTT\",\"proto_ver\":5,\"clientid\":\"80482C7B0FE8\",\"username\":\"80482C7B0FE8\",\"ts\":1740160813688,\"protocol\":\"mqtt\",\"keepalive\":60}"
 4、 {\"ipaddress\":\"36.110.46.106\",\"disconnected_at\":1740160807434,\"sockport\":8883,\"connected_at\":1740139101779,\"proto_name\":\"MQTT\",\"proto_ver\":5,\"clientid\":\"80482C7B0FE8\",\"username\":\"80482C7B0FE8\",\"ts\":1740160807434,\"protocol\":\"mqtt\",\"reason\":\"ssl_closed\"}"

在系统主题中每个离线事件有在线时间,可以根据在线时间判断,是否要丢弃到该离线事件;但通过规则引擎过来的数据离线数据,不带上线时间,就无法做这个判断;

正常,不过可以当一个 feature加到下个版本里。

也正常,后续可以在 disconnect 里面加上 connected_at时间。
这样,处理流程

  1. 收到 disconnect 事件时,存上connected_at时间。
  2. 收到下一个 disconnect 事件,对比 connected_at 时间,如果大于 1 中的时间就更新,否则就直接忽略。

我觉得这是一个非常好的需求建议!看看你还有什么要补充的么

1 个赞

没有要补充的了,期待这两个更新 :pray:

1 个赞