4. HJ 212协议报文结构解析
HJ 212 是污染源在线监控系统中最常用的通信协议之一,数采仪与监控平台之间的数据上报、命令下发、状态交互都依赖它完成。很多现场联调失败,并不是网络不通,而是报文结构理解不到位:帧头少了一个字节、数据段长度算错、污染因子编码对不上、响应码判断错误,都会导致平台“收到数据但解析失败”。本节把一条 HJ 212 报文拆开来看,重点解决“一条报文由哪些部分组成、每部分怎么算、字段怎么填、返回码怎么读”这四个问题。
一、帧格式:一条报文的外层骨架
HJ 212 报文采用“双包头 + 数据段 + 包尾”的结构,整体是 ASCII 字符流。一条完整报文依次由以下部分组成:包头(两个字节 ##)、数据段长度(4 位十进制数字,表示数据段本身的字节数)、数据段(含请求编码、系统编码、命令编码、总包数、包号、应答标志、正文内容等)、CRC 校验(4 位十六进制字符)、包尾(\r\n 回车换行)。
这里最容易出错的是“数据段长度”的算法。它统计的是数据段本身的字符数,不包含包头、长度字段、CRC 和包尾。例如数据段内容为 QN=20240612103000123;ST=32;CN=2011;PW=123456;MN=HB0001;CP=&&DataTime=20240612103000;a34013-Avg=0.512,a34013-Flag=N&&,需要逐字符数出长度并写成 4 位定长数字,不足 4 位前面补零。CRC 校验则对数据段全部字符做 CRC16 计算,结果以 4 位大写十六进制表示。现场若出现“长度不符”或“校验错误”的返回,优先检查这两处。
二、数据段定义:字段含义与填写规则
数据段是报文的“内容区”,由若干以分号分隔的“键=值”字段组成,最后用 && 收尾。常用字段包括:QN 请求编码,格式为 17 位时间戳加 3 位流水号,用于标识一次请求;ST 系统编码,标识子系统类型,如 32 表示污染源在线监控;CN 命令编码,决定这条报文是上传数据还是应答;PW 访问密码;MN 设备唯一编号;Flag 应答标志,用于区分请求与应答、是否分包;CP 正文,用 && 包裹,承载真正的业务数据。
以实时数据上传为例,CP 内部通常先给出 DataTime 数据时间,再按“因子编码-数据标记=数值”的形式成对出现。例如 a34013-Avg=0.512,a34013-Flag=N 表示某因子均值为 0.512、数据标记为正常。这里要注意:数值只写数字,不带单位;多条因子之间用逗号分隔;时间格式统一为 yyyyMMddHHmmss。字段顺序在协议中有约定,实际开发中建议按标准顺序拼装,避免平台解析器因顺序敏感而丢弃数据。
三、污染因子编码:字母类别加五位数字
污染因子编码是平台识别“这是什么污染物”的唯一依据,格式为“1 位类别字母 + 5 位数字”。类别字母区分因子大类,例如 a 开头多为废气类因子,w 开头多为废水类因子;后 5 位数字对应具体污染物。常见例子如 a34013 对应废气中的颗粒物,w01018 对应废水中的 pH。编码填错,即使数值正确,平台也会把它归到错误因子或直接判为无效数据。
实操中建议建立一张“因子编码对照表”,把现场仪表位号、污染物名称、HJ 212 编码、量纲一一对应,组态时直接从表里取值,而不是手工输入。下表是一份可直接参考的示例片段(编码仅为教学示例,实际以现行标准附录为准):
| 污染物 | 示例编码 | 常见量纲 | 数据标记示例 |
|---|---|---|---|
| 颗粒物 | a34013 | mg/m³ | N 正常 |
| 二氧化硫 | a21026 | mg/m³ | N 正常 |
| 氮氧化物 | a21002 | mg/m³ | N 正常 |
| pH | w01018 | 无量纲 | N 正常 |
| 化学需氧量 | w01019 | mg/L | N 正常 |
四、命令字与响应码:怎么发、怎么回
命令编码(CN)决定报文语义。数采仪主动上传实时数据常用 CN=2011,上传历史数据常用 CN=2051,平台下发即时采样命令常用 CN=3011,心跳或连接检测常用 CN=9021。平台收到请求后返回应答报文,应答报文的 CN 与请求一致,但 Flag 标志位变为应答,并在 CP 中给出响应码。
响应码用于告诉对方“这次请求处理结果如何”。常见约定中,QnRtn 表示请求应答结果,ExeRtn 表示命令执行结果,取值如 1 表示成功、其他值表示各类失败原因(如密码错误、设备不存在、数据格式错误等)。现场排障时,先看应答报文里的响应码,再回头检查请求报文的对应字段,比盲目抓包逐字节比对效率高得多。例如平台返回“密码错误”,就检查 PW 是否与平台登记一致;返回“数据格式错误”,就重点核对数据段长度、CRC 和 CP 内因子编码格式。
把以上四部分串起来看:帧格式保证报文“能被正确接收”,数据段定义保证“字段能被正确理解”,污染因子编码保证“数据能归到正确对象”,命令字与响应码保证“交互能形成闭环”。四者缺一不可,这也是 HJ 212 报文解析的核心逻辑。