欧宝电子
设备与云平台通信,通常是一串二进制数(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)。
技巧
接下来,我们通过温控器+DTU接入ZWS物联网云平台,来看看温控器数(shu)据(ju)是如何进行数(shu)据(ju)解析的。
说明:温控器不具备入网能力,这里用DTU作为网关透传。
-
1、 配置数(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)了。