污染物在线自动监控(监测)系统数据传输标准 (HJ212-2017)-CRC数据校验
污染物在线监控(监测)系统数据传输标准2017版发布后,2005版失效。
由于公司业务需要,作为公司物联网监测云平台,底层数据解析的一部分,研究此标准。(公司使用简版212协议,真是简单太多了)
CRC校验部分:
C代码
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;
}
Java代码实现:
public static int getCRC(String data212) {
int CRC = 0xFFFF;
int num = 0xA001;
int inum = 0;
byte[] sb = data212.getBytes();
for(int j = 0; j < sb.length; j ++) {
inum = sb[j];
CRC = (CRC >> 8) & 0x00FF;
CRC ^= inum;
for(int k = 0; k < 8; k++) {
int flag = CRC % 2;
CRC = CRC >> 1;
if(flag == 1) {
CRC = CRC ^ num;
}
}
}
return CRC;
}
最后别忘了,需要的是16进制结果,Integer.toHexString()
校验段:
示例:
##0101QN=20160801085857223;ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=5
;CP=&&RtdInterval=30&&1C80\r\n,其中 1C80 为 CRC16 校验码,是对数据段 QN=20160801085857223;
ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=5;CP=&&RtdInterval=30&& 进 行
CRC16 校验所得的校验码(摘自2017版协议文档,原文档此处有一处错误,此处已纠正)
原文https://www.cnblogs.com/LiuSiyuan/p/8110192.html

浙公网安备 33010602011771号