Go IoT 开发平台对数据上报的思考

258 阅读5分钟

Go IoT 开发平台 是一个使用Go语言开发的免费、高效、可扩展的物联网解决方案。 该平台支持MQTT、HTTP、WebSocket、COAP、TCP/IP协议传输,提供轻量化的配置工具完成数据的报警功能,提供基于JavaScript的数据统计服务。

官网:iot-dev-egi.pages.dev/

仓库地址:gitee.com/pychfarm_ad…

我们正在寻找 React 开发工程师,欢迎你的加入。

事件说明

EMQX 随时能收到很多设备的秒级数据上报,但这可能不符合正常业务流程。例如,正常情况下设备可能每5分钟上报一次数据。为了识别上报数据的设备是否合法,我们需要一种方法来检测设备是否可能为恶意设备,故意频繁上报数据,试图影响 EMQX 的稳定性。

Go IoT 开发平台的解决方案

物理设备详情:在物理设备详情 (DeviceInfo)中存在两个关键字段 推送间隔(秒)推送时间误差(秒)。通过这两个字段,我们可以判断设备的上报行为是否异常,并据此进行后续的逻辑处理。

计算方法

要计算设备上报的速度是否在推送间隔和误差内,以及是否在误差外,我们首先需要定义一些变量和条件:

  1. 设备的推送间隔记为 TT(秒)。
  2. 设备的推送时间误差记为 EE(秒)。
  3. 设备的实际推送间隔记为 TactualT_{\text{actual}}(秒)。

0. 实际推送间隔计算

  1. 第一次推送时间戳:设备第一次推送数据的时间 T1T_{\text{1}}
  2. 第二次推送时间戳:设备第二次推送数据的时间 T2T_{\text{2}}
  3. 实际推送间隔Tactual=T2T1T_{\text{actual}} = T_2 - T_1

1. 计算是否在推送间隔和误差内

设备的速度被认为是在推送间隔和误差内,如果实际推送间隔 TactualT_{\text{actual}} 满足以下条件: TETactualT+ET - E \leq T_{\text{actual}} \leq T + E

2. 计算是否在误差外

设备的速度被认为是在误差外,如果实际推送间隔 TactualT_{\text{actual}} 不满足上述条件,即: Tactual<TETactual>T+ET_{\text{actual}} < T - E \quad \text{或} \quad T_{\text{actual}} > T + E

示例计算

假设:

  • 推送间隔 T=60T = 60
  • 推送时间误差 E=5E = 5
  • 设备在 2024年09月20日 10:00:00 发送了第一次数据 (即 T1T_1)
  • 设备在 2024年09月20日 10:01:05 发送了第二次数据 (即 T2T_2)

计算 TactualT_{\text{actual}}

Tactual=(10:01:0510:00:00)=65 秒 T_{\text{actual}} = (10:01:05 - 10:00:00) = 65 \text{ 秒 }

检查是否在推送间隔和误差内:

6056560+560 - 5 \leq 65 \leq 60 + 5 55656555 \leq 65 \leq 65 由于 55656555 \leq 65 \leq 65成立,所以设备的速度在推送间隔和误差内。

检查是否在误差外:

由于 6565不小于 60+560 + 5,所以设备的速度不在误差外。

通过这种方法,你可以准确地计算出设备的实际推送间隔,并进一步分析其是否符合设定的推送间隔和误差规则。

问题处理

通过前文提到的计算方法,我们可以判断上报的数据是否符合预期的推送间隔和误差范围。一般而言,符合这一范围的数据被认为是正常且需要处理的,而超出这一范围的数据则可能被视为异常,需要被舍弃。在 Go IoT 开发平台中,对于这类异常数据,我们会采取以下处理措施:

  1. 数据舍弃:直接将超出推送间隔和误差范围的数据舍弃处理,在消息队列消费时直接将这些数据ACK(Acknowledge),不进行持久化存储。

  2. 通过EMQX服务端管理工具进行维护

1. 通过EMQX的黑名单将客户端排除

使用 EMQX 的黑名单功能,我们可以针对恶意或异常上报的客户端进行限制。以下是禁用对象的优缺点及使用场景的详细分析:

禁用对象优点缺点使用场景
客户端ID- 精确度高,能够直接针对特定客户端进行限制。
- 易于实施,通常客户端ID是唯一的,易于管理和追踪。
- 如果客户端更换ID,需要重新添加到黑名单。
- 需要有机制来识别和记录客户端ID。
- 适用于需要精确控制单个设备或客户端的场景。
- 当可以容易地识别和记录上报设备的MQTT客户端ID时。
用户名- 可以针对使用相同用户名的一组设备进行管理。
- 简化了对一组设备的管理。
- 不适用于需要对单个设备进行精确控制的场景。
- 如果设备共用用户名,可能会错误地限制合法设备。
- 适用于设备按批次或规则使用相同账号密码的场景。
- 当设备管理较为集中,且不要求对单个设备进行精细控制时。
IP地址- 可以快速限制来自特定IP地址的所有请求。
- 对于固定IP的设备,管理起来简单有效。
- 对于动态IP或移动设备,效果不佳。
- 可能会误伤同一IP下的其他合法设备。
- 适用于设备具有固定IP地址的场景。
- 当需要快速限制来自特定IP的流量,且该IP下没有其他合法设备时。

上述三种应当首选客户端ID。

2. 通过EMQX提供的API接口将客户端剔除

EMQX 提供了 API 接口,允许管理员将特定的 MQTT 客户端从服务器中剔除。此方案需要注意的是,如果 MQTT 客户端实现了重连机制,那么单纯的剔除可能无法将这个客户端完全移除。

参考地址:EMQX 文档 - 客户端剔除