【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平台接入

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

积跬步、至千里

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

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

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

打赏作者

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

抵扣说明:

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

余额充值