Need help in correcting issues in CRC-ITU check method written in Javascript (node.js)

为君一笑 提交于 2019-11-30 22:23:11

The ~ in the original code only worked because it was a 16-bit type. You should use crcX = crcX ^ 0xffff instead of crcX = ~crcX.

Also your buf.substring(i,i+4) and i = i + 4 is wrong. You need to process one byte at a time, which is two hexadecimal digits. Those should both be i+2.

There are some crc packages on npm, but they may not work for you, I create a new one that is just a copy of c code from your link to document.

Install crc-itu from terminal:

npm install crc-itu

app.js

var crc16 = require('crc-itu').crc16;

var crcInHex = crc16('0d0103588990501766460026', 'hex').toString(16);
console.log(crcInHex); // will print 7bf9

you can also try with these values, note: crc16(data).toString(16) => crc

start          data              crc   end
-------------------------------------------
7878   0d0103588990501766460026  7bf9  0d0a
7878   0d010358899050176646002a  b195  0d0a
7878   0d010358899050176646002b  a01c  0d0a

This is my code

var net = require('net');

var HOST = '192.168.1.151';
var PORT = 5023;


function protocall_decorder(data,sbit,plength,protono,ebit){

// Login data   
if(plength.toString('hex') == '0d') {
    var ret = crc16Ccitt(data.slice(2,14));
    var err_code = ret;
    console.log(err_code.toString(16));
    plength = new Buffer('05','hex');
    var res = sbit + plength + protono + data.slice(12,14) + err_code.toString(16) + ebit;

    data = "device_imei: " + parseInt(data.slice(4,12).toString('hex'));
    console.log(data);


    res = new Buffer(res)
    var dataArr = {response:res, type:"login", data:data};
}
/*
// Location data
else if(plength == '1F') {
    var res = '787805' + ***** +  data.slice(60,64) + data.slice(24,28) +'D9DC' + '0D0A';
    dataArr = data.substring(2);
}

// Alarm data
else if(plength == '25') {
    dataArr = data.substring(2);
}
// Heart Beat
else if(plength == '08') {
    dataArr = data.substring(2);
}
// Undefined data length
*/
else {
    var dataArr = {response:"error", data:plength};
}


return dataArr;

}

// The sock object the callback function receives UNIQUE for each connection
net.createServer(function(sock) {

// We have a connection - a socket object is assigned to the connection automatically
console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);

// Add a 'data' event handler to this instance of socket
sock.on('data', function(data) {

    console.log('DATA ' + sock.remoteAddress + ': ' + data);
    // Write the data back to the socket, the client will receive it as data from the server


//////////////// MySQL | Begin ////////////////////
var mysql      = require('mysql');
var con = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'lahirutm',
    database : 'gt06n'
});
con.connect();


var sbit = data.slice(0,2);
var plength = data.slice(2,3);
var protono = data.slice(3,4);
var ebit = data.slice(-2)

if(sbit.toString('hex') == '7878') {
    var res = protocall_decorder(data,sbit,plength,protono,ebit);
    if(res['response'] != 'error') {
        sock.write(res['response']);
        var response = res['response'];
    }
}
else {
    console.log('Undefined protocol data');
}

console.log(response); // Write data to socket

var message  = {start_bit: sbit, packet_length: plength, proto_no: protono, serial:'*', end_bit: ebit};
var query = con.query('INSERT INTO incoming_data SET ?', message,
//var message = {data: data} 
//var query = con.query('INSERT INTO row_data SET ?', message,
function(err, result) {
        // Neat!
});
console.log(query.sql);

var message = {data: data} 
var query = con.query('INSERT INTO row_data SET ?', message,
function(err, result) {
        // Neat!
});
console.log(query.sql);
con.end();
///////////////  MySQL | Begin ////////////////

});

// Add a 'close' event handler to this instance of socket
sock.on('close', function(data) {
    console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
});

}).listen(PORT, HOST);

console.log('Server listening on ' + HOST +':'+ PORT);



/**
* CRC functions
*/

var crc16CcittTableReverse = [
    0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
    0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
    0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
    0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
    0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
    0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
    0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
    0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
    0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
    0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
    0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
    0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
    0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
    0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
    0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
    0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
    0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
    0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
    0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
    0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
    0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
    0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
    0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
    0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
    0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
    0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
    0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
    0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
    0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
    0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
    0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
    0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78
];


var crc16CcittStart = 0xFFFF;
var crc16CcittXorout = 0xFFFF;

function crc16Reflected(buf, crc_in, table) {
    var crc16 = crc_in;

    for (i = 0; i < buf.length; i++) {
        crc16 = table[(crc16 ^ buf[i]) & 0xff] ^ (crc16 >> 8);
    }

    return crc16 & 0xFFFF;
}

function crc16Ccitt(buf) {
    return crc16Reflected(buf, crc16CcittStart, crc16CcittTableReverse) ^ crc16CcittXorout;
}
Mrudang Vora

Found very few links on CRC 16 calculation but found the current answer in javascript helpful.

In case anyone is looking for the same CRC 16 calculation using python, have created the public gist along with working python fiddle example:

https://gist.github.com/mrudang-vora/6a0767be085a275c0df3

Hope it helps someone.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!