hj212协议如何和php通讯,HJ212数据传输标准报文解析
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数据传输标准报文解析相关推荐
- hj212协议如何和php通讯,5G/4G边缘计算网关如何实现HJ212协议上报
佰马科技5G/4G边缘计算网关,是一款强大的工业数采网关,支持 TCP.UDP 客户端.MQTT 客户端.http 客户端方式连接中心 .数据上报协议可以支持透传(串口设置那边协议需要选择透传).JS ...
- 环保 HJ212协议解析
环保 HJ212协议解析 HJ212协议简介 基于C++的HJ212解析类 使用GB212类进行212协议包的解析, 关于HJ212Receiver项目 HJ212协议简介 由于是做环保相关的,有时需 ...
- 4G环保数采仪环境数据 实现VOC实时数据上传环保局HJ212协议
SC-GP-GWRTU支持移动.联通.电信 4G /WiFi/以太网高速接入.软件功能完善,覆盖绝大多数常规应用场景,用户只需通过简单的设置,即可实现串口到网络的双向数据传输.并且支持自定义注册包,心 ...
- java实现hj协议_环保 HJ212协议解析
由于是做环保相关的,有时需要对212协议进行拆包和解包.HJ212协议是一种字符串协议,数据传输通讯包主要由包头.数据段长度.数据段.CRC校验.包尾组成,其中"数据段"内容包括请 ...
- Java对接HJ212协议设备
一.前言 最近收到一个对接HJ212协议设备数据的任务,安排和我对接的人不懂技术,就给了一个HJ212协议文档.文档详细地说明了协议的各项细则,文档如下. 污染物在线监控(监测)系统数据传输标准-Ja ...
- c# HJ212协议组包
c# 关于HJ212协议组包 今天突然想起好久没有登过博客了 又将近两年没有更新 太懒散..太懒散了... 工作中学习到的很多 但也很容易忘记 用过的东西某天可能想再用的时候却想不起来了 或者找不到了 ...
- gns3中两个路由器分别连接主机然后分析ip数据转发报文arp协议_关于TCP/IP,必知必会的十个问题!...
本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. TCP/IP十个问题 TCP/IP十个问题 一.TCP/IP模型 TCP/IP协议模型(Trans ...
- [转载]Palm 串行通讯GPS数据读取的实现
Palm 串行通讯GPS数据读取的实现 关于J2ME程序编写的教程,各大网站均有介绍.但是J2ME教程的学习与实际应用毕竟还有一段距离.笔者从事J2ME一年多, 已经成功地开发出基于无线互联网palm ...
- Esp8266 进阶之路20 【高级篇】深入学习esp8266的esp now模式组网,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。(附带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
最新文章
- H5面试题---介绍js的基本数据类型
- list 去重_测试面试题集Python列表去重
- 黑洞最新照片来了:只多了炫酷光纹,却让物理学家解开喷流大谜题
- Linux更换python版本 (转载)
- 【译】Facebook 开源 Detectron
- python网络编程2-黏包问题
- 阅读笔记-游戏开发中的人工智能-第6章-基本路径寻找及航点应用
- Spark的安装和使用方法
- 省钱兄(APP、h5版本)任务悬赏点赞平台uniapp前端源码模板
- 办公室专用表格大全,公司管理常用表格公司制度大全
- python drop用法_Python drop方法删除列之inplace参数实例
- linux设置北京时间
- 【刷机】小米平板1刷ROM时出现E1001 Error:7和twrp恢复备份报错Error:255的报错解决方法
- 关于学计算机趣味段子,【学习段子】_关于学习的经典段子15句
- 云原生kubernetes五 :pod创建流程
- android ant批量打包
- IntelliJ IDEA如何修改版权信息
- IntelliJ IDEA下Git的配置与使用(命令行下)
- android毗邻(Pilin)即时聊天应用源码
- 读心或成现实,OpenBCI要将脑波传感技术用于VR中