【ChirpStack】uplink Decoder 解码函数示例 JavaScript

本文介绍了 chirpstack uplink 上行数据的 Decode 数据解码函数,并给出了 CT100 类型传感器解码函数diamante示例

关于 chirpstack 结合平台通讯相关,请参考博文:
【thingsboard+chirpstack】的上下行数据通讯

1. ChirpStack V3

function Decode(fPort, bytes, variables) {
    var input = {bytes: bytes, port:fPort};
    var obj = {};
    var warnings = [];
    var len = input.bytes ? input.bytes.length : 0;
    var offset = 0, dtype = 0, dlen = 0;
    do {
        dtype = input.bytes[offset++];
        if (0xFF == dtype) {
            /* 0xFF is ACK from Device */
            obj.ackcmd = input.bytes[offset++];
            obj.ackstatus = input.bytes[offset++];
        } else if (0x00 === dtype) {
            /* first is device information(0x00) */
            obj.battery = (input.bytes[offset++] & 0x1F);
            obj.res = input.bytes[offset++];
        } else if (0x01 == dtype) {
            obj.evt = input.bytes[offset++];
            obj.acceX = (((input.bytes[offset] & 0x80 ? input.bytes[offset] - 0x100 : input.bytes[offset]) << 8) + input.bytes[offset+1]);
            offset += 2;
            obj.acceY = (((input.bytes[offset] & 0x80 ? input.bytes[offset] - 0x100 : input.bytes[offset]) << 8) + input.bytes[offset+1]);
            offset += 2;
            obj.acceZ = (((input.bytes[offset] & 0x80 ? input.bytes[offset] - 0x100 : input.bytes[offset]) << 8) + input.bytes[offset+1]);
            offset += 2;
            obj.angle = input.bytes[offset++];
        } else if (0x02 == dtype) {
            offset += 8;
        } else if (0x03 == dtype) {
            /* ADC sensor, value unit is mV */
            obj.adc = ((input.bytes[offset]) << 8) + input.bytes[offset + 1];
            offset += 2;
        } else if (0x04 == dtype) {
            /* temperature sensor, value unit is 0.1 */
            obj.temperature = (((input.bytes[offset] & 0x80 ? input.bytes[offset] - 0x100 : input.bytes[offset]) << 8) + input.bytes[offset + 1]) / 10;
            offset += 2;
        } else if (0x05 == dtype) {
            /* humidity sensor, value unit is 1 %RH */
            obj.humidity = input.bytes[offset++];
        } else if (0x06 == dtype) {
            obj.oxygen = input.bytes[offset++];
        } else if (0x07 == dtype) {
            /* pressure sensor, value unit is 1 Pa */
            obj.pressure = ((input.bytes[offset] << 24) + (input.bytes[offset + 1] << 16) + (input.bytes[offset + 2] << 8) + input.bytes[offset + 3]);
            offset += 4;
        } else if (0x08 == dtype) {
            /* ignore */
            offset += 4;
        } else if (0x09 == dtype) {
            /* switch or IO sensor, value is ON(1) or OFF(0) */
            obj.swtichIO = input.bytes[offset++];
        } else if (0x30 == dtype) {
            /* Hybrid gas sensor: Length + Gas Type + Value */
            dlen = input.bytes[offset++];
            /*  follow data length, normal is 5 */
            if (dlen >= 5) {
                /**
                 *  Gas Type
                 *  0x01 CH4
                 *  0x02 CO
                 *  0x03 H2S
                 *  0x04 CO2
                 *  0x05 NH3
                 */
                var gastype = input.bytes[offset++];
                /* Value unit is 0.01 */
                obj.volume = ((input.bytes[offset] << 24) + (input.bytes[offset + 1] << 16) + (input.bytes[offset + 2] << 8) + input.bytes[offset + 3]) / 100;
                offset += 4;
                dlen -= 5;
                if (obj.volume < 0) {
                    warnings.push("it's invalid");
                }
            }
            if (dlen > 0) {
                offset += dlen;
            }
        } else {
            /* ignore all > 0x10 */
            if(dtype > 0x10){
                dlen = input.bytes[offset++];
                if (dlen > 0) {
                    offset += dlen;
                }
            }
        }
    } while (len > offset);
    return obj;
}

2. ChirpStack V4

// Decode uplink function.
//
// Input is an object with the following fields:
// - bytes = Byte array containing the uplink payload, e.g. [255, 230, 255, 0]
// - fPort = Uplink fPort.
// - variables = Object containing the configured device variables.
//
// Output must be an object with the following fields:
// - data = Object representing the decoded payload.
function decodeUplink(input) {
    var obj = {};
    var warnings = [];
    var len = input.bytes ? input.bytes.length : 0;
    var offset = 0, dtype = 0, dlen = 0;
    do {
        dtype = input.bytes[offset++];
        if (0xFF == dtype) {
            /* 0xFF is ACK from Device */
            obj.ackcmd = input.bytes[offset++];
            obj.ackstatus = input.bytes[offset++];
        } else if (0x00 === dtype) {
            /* first is device information(0x00) */
            obj.battery = (input.bytes[offset++] & 0x1F);
            obj.res = input.bytes[offset++];
        } else if (0x01 == dtype) {
            obj.evt = input.bytes[offset++];
            obj.acceX = (((input.bytes[offset] & 0x80 ? input.bytes[offset] - 0x100 : input.bytes[offset]) << 8) + input.bytes[offset+1]);
            offset += 2;
            obj.acceY = (((input.bytes[offset] & 0x80 ? input.bytes[offset] - 0x100 : input.bytes[offset]) << 8) + input.bytes[offset+1]);
            offset += 2;
            obj.acceZ = (((input.bytes[offset] & 0x80 ? input.bytes[offset] - 0x100 : input.bytes[offset]) << 8) + input.bytes[offset+1]);
            offset += 2;
            obj.angle = input.bytes[offset++];
        } else if (0x02 == dtype) {
            offset += 8;
        } else if (0x03 == dtype) {
            /* ADC sensor, value unit is mV */
            obj.adc = ((input.bytes[offset]) << 8) + input.bytes[offset + 1];
            offset += 2;
        } else if (0x04 == dtype) {
            /* temperature sensor, value unit is 0.1 */
            obj.temperature = (((input.bytes[offset] & 0x80 ? input.bytes[offset] - 0x100 : input.bytes[offset]) << 8) + input.bytes[offset + 1]) / 10;
            offset += 2;
        } else if (0x05 == dtype) {
            /* humidity sensor, value unit is 1 %RH */
            obj.humidity = input.bytes[offset++];
        } else if (0x06 == dtype) {
            obj.oxygen = input.bytes[offset++];
        } else if (0x07 == dtype) {
            /* pressure sensor, value unit is 1 Pa */
            obj.pressure = ((input.bytes[offset] << 24) + (input.bytes[offset + 1] << 16) + (input.bytes[offset + 2] << 8) + input.bytes[offset + 3]);
            offset += 4;
        } else if (0x08 == dtype) {
            /* ignore */
            offset += 4;
        } else if (0x09 == dtype) {
            /* switch or IO sensor, value is ON(1) or OFF(0) */
            obj.swtichIO = input.bytes[offset++];
        } else if (0x30 == dtype) {
            /* Hybrid gas sensor: Length + Gas Type + Value */
            dlen = input.bytes[offset++];
            /*  follow data length, normal is 5 */
            if (dlen >= 5) {
                /**
                 *  Gas Type
                 *  0x01 CH4
                 *  0x02 CO
                 *  0x03 H2S
                 *  0x04 CO2
                 *  0x05 NH3
                 */
                var gastype = input.bytes[offset++];
                /* Value unit is 0.01 */
                obj.volume = ((input.bytes[offset] << 24) + (input.bytes[offset + 1] << 16) + (input.bytes[offset + 2] << 8) + input.bytes[offset + 3]) / 100;
                offset += 4;
                dlen -= 5;
                if (obj.volume < 0) {
                    warnings.push("it's invalid");
                }
            }
            if (dlen > 0) {
                offset += dlen;
            }
        } else {
            /* ignore all > 0x10 */
            if(dtype > 0x10){
                dlen = input.bytes[offset++];
                if (dlen > 0) {
                    offset += dlen;
                }
            }
        }
    } while (len > offset);
    var data = {};
    data.data = obj;
    return data;
}

3. 传感器接入上行数据解码

ChirpStack_CT100.js

function Decode(fPort, bytes, variables) {
    var input = {bytes: bytes, port:fPort};
    var obj = {};
    var warnings = [];
    var len = input.bytes ? input.bytes.length : 0;
    var offset = 0, dtype = 0, dlen = 0;

    do {
        dtype = input.bytes[offset++];
        if (0xFF == dtype) {
            /* 0xFF is ACK from Device */
            obj.ackcmd = input.bytes[offset++];
            obj.ackstatus = input.bytes[offset++];
        } else if (0x00 === dtype) {
            /* first is device information(0x00) */
            obj.battery = (input.bytes[offset++] & 0x1F);
            obj.res = input.bytes[offset++];
        } else if (0x01 == dtype) {
            offset += 8;
        } else if (0x02 == dtype) {
            offset += 8;
        } else if (0x03 == dtype) {
            /* ADC sensor, value unit is mV */
            obj.adc = ((input.bytes[offset]) << 8) + input.bytes[offset + 1];
            offset += 2;
        } else if (0x04 == dtype) {
            /* temperature sensor, value unit is 0.1 */
            obj.temperature = (((input.bytes[offset] & 0x80 ? input.bytes[offset] - 0x100 : input.bytes[offset]) << 8) + input.bytes[offset + 1]) / 10;
            offset += 2;
        } else if (0x05 == dtype) {
            /* humidity sensor, value unit is 1 %RH */
            obj.humidity = input.bytes[offset++];
        } else if (0x06 == dtype) {
            obj.oxygen = input.bytes[offset++];
        } else if (0x07 == dtype) {
            /* pressure sensor, value unit is 1 Pa */
            obj.pressure = ((input.bytes[offset] << 24) + (input.bytes[offset + 1] << 16) + (input.bytes[offset + 2] << 8) + input.bytes[offset + 3]);
            offset += 4;
        } else if (0x08 == dtype) {
            /* ignore */
            offset += 4;
        } else if (0x09 == dtype) {
            /* switch or IO sensor, value is ON(1) or OFF(0) */
            obj.swtichIO = input.bytes[offset++];
        } else if (0x1A == dtype) {
            /* Current and voltage */
            dlen = input.bytes[offset++];
            if (dlen >= 2) {
                /* Current value unit is 1 mA */
                obj.current = ((input.bytes[offset] << 8) + input.bytes[offset + 1]);
                offset += 2;
                dlen -= 2;
            }

            if (dlen >= 2) {
                /* voltage value unit is 0.1 V */
                obj.voltage = ((input.bytes[offset] << 8) + input.bytes[offset + 1]) / 10;
                offset += 2;
                dlen -= 2;
            }
            if (dlen > 0) {
                offset += dlen;
            }
        } else if (0x1B == dtype) {
            /* Watt and value unit is 1 Watt */
            dlen = input.bytes[offset++];
            if (dlen >= 4) {
                obj.watt = ((input.bytes[offset] << 24) + (input.bytes[offset + 1] << 16) + (input.bytes[offset + 2] << 8) + input.bytes[offset + 3]);
                offset += 4;
                dlen -= 4;
            }
            if (dlen > 0) {
                offset += dlen;
            }
        } else {
            /* ignore all > 0x10 */
            if(dtype > 0x10){
                dlen = input.bytes[offset++];
                if (dlen > 0) {
                    offset += dlen;
                }
            }
        }
    } while (len > offset);

    return obj;
}

锐捷公司资料:
ChirpStack平台接入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值