我很想从sombody得到一些知道如何解释如何在节点红色中创建十六进制到“文本”解码器。
我有一个Elsys传感器,可产生温度,湿度等有效载荷十六进制。
发送的有效负载是“0100df02170400dc0500070e13”,在他们的网站上,他们有一个简单的解码器工作得很好,但我想创建一个节点链,在发送数据时对其进行解码,并将其解析为一个流量数据库。
https://www.elsys.se/en/elsys-payload/是有效负载javascript的链接。
以前做过类似事情的人?我已经在互联网上搜索了几个小时的某些例子,但什么也没找到,或者我只是在寻找错误的东西。
提前谢谢你。
安德烈亚斯
答案 0 :(得分:1)
您提供的链接提供了解码该有效负载所需的JavaScript。
您可以在Function节点中使用该代码,以便在流中进行解码。
例如,配置为注入有效负载0100df02170400dc0500070e13
的Inject节点,通过此Function会产生以下有效负载:
{"temperature":223,"humidity":23,"light":220,"motion":0,"vdd":3603}
/*
______ _ _______ _______
| ____| | / ____\ \ / / ____|
| |__ | | | (___ \ \_/ / (___
| __| | | \___ \ \ / \___ \
| |____| |____ ____) | | | ____) |
|______|______|_____/ |_| |_____/
ELSYS simple payload decoder.
Use it as it is or remove the bugs :)
www.elsys.se
peter@elsys.se
*/
const TYPE_TEMP =0x01; //temp 2 bytes -3276.8°C -->3276.7°C
const TYPE_RH =0x02; //Humidity 1 byte 0-100%
const TYPE_ACC =0x03; //acceleration 3 bytes X,Y,Z -128 --> 127 +/-63=1G
const TYPE_LIGHT =0x04; //Light 2 bytes 0-->65535 Lux
const TYPE_MOTION =0x05; //No of motion 1 byte 0-255
const TYPE_CO2 =0x06; //Co2 2 bytes 0-65535 ppm
const TYPE_VDD =0x07; //VDD 2byte 0-65535mV
const TYPE_ANALOG1 =0x08; //VDD 2byte 0-65535mV
const TYPE_GPS =0x09; //3bytes lat 3bytes long binary
const TYPE_PULSE1 =0x0A; //2bytes relative pulse count
function bin16dec(bin) {
var num=bin&0xFFFF;
if (0x8000 & num)
num = - (0x010000 - num);
return num;
}
function bin8dec(bin) {
var num=bin&0xFF;
if (0x80 & num)
num = - (0x0100 - num);
return num;
}
function hexToBytes(hex) {
for (var bytes = [], c = 0; c < hex.length; c += 2)
bytes.push(parseInt(hex.substr(c, 2), 16));
return bytes;
}
function DecodeElsysPayload(data){
var obj ={};
for(i=0;i<data.length;i++){
switch(data[i]){
case TYPE_TEMP: //Temperature
var temp=(data[i+1]<<8)|(data[i+2]);
temp=bin16dec(temp);
obj.temperature=temp;
i+=2;
break;
case TYPE_RH: //Humidity
var rh=(data[i+1]);
obj.humidity=rh;
i+=1;
break;
case TYPE_ACC: //Acceleration
obj.x=bin8dec(data[i+1]);
obj.y=bin8dec(data[i+2]);
obj.z=bin8dec(data[i+3]);
i+=3;
break;
case TYPE_LIGHT: //Light
var light=(data[i+1]<<8)|(data[i+2]);
obj.light=light;
i+=2;
break;
case TYPE_MOTION: //Motion sensor(PIR)
var motion=(data[i+1]);
obj.motion=motion;
i+=1;
break;
case TYPE_CO2: //CO2
var co2=(data[i+1]<<8)|(data[i+2]);
obj.co2=co2;
i+=2;
break;
case TYPE_VDD: //Battery level
var vdd=(data[i+1]<<8)|(data[i+2]);
obj.vdd=vdd;
i+=2;
break;
case TYPE_ANALOG1: //Analog input 1
var analog1=(data[i+1]<<8)|(data[i+2]);
obj.analog1=analog1;
i+=2;
break;
case TYPE_GPS: //gps
obj.lat=(data[i+1]<<16)|(data[i+2]<<8)|(data[i+3]);
obj.long=(data[i+4]<<16)|(data[i+5]<<8)|(data[i+6]);
i+=6;
break;
case TYPE_PULSE1: //Pulse input 1
var pulse1=(data[i+1]<<8)|(data[i+2]);
obj.pulse1=pulse1;
i+=2;
break;
}
}
return obj;
}
msg.payload = DecodeElsysPayload(hexToBytes(msg.payload));
return msg;