物联网系统完成设备接入后,并不意味着数据已经可以直接用于告警、报表和业务分析。
真实项目中经常会出现这些现象:
-
同一条数据被上传多次;
-
后产生的数据反而先到达平台;
-
设备断网后一次性补传大量历史数据;
-
传感器数值突然变成0、-1或65535;
-
设备时间与平台时间相差几个小时;
-
设备已经离线,页面仍显示最后一次正常数据;
-
同一测点在短时间内频繁跳变;
-
网关重启后,累计值突然归零。
如果平台只是把收到的数据原样写入数据库,最终得到的往往不是可信的设备数据,而是一批需要业务系统自行判断的原始消息。
本文从工程角度梳理物联网设备数据异常的识别和处理方法。
一、为什么物联网数据容易出现异常?
物联网数据链路通常包含多个环节:
传感器
↓
PLC或设备控制器
↓
RS-485、CAN、以太网等现场总线
↓
边缘网关
↓
4G、5G、Wi-Fi或有线网络
↓
MQTT Broker或接入服务
↓
数据解析与规则处理
↓
时序数据库和业务系统
任何一个环节发生重试、缓存、网络切换、进程重启或时钟异常,都可能影响最终数据。
因此,平台不能只根据"消息是否到达"判断数据是否正常,还要识别消息身份、产生时间、到达顺序以及数据质量。
二、重复数据是怎么产生的?
重复数据常见于采用"至少一次"投递机制的系统。
以MQTT QoS 1为例,发送方需要收到PUBACK才能确认消息已经成功送达。如果设备已经发送消息,但确认包在网络中丢失,设备会再次发送同一条消息。
从通信可靠性的角度看,这种重发是合理的;但如果业务侧没有幂等处理,同一条数据就可能被写入两次,甚至触发两次告警或生成两张工单。
其他可能产生重复数据的情况包括:
-
网关本地缓存重复补传;
-
消费端处理完成但确认失败;
-
消费服务重启后重新消费消息;
-
多个采集任务重复读取同一测点;
-
设备重复注册或配置重复下发;
-
消息队列发生重新投递。
解决方法:为每条消息建立唯一标识
建议在设备或网关侧生成消息ID,例如:
{
"deviceId": "pump-001",
"messageId": "pump-001-1726012800123-00038",
"timestamp": 1726012800123,
"properties": {
"pressure": 0.62,
"temperature": 48.5
}
}
平台可以使用以下组合作为幂等键:
deviceId + messageId
如果设备无法生成稳定的messageId,也可以使用:
deviceId + 数据类型 + 设备时间 + 数据内容摘要
但这种方式要注意:同一毫秒内产生两条内容相同的合法数据时,可能被误判为重复。
去重记录保存多久?
去重窗口需要根据业务特点设置。
例如:
-
高频遥测数据:保存几分钟到几小时;
-
告警事件:保存数天;
-
工单和控制指令:长期保存业务幂等记录。
如果窗口过短,延迟重试的数据可能无法被识别;如果窗口过长,则会增加存储和查询成本。
三、数据乱序应该怎么处理?
数据乱序是指数据产生顺序与平台接收顺序不一致。
例如,设备依次产生三条数据:
10:00:01 温度 25℃
10:00:02 温度 26℃
10:00:03 温度 27℃
由于网络延迟,平台实际收到的顺序可能是:
10:00:01
10:00:03
10:00:02
如果平台简单地把"最后收到的数据"作为设备最新状态,最终显示的温度就会从27℃退回26℃。
不要只使用平台接收时间
一条设备数据至少应该保留三个时间字段:
eventTime:设备实际采集时间
gatewayTime:网关接收或转发时间
ingestTime:平台接收时间
它们分别用于:
-
eventTime:还原真实的业务时间线; -
gatewayTime:排查设备到网关之间的问题; -
ingestTime:分析网络及平台处理延迟。
设备最新状态通常应按照eventTime更新,而不是按照消息到达平台的先后顺序更新。
使用滑动时间窗口处理乱序
对于允许短暂延迟的场景,可以在平台侧设置一个时间窗口,例如30秒。
平台收到数据后不立即完成最终排序,而是在窗口内按eventTime重新排列。超过窗口才到达的数据,可以标记为迟到数据并执行单独策略。
需要实时控制的场景不能设置过大的等待窗口,应在实时性和数据完整性之间取舍。
四、设备断网补传需要注意什么?
很多网关具有本地缓存能力。网络中断时,数据暂存在本地;网络恢复后,再把历史数据上传到平台。
断点续传可以减少数据丢失,但也会带来新的问题:
-
短时间内产生大量消息;
-
历史数据触发当前告警;
-
数据库写入出现瞬时峰值;
-
规则引擎重复计算历史状态;
-
平台误以为设备当前状态发生剧烈变化。
补传数据必须带原始采集时间
如果补传数据只带上传时间,平台就无法还原历史过程。
正确的数据至少应包含:
{
"deviceId": "meter-008",
"eventTime": "2026-09-11T08:30:15+08:00",
"ingestTime": "2026-09-11T10:42:07+08:00",
"isHistory": true,
"value": 128.6
}
isHistory字段不是必需形式,但平台需要通过某种方式区分实时数据和历史补传数据。
历史数据不要直接触发实时告警
可以采用以下策略:
-
历史数据正常写入时序数据库;
-
更新历史报表和统计结果;
-
不触发短信、电话等实时通知;
-
不覆盖时间更新的设备当前状态;
-
必要时重新计算对应时间段的历史告警。
否则,设备恢复网络后,运维人员可能突然收到几十分钟前已经失效的告警。
不同设备在故障状态下可能输出不同的异常值。
常见情况包括:
0
-1
65535
9999
NaN
null
保持最后一次数据
超过量程的极大值或极小值
不能简单地认为0一定无效。例如,流量为0可能是设备停机后的正常状态;室外温度为0℃也完全合理。
因此,异常值判断需要结合设备类型、测点含义和运行状态。
1. 使用合理范围
例如:
温度:-40℃~150℃
压力:0MPa~2.5MPa
电压:180V~260V
超出物理或业务范围的数据,可以标记为越界。
2. 使用变化速率
某些值虽然没有超过量程,但变化速度不符合物理规律。
例如,水箱液位在一秒内从20%跳到95%,可能是通信解析、倍率或传感器出现问题。
可以定义:
变化率 = |当前值 - 上一个有效值| / 时间间隔
变化率超过阈值时,将数据标记为突变异常。
3. 使用关联关系
单个测点看起来正常,不代表整体数据合理。
例如:
-
设备显示停机,但功率仍然很高;
-
阀门开度为0,流量却持续增加;
-
总表能耗小于多个分表能耗之和;
-
设备离线后仍持续产生实时数据。
通过多个测点之间的逻辑关系,可以发现单点规则无法识别的问题。
六、不要直接删除异常数据
发现脏数据后,最危险的做法是直接修改或删除原始记录。
更合理的方式是保留原始值,同时增加数据质量标记。
例如:
{
"deviceId": "sensor-021",
"eventTime": 1726021815000,
"rawValue": 65535,
"value": null,
"quality": "INVALID",
"qualityReason": "OUT_OF_RANGE"
}
常见的数据质量状态可以设计为:
GOOD:数据正常
DUPLICATE:重复数据
LATE:延迟到达
OUT_OF_ORDER:乱序数据
OUT_OF_RANGE:超出合理范围
STALE:数据长时间未更新
PARSE_ERROR:解析失败
ESTIMATED:估算或补算数据
MANUAL:人工修正数据
这样做有三个好处:
-
业务系统可以只使用质量正常的数据;
-
运维人员可以追溯异常原因;
-
后续调整清洗规则时,可以基于原始数据重新计算。
七、设备离线后为什么还显示正常数据?
很多平台使用"最后值"展示设备状态。
设备在10点上传温度25℃,随后断线。如果页面一直显示25℃,用户可能误以为这是当前实时温度。
解决方法是把"数据值"和"数据新鲜度"分开判断。
例如,设备正常采集周期为一分钟,可以设置:
数据年龄不超过2分钟:实时
2~5分钟:延迟
超过5分钟:失效
页面除了展示数值,还应该展示:
-
最后采集时间;
-
最后接收时间;
-
数据质量;
-
设备在线状态。
业务规则在使用数据时,也应先判断数据是否过期。
八、累计值归零或回退怎么处理?
电表、水表和设备运行时间通常属于累计值。设备重启、换表或计数器溢出后,累计值可能突然变小。
如果直接用:
本期用量 = 当前累计值 - 上期累计值
就可能得到负数。
平台需要区分以下情况:
-
设备正常累计;
-
计数器达到上限后翻转;
-
设备重启清零;
-
更换了新设备;
-
人工修改初始值;
-
数据乱序导致旧值晚到。
处理累计量时,建议记录设备更换和清零事件,并将原始累计值转换为连续的业务累计值。
不要简单地把所有负增量都改成0,否则可能掩盖设备故障或配置错误。
九、数据处理顺序应该怎么设计?
一个常见的数据处理流程如下:
消息接收
↓
身份与权限校验
↓
协议解析
↓
消息去重
↓
时间校验
↓
单位与数据类型转换
↓
范围及突变检查
↓
数据质量标记
↓
更新设备最新状态
↓
写入时序数据库
↓
进入规则引擎和业务分发
顺序很重要。
例如,如果在去重之前触发规则,同一条告警可能被执行多次;如果在时间判断之前更新设备状态,延迟数据可能覆盖最新数据;如果清洗后不保留原始值,后续将无法定位解析问题。
十、项目中应该监控哪些数据质量指标?
除了设备在线率,还建议监控以下指标:
消息重复率
数据解析失败率
迟到数据比例
乱序数据比例
异常值比例
关键测点缺失率
平均数据延迟
补传消息数量
过期数据数量
各设备的数据更新时间分布
这些指标可以帮助快速判断问题发生在设备、网关、网络还是平台处理环节。
例如:
-
大量设备同时延迟,可能是网络或平台拥塞;
-
单个型号集中解析失败,可能是协议模板错误;
-
某个网关下的设备频繁重复,可能是缓存确认机制异常;
-
单个传感器持续越界,可能是硬件损坏或量程配置错误。
总结
物联网数据治理不是简单地"删除错误数据",而是建立一套能够识别、标记、修正和追溯异常的处理机制。
实际项目中需要重点解决:
-
使用消息唯一标识实现幂等和去重;
-
同时记录设备时间、网关时间和平台接收时间;
-
通过时间窗口处理乱序和延迟数据;
-
区分实时消息与离线补传消息;
-
结合量程、变化率和关联关系识别异常值;
-
保留原始数据并增加数据质量码;
-
防止过期数据和历史数据覆盖设备最新状态;
-
对累计值清零、翻转和设备更换进行专门处理。
设备接入解决的是数据能否到达平台,数据治理解决的则是这些数据能否被可靠使用。
对于需要支撑告警、能源统计、设备运维和业务决策的系统来说,后者往往更加重要。
延伸阅读: