打印

如何在腾讯云上创建数据模板、解析LoRa节点数据

[复制链接]
433|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
前面我们已经介绍了,如何在腾讯云上添加LoRaWAN网关,如何在腾讯云上添加LoRa节点,那么,当LoRa节点的数据通过LoRaWAN网关上传到腾讯云的时候,由于LoRa节点本身上报的数据是二进制格式的数据,我们需要将其转换为腾讯云平台的JSON 格式。
本文介绍如何在腾讯云平台上使用其“数据模板”、“设备开发”的功能,以便将LoRa节点上传的数据准确的转换出来。

一、所需的步骤简介
需要在腾讯云的平台上,执行两个步骤:“数据模板”、“设备开发”,才能将所获取到的LoRa节点的数据转换成适合用户观察使用的数据。
而且,二者在创建的时候,存在一些关联关系。
下面我们将按顺序详细介绍。

二、创建数据模板
我们以RAK瑞科慧联的LoRa节点RAK7205为例,来介绍如何为LoRa节点上传的数据创建数据模板。
创建数据模板之前,需要先在腾讯云上创建LoRa节点。

需要注意的是,这里所创建的LoRa节点是一个类型,下面还可以再新建若干个对应的设备。在该节点下所创建的所有设备的上传数据的解析,都使用该节点的数据模板。

创建完LoRa节点之后,如图1所示,我们点击已经创建了的LoRa节点“RAK7205”,创建数据模板的时候,通过“导入JSON”来实现。
图1  腾讯云平台创建数据模板界面示意图

对于RAK7205来说,其内置环境传感器 BME680(温度、湿度、气体、压力)和MEMS 运动传感器和 LIS3DH(3 轴加速度),因此,其上传的数据包里面的数据类型是比较多的,我们需要在JSON脚本里预先设置好各种参数,如下:
{
        "version": "1.0",
        "profile": {
                "ProductId": "BO3TJ4VAXW",
                "CategoryId": "1"
        },
        "properties": [{
                "id": "temperature",
                "name": "温度",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "float",
                        "min": "-100",
                        "max": "100",
                        "start": "0",
                        "step": "0.01",
                        "unit": "℃"
                },
                "required": false
        }, {
                "id": "relative_humidity",
                "name": "湿度",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "int",
                        "min": "0",
                        "max": "100",
                        "start": "0",
                        "step": "1",
                        "unit": "%RH"
                },
                "required": false
        }, {
                "id": "barometric_pressure",
                "name": "大气压",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "float",
                        "min": "-10000",
                        "max": "10000",
                        "start": "0",
                        "step": "0.01",
                        "unit": "hPa"
                },
                "required": false
        }, {
                "id": "gas_resistance",
                "name": "气阻",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "float",
                        "min": "0",
                        "max": "1000",
                        "start": "0",
                        "step": "0.01",
                        "unit": "kΩ"
                },
                "required": false
        }, {
                "id": "trixial_x",
                "name": "三轴X",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "int",
                        "min": "-1000",
                        "max": "1000",
                        "start": "0",
                        "step": "1",
                        "unit": "mg"
                },
                "required": false
        }, {
                "id": "trixial_y",
                "name": "三轴Y",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "int",
                        "min": "-1000",
                        "max": "1001",
                        "start": "0",
                        "step": "1",
                        "unit": "mg"
                },
                "required": false
        }, {
                "id": "trixial_z",
                "name": "三轴Z",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "int",
                        "min": "-1000",
                        "max": "1000",
                        "start": "0",
                        "step": "1",
                        "unit": "mg"
                },
                "required": false
        }, {
                "id": "gps_longitude",
                "name": "经度",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "float",
                        "min": "-180",
                        "max": "180",
                        "start": "0",
                        "step": "0.0001",
                        "unit": "°"
                },
                "required": false
        }, {
                "id": "gps_latitude",
                "name": "纬度",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "float",
                        "min": "-90",
                        "max": "90",
                        "start": "0",
                        "step": "0.0001",
                        "unit": "°"
                },
                "required": false
        }, {
                "id": "gps_altitude",
                "name": "海拔",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "int",
                        "min": "-1000",
                        "max": "10000",
                        "start": "0",
                        "step": "1",
                        "unit": "m"
                },
                "required": false
        }, {
                "id": "battery_voltage",
                "name": "电压",
                "desc": "",
                "mode": "r",
                "define": {
                        "type": "float",
                        "min": "0",
                        "max": "10",
                        "start": "0",
                        "step": "0.01",
                        "unit": "V"
                },
                "required": false
        }],
        "events": [],
        "actions": []
}

将下列JSON数据粘贴到上图对应的本文框,并点击“导入”。
导入成功后,结果如图2所示。
图2   腾讯云平台上导入JSON脚本之后的显示界面示意图

在图2所示的界面下方(未图示),点击“下一步”,就会进入到腾讯云平台上的第二个步骤“设备开发”。

三、设备开发
设备开发里,需要根据实际的节点来撰写脚本,并且,应当与上面的步骤中的JSON脚本的参数是一一对应的。

下面是基于RAK瑞科慧联的LoRa节点RAK7205的脚本范例。

function RawToProtocol(fPort, bytes) {
var hexString=bin2HexStr(bytes);
return rakSensorDataDecode(hexString);
}

// convert array of bytes to hex string.
function bin2HexStr(bytesArr) {
var str = "";
for(var i=0; i<bytesArr.length; i++) {
var tmp = (bytesArr & 0xff).toString(16);
if(tmp.length == 1) {
tmp = "0" + tmp;
}
str += tmp;
}
return str;
}
// convert string to short integer
function parseShort(str, base) {
var n = parseInt(str, base);
return (n << 16) >> 16;
}
// convert string to triple integer
function parseTriple(str, base) {
var n = parseInt(str, base);
return (n << 8) >> 8;
}
// decode Hex sensor string data to object
function rakSensorDataDecode(hexStr) {
var str = hexStr;
var data = {
"method": "report",
"clientToken" : new Date(),
"params" : {}
};
while (str.length > 4) {
var flag = parseInt(str.substring(0, 4), 16);
switch (flag) {
case 0x0768:// Humidity
data.params.relative_humidity= ((parseShort(str.substring(4, 6), 16) * 0.01 / 2) * 100).toFixed(1);
str = str.substring(6);
break;
case 0x0673:// Atmospheric pressure
data.params.barometric_pressure= (parseShort(str.substring(4, 8), 16) * 0.1).toFixed(2);
str = str.substring(8);
break;
case 0x0267:// Temperature
data.params.temperature = (parseShort(str.substring(4, 8), 16) * 0.1).toFixed(2);
str = str.substring(8);
break;
case 0x0188:// GPS
data.params.gps_latitude = (parseTriple(str.substring(4, 10), 16) * 0.0001).toFixed(4);
data.params.gps_longitude = (parseTriple (str.substring(10, 16), 16) * 0.0001).toFixed(4);
data.params.gps_altitude = (parseTriple (str.substring(16, 22), 16) * 0.01).toFixed(1);
str = str.substring(22);
break;
case 0x0371:// Triaxial acceleration
data.params.trixial_x= (parseShort(str.substring(4, 8), 16) * 0.001).toFixed(3);
data.params.trixial_y= (parseShort(str.substring(8, 12), 16) * 0.001).toFixed(3);
data.params.trixial_z= (parseShort(str.substring(12, 16), 16) * 0.001).toFixed(3);
str = str.substring(16);
break;
case 0x0402:// air resistance
data.params.gas_resistance= (parseShort(str.substring(4, 8), 16) * 0.01).toFixed(2);
str = str.substring(8);
break;
case 0x0802:// Battery Voltage
data.params.battery_voltage = (parseShort(str.substring(4, 8), 16) * 0.01).toFixed(2);
str = str.substring(8);
break;
case 0x0586:// gyroscope
data.params.gyroscope_x = (parseShort(str.substring(4, 8), 16) * 0.01).toFixed(2);
data.params.gyroscope_y = (parseShort(str.substring(8, 12), 16) * 0.01).toFixed(2);
data.params.gyroscope_z = (parseShort(str.substring(12, 16), 16) * 0.01).toFixed(2);
str = str.substring(16);
break;
case 0x0902:// magnetometer x
data.params.magnetometer_x = (parseShort(str.substring(4, 8), 16) * 0.01).toFixed(2);
data.params.magnetometer_y = (parseShort(str.substring(12, 16), 16) * 0.01).toFixed(2);
data.params.magnetometer_z = (parseShort(str.substring(20, 24), 16) * 0.01).toFixed(2);
str = str.substring(24);
break;
default:
str = str.substring(7);
break;
}
}

return data;
}

将上述脚本复制到“上行数据解析”文本框里并覆盖原有内容,并提交。
提交之后,我们就在腾讯云上针对某一类型的LoRa节点创建了相应的数据解析的脚本。

结语
本文介绍了如何在腾讯云平台上使用其“数据模板”、“设备开发”的功能,以便将LoRa节点上传的数据准确的转换出来。这样,我们就相当于在腾讯云上建立了一种类型的节点的处理方法,我们后续就可以在该节点上添加多个设备,也就是假如我们整个应用场景里所使用的传感器都是同一种类的,就可以在该节点上使用相同的数据模板进行解析,以对所有的传感器所上传的数据准确的解析出来。
至于如何在腾讯云上为某个节点添加多个设备,请期待我们的下一篇**。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

68

帖子

0

粉丝