如何在网关上使用编解码器
目录
概述
星纵物联LoRaWAN®网关内置网络服务器Network Server,支持通过MQTT / HTTP(S)转发传感器数据到第三方服务器。为提高上报内容的可读性,可使用网关自带的解码器解析上报内容。本文主要描述如何在网关上使用载荷编解码器。
准备
- 星纵物联LoRaWAN®网关
步骤
1. 网关配置
登录网关配置界面,进入“Network Server > 载荷编解码器” 界面,可对编解码器进行配置与管理。
1.1 内置载荷编解码库
星纵物联LoRaWAN®网关程序内置载荷编解码库,为所有星纵物联终端节点设备提供编解码示例。内置载荷编解码库支持两种获取方式:
-
- 在线获取:网关联网后,可获取云端的载荷编解码库。请先确保网关可正常访问公网。
- 本地上传:手动上传载荷编解码库压缩包。
1.2 自定义载荷编解码器
若需要对第三方终端节点设备进行编解码,可点击自定义编解码函数。
-
- 名称:自定义
- 描述:自定义
- 模板:选择None
然后在解码函数功能框写入终端节点设备对应的解码函数,点击保存。
1.3 调用编解码
当您在网关“Network Server > 设备” 界面添加终端节点设备时,可在载荷编解码器位置选择所需的编解码。
-
- 自定义:显示自定义编解码器
- 默认:显示内置编解码器
2. 应用示例
如下以EM300-TH设备为例,列举三种数据转发的情景供参考。
注意:
-
- 星纵物联设备数据解码器示例可参考:https://github.com/Milesight-IoT/codec/tree/release/vendors/milesight-iot 或Milesight/SensorDecoders – 码云 – 开源中国 (gitee.com)
- 若您对接的是第三方终端节点设备,请向第三方厂家获取解码器示例。
2.1 仅转发传感器解析数据
- 方式一:参考1.3章节,直接调用网关内置载荷编解码库中的EM300-TH解码示例。
- 方式二:参考1.3章节,调用自定义编解码器。在这之前需要创建一个自定义解码器,复制EM300-TH解码器,粘贴到解码函数功能框。
保存配置后,在网关“Network Server > 数据流” 界面,点击上报数据流详情信息,可以看到解码后的JSON数据。
网关收到EM300-TH数据后将会转发如下数据
{
"temperature": 30.8,
"humidity": 50.5,
}
2.2 转发原始数据与部分属性包
星纵物联LoRaWAN®网关支持通过LoRaObject语句,在原始转发内容上筛选需要的字段。假如需要转发DevEUI,RSSI,SNR等属性包及原始数据至服务器,可以在解码函数功能框输入如下内容:
function Decode(fPort, bytes) {
var decoded = {};
decoded.devEUI = LoRaObject.devEUI;
decoded.rssi = LoRaObject.rxInfo[0].rssi;
decoded.snr = LoRaObject.rxInfo[0].loRaSNR;
decoded.data = LoRaObject.data;
return decoded;
}
将会收到如下格式数据
{
"devEUI":24e1611234567890
"rssi": -5,
"snr": 11,
"data": AXVkA2cgAQRoeg==
}
2.3 转发解析数据与部分属性包
若想要转发解析数据并附带设备DevEUI信息到第三方服务器,可将EM300-TH解码器复制粘贴到解码函数功能框中,并添加LoRaObject指定内容。
注意:当需要在解析数据中添加所有信息,可使用decoded.obj= LoRaObject;来实现。点击此处获取所有LoRaObject对象。
function Decode(fPort, bytes) {
var decoded = {};
//Data decoder
for (var i = 0; i < bytes.length;) {
var channel_id = bytes[i++];
var channel_type = bytes[i++];
//BATTERY
if (channel_id === 0x01 && channel_type === 0x75) {
decoded.battery = bytes[i];
i += 1;
}
//TEMPERATURE
else if (channel_id === 0x03 && channel_type === 0x67) {
decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10;
i += 2;
}
//HUMIDITY
else if (channel_id === 0x04 && channel_type === 0x68) {
decoded.humidity = bytes[i] / 2;
i += 1;
} else {
break;
}
}
decoded.devEUI = LoRaObject.devEUI;
return decoded;
}
/* ******************************************
* bytes to number
********************************************/
function readUInt16LE(bytes) {
var value = (bytes[1] << 8) + bytes[0];
return value & 0xffff;
}
function readInt16LE(bytes){
var ref = readUInt16LE(bytes);
return ref > 0x7fff ? ref - 0x10000 : ref;
}
将转发如下数据
{
"battery": 92,
"temperature": 30.8,
"humidity": 50.5,
"devEUI":24e1611234567890
}