农业面源污染治理平台收不到数据,多半卡在这三层

“数采仪上显示连接成功,农业面源污染治理平台上就是没数据。”这是我们在华东某农业面源治理项目上被问得最多的一句话。结论先给:绝大多数情况下不是网络断了,也不是数采仪坏了,而是报文已经到了平台门口却没被“认领”——MN 编号没备案、命令码没进平台解析白名单、因子编码和平台字典对不上,这三类占了大头。

下面按协议层、网络层、设备层、平台层拆开说,再说排查顺序为什么必须这么排。

一、四层拆解:数据到底卡在哪

协议层:报文本身能不能过

农业面源点位普遍走 HJ 212 报文,包结构是“## + 4 位数据段长度 + 数据段 + 4 位 CRC16 + 回车换行”。数据段里 QN、ST、CN、PW、MN、Flag、CP 每个字段都可能是拦截点。

  • CN 命令码:心跳一般是 1013,实时数据 2011,小时数据 2013,设施运行状态类走 3020。很多平台只开了 2011 的解析,点位却按小时上报 2013,于是“连上了、没数据”。
  • MN 编号:平台侧必须先备案这个设备号,没备案的报文一律静默丢弃,不回错误码。
  • Flag 标志位:N 正常、D 人工、M 维护。部分平台只入库 Flag=N 的数据,调试时把标志位设成 M 忘了改回来,数据就一直进不去。
  • DataTime 与 CRC16:校验错平台直接丢包;设备时钟漂移过大,DataTime 超出平台允许窗口也会被拒。

网络层:链路通不等于业务通

  • 定向流量卡只放行指定 IP 和端口,换了平台地址没同步改白名单,表现就是 TCP 连不上或连上即断。
  • APN 专网参数配错,设备能拿到 IP 但出不去。
  • 心跳间隔大于运营商 NAT 的空闲回收时间,长连接被悄悄掐断,设备侧还显示“已连接”。
  • 田间点位信号弱,CSQ 长期偏低,报文发一半超时重发。

设备层与平台层

  • 设备层:太阳能供电的点位夜间掉电重启后未自动重连;本地缓存循环覆盖,补传数据被冲掉;时钟长期靠平台对时,离线久了漂移。
  • 平台层:因子编码与平台字典不一致;省、市两级平台双传时 ST 系统编码填错;平台侧只做展示没做入库,日志里看得到报文、库里查不到数。

二、排查顺序:先平台,后设备

顺序本身就是知识。第一步一定是找平台侧要报文接收日志,因为那是唯一能看到“报文到底有没有到”的位置。日志为空,问题在网络层或设备发送环节;日志有包但库里没数,问题在协议字段或平台解析。反过来先拆设备、先换卡,往往白折腾半天。

第二步看心跳 1013 有没有正常往返,心跳通说明链路和 MN 是被平台认的。第三步再看业务命令码 2011、2013 有没有发出去,把“链路问题”和“业务问题”彻底分开。第四步才轮到抓包核对 CP 数据段和 CRC。

三、每一步看什么、怎么处置

  • 现象:平台日志为空,设备显示已连接。判断:建链成功但没发出业务报文,或端口走错。动作:查设备发送日志与目标 IP 端口,核对 CN 是否按平台要求配置。
  • 现象:日志有 1013 心跳,没有 2011、2013。判断:业务上报未开启或采集通道异常。动作:检查上报周期与通道使能,确认数据源有值。
  • 现象:日志有报文,平台无数据。判断:MN 未备案、Flag 非 N、因子编码不符或 DataTime 越界。动作:逐字段比对平台字典,先改 MN 和 Flag 复测。
  • 现象:换手机卡能通,现场卡不通。判断:定向卡白名单未加平台地址。动作:提交 IP 与端口开通,不要靠换卡绕过。

四、三个容易踩的坑

坑一:把“连接成功”当成“数据已送达”

连接成功只证明 TCP 握手过了,跟平台解不解析是两件事。心跳能过、业务数据被丢,是完全正常的组合。

坑二:只测实时数据,不看小时数据

面源点位数据频次低,很多现场只配了 2013。用 2011 测通了就收工,回头平台还是空库。

坑三:拿自己的卡去现场试

测试卡能传,装回定向卡就不行,问题从头到尾都在白名单,不在设备。这类误判最耽误时间。

五、几个客户常问的问题

“数采仪显示连接成功,平台上就是没数据,是不是设备坏了?”

先别拆设备。让平台方导一份报文接收日志,有包就是解析问题,没包再往设备和网络查。

“我这个面源点位一天就几条数据,到底要不要传小时数据?”

看平台要求。要求 2013 就必须开,只传 2011 平台可能照样收不到;不确定就让平台把两个命令码都加进白名单。

“现场断电重启后就再也连不上了,什么情况?”

优先查时钟和重连逻辑。断电久了时钟漂移,DataTime 越界会被整包丢弃,表现就是“连上了没数据”。

“换了个平台,只改了个 IP,怎么数据就乱了?”

IP 只是入口,MN 备案、命令码白名单、因子编码字典都要在新平台重新对一遍,改一个参数解决不了。