污染物在線監控(監測)系統數據傳輸標準2017版發佈後,2005版失效。spa
因爲公司業務須要,做爲公司物聯網監測雲平臺,底層數據解析的一部分,研究此標準。(公司使用簡版212協議,真是簡單太多了)code
CRC校驗部分:blog
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代碼實現:get
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()
校驗段:class
示例:
##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版協議文檔,原文檔此處有一處錯誤,此處已糾正)監控