Go IoT 开发平台 是一个使用Go语言开发的免费、高效、可扩展的物联网解决方案。 该平台支持MQTT、HTTP、WebSocket、COAP、TCP/IP协议传输,提供轻量化的配置工具完成数据的报警功能,提供基于JavaScript的数据统计服务。
我们正在寻找 React 开发工程师,欢迎你的加入。
事件说明
EMQX 随时能收到很多设备的秒级数据上报,但这可能不符合正常业务流程。例如,正常情况下设备可能每5分钟上报一次数据。为了识别上报数据的设备是否合法,我们需要一种方法来检测设备是否可能为恶意设备,故意频繁上报数据,试图影响 EMQX 的稳定性。
Go IoT 开发平台的解决方案
物理设备详情:在物理设备详情 (DeviceInfo)中存在两个关键字段 推送间隔(秒) 和 推送时间误差(秒)。通过这两个字段,我们可以判断设备的上报行为是否异常,并据此进行后续的逻辑处理。
计算方法
要计算设备上报的速度是否在推送间隔和误差内,以及是否在误差外,我们首先需要定义一些变量和条件:
- 设备的推送间隔记为 (秒)。
- 设备的推送时间误差记为 (秒)。
- 设备的实际推送间隔记为 (秒)。
0. 实际推送间隔计算
- 第一次推送时间戳:设备第一次推送数据的时间 。
- 第二次推送时间戳:设备第二次推送数据的时间 。
- 实际推送间隔:
1. 计算是否在推送间隔和误差内
设备的速度被认为是在推送间隔和误差内,如果实际推送间隔 满足以下条件:
2. 计算是否在误差外
设备的速度被认为是在误差外,如果实际推送间隔 不满足上述条件,即:
示例计算
假设:
- 推送间隔 秒
- 推送时间误差 秒
- 设备在 2024年09月20日 10:00:00 发送了第一次数据 (即 )
- 设备在 2024年09月20日 10:01:05 发送了第二次数据 (即 )
计算
检查是否在推送间隔和误差内:
由于 成立,所以设备的速度在推送间隔和误差内。
检查是否在误差外:
由于 不小于 ,所以设备的速度不在误差外。
通过这种方法,你可以准确地计算出设备的实际推送间隔,并进一步分析其是否符合设定的推送间隔和误差规则。
问题处理
通过前文提到的计算方法,我们可以判断上报的数据是否符合预期的推送间隔和误差范围。一般而言,符合这一范围的数据被认为是正常且需要处理的,而超出这一范围的数据则可能被视为异常,需要被舍弃。在 Go IoT 开发平台中,对于这类异常数据,我们会采取以下处理措施:
-
数据舍弃:直接将超出推送间隔和误差范围的数据舍弃处理,在消息队列消费时直接将这些数据ACK(Acknowledge),不进行持久化存储。
-
通过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 文档 - 客户端剔除