LoRaWAN 子设备上报数据解析示例


LoRaWAN 子设备上报数据解析示例

客户通过 LoRaWAN 网关,将温湿度传感器、人体感应传感器、电能表、水浸传感器等多种不同的 LoRaWAN 子设备接入 ThingsCloud。LoRaWAN 子设备发送给网关的数据采用 base64 编码,LoRaWAN 网关并没有在本地解码数据,而是将数据直接透传给 ThingsCloud。

我们通过 ThingsCloud 消息规则中的 属性上报预处理规则,使用云函数来解码 LoRaWAN 设备上报的数据。

创建规则时,选择属性上报预处理,如下图:

articles/2023/20230217143315_bc34d715651b0adbac2676603194abd7.png

然后添加一个 预处理函数 的操作,如下图:

articles/2023/20230217143351_5ba62297569430102523afcab6a653fd.png

使用 JavaScript 编写一段云函数,如下图:

module.exports = function (report_attributes) {
    /**
    * report_attributes:   上报的属性对象,同时作为函数返回值。函数中可更新属性对象。
    */

    if (report_attributes.data !== undefined) {

        // 利用内置函数,将 LoRaWAN 设备上报的 base64 格式的 data 转为二进制数据。
        var buffer = Cloud.Utils.base64ToBuffer(report_attributes.data);

        // 根据设备厂商的协议,对每一位进行相应的判断和解析。
        if (buffer[0] === 0x00 && buffer[1] === 0x01 && buffer[2] === 0x04) {

            if (buffer[3] === 0x04) {
                // voltage
                var voltage = (buffer[4] + buffer[5]) / 1000;
                // 将提取的数值,添加到属性对象中。
                report_attributes.voltage = voltage;
            }

            if (buffer[6] === 0x7d && buffer[7] === 0x00) {
                report_attributes.v_flag = 0;
            } else {
                report_attributes.v_flag = 1;
            }

            if (buffer[8] === 0x77 && buffer[9] === 0x00) {
                report_attributes.rm_flag = 0;
            } else {
                report_attributes.rm_flag = 1;
            }

            if (buffer[10] === 0x17 && buffer[11] === 0x00) {
                // alarm
                report_attributes.alarm = 0;
            } else {
                report_attributes.alarm = 1;
            }
        }
    }

    return report_attributes;
};

详细了解 ThingsCloud 消息规则,请浏览 消息规则