一位做运维的工程师这么描述:“设备面板上显示连接成功,绿灯,平台那边就是没数据,重启一下能好半天,第二天又断了。”设备大概率没坏,平台也没把你拉黑。最可能的原因是“假在线”:TCP 会话通了,HJ212-2025 的应用层握手没走完——要么心跳没被应答,要么报文被判无效整包丢弃。按下面这个顺序查,多数情况两小时内能定位。
“连接成功”只代表 TCP 三次握手成了
数采仪面板上那个“已连接”,判断依据只有一个:和服务端 IP 端口的三次握手建立了。它并不知道对面是不是真的按 HJ212-2025 在收包,也不知道自己发出去的包被平台判成了无效。链路层通、应用层不通,在企业现场是最常见的一种断法,也是最容易被误判成“网络不好”或“设备坏了”的一类。
四层逐个看,问题通常固定落在某一层
- 网络层:运营商侧或防火墙的 NAT 会话老化时间短于心跳周期,映射表被回收了,但设备侧的连接状态还挂着;APN 专网掉线后不自愈;中间设备主动回 RST;平台换 IP 后设备侧 DNS 缓存没刷新。
- 协议层:报文结构是 ## + 4 位数据段长度 + 数据段 + 4 位 CRC + 回车换行。长度必须按“字节数”算,不是字符数,数据段里有中文或超长就要按规则分包;CRC 只算数据段,不含 ## 和长度位;CP 参数要用 CP=&&…&& 包裹;QN、ST、CN、PW、MN、Flag 这些字段一个都不能缺,Flag 里的应答位、分包位填错,平台就会当成非法包。
- 设备层:时钟偏差导致 QN 时间戳跑出平台容忍窗口;串口取数断了但通讯模块还在照常发心跳,平台看到“在线”却永远收不到 CN=2000 这类实时数据包;断电补传队列堵塞;主备中心切换后没回主。
- 平台层:MN 没在平台备案;平台按 HJ212-2025 收包时对字段完整性和时间的校验更严,缺一个字段整包丢弃;重复 QN 被去重;上位机下发的 1013(超时时间与重发次数)和设备侧设置对不上。
为什么先看网络、再看报文、最后看设备
顺序本身就是效率。网络层问题复现率最低但验证最快,几分钟能排除;协议层问题出现频率最高,抓一段原始报文基本就能定性;平台层的问题最容易被误判成设备故障,所以要放在看到平台侧收包日志之后;设备本地数据放到最后,因为前面的结论会直接决定你该不该翻本地存储。倒过来查,往往换了一圈板子、换了两张卡,问题还在。
每一步的判断标准和处置动作
- 现象:断开重连立刻恢复,几小时后必掉。判断:NAT 映射老化,心跳周期比映射存活时间长。动作:把心跳周期压到 60 秒以内,并确认 9011 心跳发出去后能收到 9012 应答,不是只发不收。
- 现象:平台日志里有连接记录,没有数据记录。判断:报文在应用层被丢。动作:在数采仪侧抓一段原始报文,逐字段比对,不要只看“发送成功”计数。
- 现象:## 后面的 4 位长度和实际字节数对不上。判断:长度按字符算或分包处理错误。动作:改为按字节计,超长按 Flag 分包位拆包,并在平台侧确认粘包拆包逻辑。
- 现象:平台回 CRC 校验失败。判断:校验范围算错或大小写不规范。动作:确认只对数据段做 CRC16,输出四位十六进制,且不把 ## 和长度位算进去。
- 现象:平台收到包但标记无效、字段缺失。判断:字段不齐或不满足新版校验。动作:对照平台下发的收包规则,把时间、状态类字段补齐再发。
- 现象:实时数据正常,历史数据一直补不上去。判断:补传链路的 QN 被去重或应答超时。动作:检查 3020 这类历史数据应答包有没有正常回来,QN 是否和已发送记录重复。
- 现象:QN 时间和平台显示差几分钟。判断:设备时钟漂移。动作:走 1012 校时或设备侧 NTP,别靠人工改表。
三个最容易踩的坑
- 用调试助手在本地回环测通,就认定设备没问题。回环不经过运营商网络,也不经过平台校验,长度和 CRC 的错误会被完全掩盖。
- 看到“连接成功”就换卡、换天线。把网络层当成唯一嫌疑,结果协议层的应答位一直填错,换十张卡也一样。
- 一上来就把历史数据全补传。大批补传包挤掉实时数据的上传队列,QN 顺序一乱还会被判重复丢弃,看起来就像“越补越没数据”。
客户常问的四个问题
问:我这个情况到底要不要传?
答:先看平台侧有没有给你下发收包规则和上传频次要求,有就按它的来。拿不准的,把实时数据保住,历史数据排队补,不要一起发。
问:是不是数采仪坏了,换一台能不能解决?
答:先抓一段报文。报文能正常组出来、CRC 也对,问题基本不在设备;组不出来或者字段缺,再考虑设备侧配置和固件。
问:心跳设短一点是不是更稳?
答:能压住 NAT 老化,但不是越短越好。太短会增加平台侧连接压力,也可能触发频次限制。60 秒以内先试,稳定了再回调。
问:补传能不能一次全传上去?
答:不建议。分批、按时间顺序补,每批等应答回来再发下一批,比一次性灌进去成功率高得多。