@lora-contrib/node-red-contrib-payload-parser
Version:
Parse Lora payload
69 lines (64 loc) • 2.34 kB
JavaScript
function converter(buffer, type){
var bufferValue = null;
switch (type) {
case 'int':
if (buffer.length == 1){
bufferValue = buffer.readUInt8(0);
}else if (buffer.length == 2){
bufferValue = buffer.readUInt16BE(0);
}else if (buffer.length == 3){
buffer = Buffer.concat([new Buffer([0x00]), buffer], 4);
bufferValue = buffer.readUInt32BE(0);
}else if (buffer.length == 4){
bufferValue = buffer.readUInt32BE(0);
}else{
bufferValue = buffer.readUIntBE(0, buffer.length);
}
break;
case 'sint':
if (buffer.length == 1){
bufferValue = buffer.readInt8(0);
}else if (buffer.length == 2){
bufferValue = buffer.readInt16BE(0);
}else if (buffer.length == 3){
buffer = Buffer.concat([new Buffer([0x00]), buffer], 4);
bufferValue = buffer.readInt32BE(0);
}else if (buffer.length == 4){
bufferValue = buffer.readInt32BE(0);
}else{
bufferValue = buffer.readIntBE(0, message.length);
}
break;
case 'float32':
case 'float':
bufferValue = Math.round(buffer.readFloatBE(0) * 100) / 100 ;
break;
case 'float64':
case 'double':
bufferValue = Math.round(buffer.readDoubleBE(0) * 100) / 100 ;
break;
case 'bin':
bufferValue = hex2Bin(buffer.toString('hex'));
break;
case 'boolean':
bufferValue = hexToBool(buffer.toString('hex'), 0);
break;
case 'hex':
bufferValue = buffer.toString('hex');
break;
default: /* 'txt' */
bufferValue = buffer.toString();
break;
}
return bufferValue;
}
function hexToBool(hex, index){
if (index >= hex.length*4) return null;
return Boolean(parseInt(hex2Bin(hex).charAt(index)));
}
function hex2Bin(n){
if(!checkHex(n))return null;
return parseInt(n,16).toString(2);
}
function checkHex(n){return/^[0-9A-Fa-f]{1,64}$/.test(n)}
exports.converter = converter;