欧宝电子

 2023-08-22 zlg

设备与云平台通信,通常是一串二进制数(shu)据(ju),不具备可读性,需要将数(shu)据(ju)解析成更易读的数(shu)据(ju)格式。本文将介绍数(shu)据(ju)解析是什么,以及在ZWS云平台中如何配置解析脚本对设备数(shu)据(ju)解析。

注册

市面上生产的传统设备,往往不具备联网能力,且外界通信主要通过串口传输二进制数(shu)据(ju)。在将这些设备接入物联网平台,进行数字化管理过程中,会遇到一个问题“如何将上报的二进制数(shu)据(ju)变成更易读的JSON数(shu)据(ju)?”,比如:上报 “45190055E8A9”如何变成“温度:25.36℃”,这个将原始数(shu)据(ju)转换成JSON数(shu)据(ju)的过程就是数(shu)据(ju)解析。

开奖

数(shu)据(ju)解析简化流程:黑盒二进制数(shu)据(ju)->解析处理->易读JSON数(shu)据(ju)。

数(shu)据(ju)解析流程

技巧

接下来,我们通过温控器+DTU接入ZWS物联网云平台,来看看温控器数(shu)据(ju)是如何进行数(shu)据(ju)解析的。

说明:温控器不具备入网能力,这里用DTU作为网关透传。

  • 1、 配置数(shu)据(ju)模型

    首先,要在云平台中定义设备类型的数(shu)据(ju)模型,温控器有温度、湿度两个数(shu)据(ju)点,所以数(shu)据(ju)模型配置如下:

    配置数(shu)据(ju)模型

    后续的解析脚本会按照模型设置的数(shu)据(ju)点来返回解析后的数(shu)据(ju)。

  • 2、 配置数(shu)据(ju)解析脚本

    编写解析脚本前,需要先了解设备上报的数(shu)据(ju)格式,我们来看下温控器读取温湿度的数(shu)据(ju)帧。温控器使用自定义协议格式的数(shu)据(ju)帧,格式如下:

    自定义协议格式

    以数(shu)据(ju)0406E219647FE6为例,解析规则对应:04数(shu)据(ju)长度(表示数(shu)据(ju)有4个字节)、06E21964 温湿度值、7FE6 校验码。

    解析规则

    因此,温控器解析脚本内容如下:

    //GroovyUtils为通用解析工具 import com.zlgcloud.iotplatform.iotmapping.commons.GroovyUtils import java.nio.ByteBuffer; /** * 将二进制报文解析成物模型的map数(shu)据(ju)* * @param rawData 二进制报文 * @return 物模型数(shu)据(ju)* @description 方法名必须为rawDataToJson,参数必须是byte[]类型 */ static Map<String, Object> rawDataToJson(byte[] rawData) { Map<String, Object> map = new HashMap<>(); Map<String, Object> dataMap = new HashMap<>(); //定义解析数(shu)据(ju)的map,key固定为data,用于存放对应事件内字段的数(shu)据(ju)map.put("data", dataMap); //设置数(shu)据(ju)模型配置中定义的数(shu)据(ju)点 map.put("event_name", "MX_TEMP_fn.raw"); //初始温度、湿度为0 float temperature = 0; float humidity = 0; //开始解析数(shu)据(ju)ByteBuffer byteBuffer = ByteBuffer.wrap(rawData); //从第0个字节开始读取 int offset = 0; //读取长度 int dataLen = byteBuffer.get(offset); offset += 1; //如果长度为4,则同时解析温度和湿度数(shu)据(ju);否则长度就为2,只解析温度数(shu)据(ju)if (dataLen == 4) { // 解析温度 temperature = byteBuffer.getShort(offset); if (temperature >= 4096) { // 负值 temperature = -1 * (temperature - 4096); } temperature = temperature / 100; //解析湿度 offset += 2; humidity = byteBuffer.getShort(offset); humidity = humidity / 100; } else { //解析温度 temperature = byteBuffer.getShort(offset); if (temperature >= 4096) { // 负值 temperature = -1 * (temperature - 4096); } temperature = temperature / 100; } //将数(shu)据(ju)按数(shu)据(ju)模型配置定义的格式放入返回值中 dataMap.put("temperature", temperature); dataMap.put("humidity", humidity); return map; }

    说明:
    1、 解析脚本中支持对多个数(shu)据(ju)点进行解析处理,不仅限于两个数(shu)据(ju)点。
    2、 解析脚本中的数(shu)据(ju)点要与数(shu)据(ju)模型中配置的一致,否则会解析保存失败。

    将编写好的解析脚本配置到温控器的设备类型上:

    解析脚本配置

  • 3、 查看解析后的数据

    将解析脚本配置成功后,温控器再次上报原始数(shu)据(ju),在云平台中就可以看到解析后的温湿度数(shu)据(ju)了。

    解析结果