HJ212分为2005年(HJ/T212-2005)和2017年(HJ212-2017)的版本,略有不同。

网上没找到非常官方的渠道下载,在这贴一份2017年版本的下载地址

TCP/IP通讯包组成

名称

类型

长度

描述

包头

字符

2

固定为##

数据段长度

十进制整数

4

表示数据段长度,如长度336则为0336

数据段

字符

0-1024

变长的数据,为包的传输内容

CRC校验

十六进制整数

4

用于校验数据包完整性的CRC校验值,后续附上算法

包尾

字符

2

固定为(回车、换行)

通讯包数据段组成

HJ/T212-2005

名称

类型

长度

描述

请求编码QN

字符

20

精确到毫秒的时间戳:QN=YYYYMMDDhhmmsszzz,用来唯一标识一次命令交互

系统编码ST

字符

5

系统编号

命令编号CN

字符

7

命令编号

访问密码PW

字符

6

访问密码

设备唯一标识MN

字符

14

监测点编号

拆分包及应答标志Flag

字符

3

见文档原文

总包号PNUM

字符

4

表示本次通讯总共包含的包数

包号PNO

字符

4

PNO指示当前数据包的包号

指令参数CP

字符

0-960

CP=&&数据区&&

HJ212-2017

名称

类型

长度

描述

请求编码QN

字符

20

精确到毫秒的时间戳:QN=YYYYMMDDhhmmsszzz,用来唯一标识一次命令交互

系统编码ST

字符

5

系统编号

命令编号CN

字符

7

命令编号

访问密码PW

字符

9

访问密码

设备唯一标识MN

字符

27

监测点编号

拆分包及应答标志Flag

字符

8

见文档原文

总包号PNUM

字符

9

表示本次通讯总共包含的包数

包号PNO

字符

8

PNO指示当前数据包的包号

指令参数CP

字符

0-950

CP=&&数据区&&

报文解析

因2005、2017对原始报文的解析上没有什么巨大分别,只是不同字段的长度在2017协议中有所扩展。在此仅以一例2005年规范的报文作为样例(因简书格式问题,调试时请自行补全包尾换行符):

"##0336ST=31;CN=2011;PW=123456;MN=63010000020001;CP=&&DataTime=20200108143205;B02-Rtd=9.88,B02-Flag=N;01-Rtd=10.73,01-ZsRtd=12.38,01-Flag=N;02-Rtd=0.705,02-ZsRtd=0.814,02-Flag=N;03-Rtd=69.064,03-ZsRtd=79.684,03-Flag=N;S01-Rtd=5.8,S01-Flag=N;S02-Rtd=19.38,S02-Flag=N;S03-Rtd=99.04,S03-Flag=N;S08-Rtd=-46.12,S08-Flag=N;S05-Rtd=14.66,S05-Flag=N&&8EC1"

代码解析

在这里不赘述如何通过TCP/IP协议获得报文再转成字符串的了,直接贴一些关键代码(C#),直接看可能比看协议文档要快一些。

本来是想封装个类库的…不过考虑我实际使用情况只有最简单的接受解析数据,没调试过收发控制命令、数据分包。单纯根据文档封装出来可能会有很大的局限性(其实是懒)。

因力求样例代码精简,可能缺乏防错及数据结构展现,大家可以针对自己实际业务需求做相应完善。

//Msg 是解析TCP/IP报文后获得的报文字符串

if (string.IsNullOrEmpty(Msg) || Msg.Length < 12 || !Msg.StartsWith("##") || !Msg.EndsWith("\r\n"))

{

Console.WriteLine("不是HJ212协议的报文!");

return false;

}

var msg_len_str = Msg.Substring(2, 4);

if (!int.TryParse(msg_len_str, out int msg_len))

{

Console.WriteLine("报文格式非法,报文长度无法解析!");

return false;

}

var content = Msg.Substring(6, msg_len);

var msg_crc = Msg.Substring(6 + msg_len, 4);

var calc_crc = CalcCRC(content);

if (calc_crc != msg_crc)

{

Console.WriteLine($"CRC校验失败! MsgCRC:{msg_crc} CalcCRC:{calc_crc}");

return false;

}

var cp = Regex.Match(content, @"CP=&&[\S]*&&");

var msg_head = string.Empty;

if (!cp.Success)

{

Console.WriteLine("未匹配到数据!");

msg_head = content;

}

msg_head = content.Substring(0, cp.Index);

var headers = msg_head.Split(';');

for (int i = 0; i < headers.Length - 1; i++)

{

var index = headers[i].IndexOf('=');

if (index == -1) continue;

Console.WriteLine($"Header key:{headers[i].Substring(0, index)} Header Value:{headers[i].Substring(index + 1, headers[i].Length - index - 1)}");

}

if (cp.Success)

{

var datadic = cp.Value.Substring(5, cp.Length - 7);

var dataarr = datadic.Split(';');

foreach (var rawdata in dataarr)

{

var items = rawdata.Split(',');

foreach (var rawitem in items)

{

var index = rawitem.IndexOf("=");

if (index == -1)

{

return false;

}

Console.WriteLine($"Data Name:{rawitem.Substring(0, index)} Data Value:{rawitem.Substring(index + 1, rawitem.Length - index - 1)}");

}

}

}

return true;

针对以上报文的解析如下:

对于Data Name的含义,参照协议文档中的字段对照表即可

如B02-Rtd代表废气-实时采样数据,不一定完全照搬文档,可与对接厂商根据现场情况拟定。

CRC算法

CRC算法如下(摘自HJ212-2017,2005版本没有明确定义但实测是兼容的,语言是C):

一定要注意CRC是针对数据段进行计算的,去头(##、报文长度字符),去尾(CRC字符、包尾换行符)

unsigned int CRC16_Checkout(unsigned char *puchMsg, unsigned int usDataLen)

{

unsigned int i, j, crc_reg, check;

crc_reg = 0xFFFF;

for (i = 0; i < usDataLen; i++)

{

crc_reg = (crc_reg >> 8) ^ puchMsg[i];

for (j = 0; j < 8; j++)

{

check = crc_reg & 0x0001;

crc_reg >>= 1;

if (check == 0x0001)

{

crc_reg ^= 0xA001;

}

}

}

return crc_reg;

}

hj212协议如何和php通讯,HJ212数据传输标准报文解析相关推荐

  1. hj212协议如何和php通讯,5G/4G边缘计算网关如何实现HJ212协议上报

    佰马科技5G/4G边缘计算网关,是一款强大的工业数采网关,支持 TCP.UDP 客户端.MQTT 客户端.http 客户端方式连接中心 .数据上报协议可以支持透传(串口设置那边协议需要选择透传).JS ...

  2. 环保 HJ212协议解析

    环保 HJ212协议解析 HJ212协议简介 基于C++的HJ212解析类 使用GB212类进行212协议包的解析, 关于HJ212Receiver项目 HJ212协议简介 由于是做环保相关的,有时需 ...

  3. 4G环保数采仪环境数据 实现VOC实时数据上传环保局HJ212协议

    SC-GP-GWRTU支持移动.联通.电信 4G /WiFi/以太网高速接入.软件功能完善,覆盖绝大多数常规应用场景,用户只需通过简单的设置,即可实现串口到网络的双向数据传输.并且支持自定义注册包,心 ...

  4. java实现hj协议_环保 HJ212协议解析

    由于是做环保相关的,有时需要对212协议进行拆包和解包.HJ212协议是一种字符串协议,数据传输通讯包主要由包头.数据段长度.数据段.CRC校验.包尾组成,其中"数据段"内容包括请 ...

  5. Java对接HJ212协议设备

    一.前言 最近收到一个对接HJ212协议设备数据的任务,安排和我对接的人不懂技术,就给了一个HJ212协议文档.文档详细地说明了协议的各项细则,文档如下. 污染物在线监控(监测)系统数据传输标准-Ja ...

  6. c# HJ212协议组包

    c# 关于HJ212协议组包 今天突然想起好久没有登过博客了 又将近两年没有更新 太懒散..太懒散了... 工作中学习到的很多 但也很容易忘记 用过的东西某天可能想再用的时候却想不起来了 或者找不到了 ...

  7. gns3中两个路由器分别连接主机然后分析ip数据转发报文arp协议_关于TCP/IP,必知必会的十个问题!...

    本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. TCP/IP十个问题 TCP/IP十个问题 一.TCP/IP模型 TCP/IP协议模型(Trans ...

  8. [转载]Palm 串行通讯GPS数据读取的实现

    Palm 串行通讯GPS数据读取的实现 关于J2ME程序编写的教程,各大网站均有介绍.但是J2ME教程的学习与实际应用毕竟还有一段距离.笔者从事J2ME一年多, 已经成功地开发出基于无线互联网palm ...

  9. Esp8266 进阶之路20 【高级篇】深入学习esp8266的esp now模式组网,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

最新文章

  1. H5面试题---介绍js的基本数据类型
  2. list 去重_测试面试题集Python列表去重
  3. 黑洞最新照片来了:只多了炫酷光纹,却让物理学家解开喷流大谜题
  4. Linux更换python版本 (转载)
  5. 【译】Facebook 开源 Detectron
  6. python网络编程2-黏包问题
  7. 阅读笔记-游戏开发中的人工智能-第6章-基本路径寻找及航点应用
  8. Spark的安装和使用方法
  9. 省钱兄(APP、h5版本)任务悬赏点赞平台uniapp前端源码模板
  10. 办公室专用表格大全,公司管理常用表格公司制度大全
  11. python drop用法_Python drop方法删除列之inplace参数实例
  12. linux设置北京时间
  13. 【刷机】小米平板1刷ROM时出现E1001 Error:7和twrp恢复备份报错Error:255的报错解决方法
  14. 关于学计算机趣味段子,【学习段子】_关于学习的经典段子15句
  15. 云原生kubernetes五 :pod创建流程
  16. android ant批量打包
  17. IntelliJ IDEA如何修改版权信息
  18. IntelliJ IDEA下Git的配置与使用(命令行下)
  19. android毗邻(Pilin)即时聊天应用源码
  20. 读心或成现实,OpenBCI要将脑波传感技术用于VR中

热门文章

  1. cmd小游戏编程100例_学宏程序编程,这些知识必不可少!
  2. QML控件拖动并靠边停留
  3. 中柏ezpadE7装linux,中柏EZbook 2笔记本U盘安装win7系统的操作教程
  4. Git 之一 起源、安装、配置
  5. JQuery:实现列表展开和缩放
  6. export命令添加和删除环境变量
  7. vi插入模式下的backspace键和方向键“不正常”使用解决方法
  8. 信息安全三要素(CIA)
  9. 通信 / 各种协议默认端口汇总
  10. 51单片机系列命名规则