接入一台工业设备,演示版本通常很快:建立连接、读取寄存器、打印数值。
进入平台以后,链路会变成:
物理设备
-> 协议驱动
-> 数据解析
-> 设备身份映射
-> 本地缓存或时序库
任何一层语义不一致,问题都可能在很远的下游才出现。顺着这条链路看,工业设备接入要处理的问题会清楚很多。
一、连接层:连接成功不等于可以通信
现场常见的接入方式包括串口、TCP、Modbus、厂商私有协议、HTTP、SOAP 和 MQTT。连接层需要统一管理:
- 建连与认证;
- 读取、写入超时;
- 心跳;
- 断线重连;
- 连接状态;
- 优雅关闭。
重连要使用退避策略,避免设备断电后所有客户端同时高频重试:
1s -> 2s -> 4s -> 8s -> 30s
成功通信后再重置退避时间。连接对象还要有明确所有者,不能由多个 goroutine 在没有协调的情况下同时重连和关闭。
二、解析层:不要让原始协议泄漏到业务层
协议返回的是字节、寄存器或厂商字段,业务需要的是温度、压力、运行状态和告警。
解析层应完成:
- 字节序处理;
- 数据类型转换;
- 缩放系数;
- 单位标准化;
- 位域解析;
- CRC 或校验和;
- 异常值识别。
例如一个寄存器值 253,可能表示 25.3℃。下游不应该再次猜测缩放规则,标准模型里应直接保存数值、单位和质量信息。
三、身份层:先回答“这是谁”
设备可能同时拥有IP、序列号、厂商编号、数据库 ID 和 GUID。IP 会变,名称会重,数据库自增 ID 只在局部有意义。
稳定身份应该由平台统一下发或维护,并贯穿:
配置 -> 采集 -> 存储 -> 转发 -> 告警 -> 页面
四、时间层:数据是什么时候发生的
工业数据里至少有三个时间:
- 设备产生时间;
- 网关采集时间;
- 平台接收时间。
工业设备接入的难点,不在于写一个 demo 读到数据,而在于把数据稳定、准确、可追溯地送进平台。