javascript - 传感器有效负载十六进制到文本 Node 红色

标签 javascript node.js node-red

我很想得到一些知道如何解释如何在红色 Node 中创建十六进制到“文本”解码器的人的意见。

我有一个 Elsys 传感器,可以生成包含温度、湿度等信息的有效载荷十六进制。

交付的有效负载是“0100df02170400dc0500070e13”,在他们的网站上,他们有一个简单的解码器,效果很好,但我想创建一个 Node 链,在交付数据时对其进行解码,并将其解析为 influxdb。

https://www.elsys.se/en/elsys-payload/是有效负载 JavaScript 的链接。

以前有人做过类似的事情吗?我在互联网上搜索了几个小时寻找某种示例,但什么也没找到,或者我只是在寻找错误的东西。

Here is my setup

提前谢谢您。

最佳答案

您提供的链接提供了解码该有效负载所需的 JavaScript。

您可以在函数 Node 中使用该代码,以便在流程中进行解码。

例如,配置为注入(inject)有效负载 0100df02170400dc0500070e13 的注入(inject) Node ,通过此函数会产生有效负载:

{"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;

关于javascript - 传感器有效负载十六进制到文本 Node 红色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49271871/

相关文章:

javascript - Vue.js:带换行符的字符串插值

javascript - 捕获 iframe 加载完成事件

php - 在 PHP 或 Node.js 中读取编码错误的 JSON 文件

javascript - 在node-red中,为什么在保存关键字 'this'的值后继续使用它?

javascript - 了解 Node RED 中的 this._(STRING) 调用

javascript - 按字母顺序对 php/html 表单中的下拉值进行排序?

javascript - 如何使用大括号通过 "shelljs"在单个命令中创建多个目录?

node.js - 我可以在 Express 的自定义错误处理程序中访问 req (如 req.body)吗?

javascript - 如何停止 Node js-winston库中出现audit.json文件

Node-red自定义节点,如何使用节点属性?