博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我是庖丁,<肢解IOT平台>之物模型
阅读量:5955 次
发布时间:2019-06-19

本文共 4300 字,大约阅读时间需要 14 分钟。

前言

物模型是对设备在云端的功能描述,包括设备的属性,数据,服务和事件。

物联网平台通过定义一种物的描述语言来描述物模型,称之为 TSL(即 Thing Specification Language),采用JSON格式,您可以根据TSL组装上报设备的数据。

最终能达到的效果:

  • 识别JSON中的键值内容,默认情况下,Key始终是一个字符串,而value可以是String,boolean,double或long。

  • 解析识别JSON字符串和JSON数组类型的字符串

  • 解析识别带有毫秒精度的unix时间戳的JSON字符串

效果如下:

引入依赖

使用序列化框架GSON对JSON格式的键值对进行识别解析,可以通过引入com.google.code.gson来配置关系。

com.google.code.gson
gson
复制代码

键值属性

KvEntry

KvEntry中提供了获取键值对属性的基本接口,例如获取字符属性的键,值和获取字符串,布尔型和数字类型的接口方法。BasicKvEntry定义了键只能为字符串类型,LongDataEntry,BooleanDataEntry,DoubleDataEntry和StringDataEntry分别定义了相应属性的值。

public interface KvEntry extends Serializable {    String getKey();    DataType getDataType();    Optional
getStrValue(); Optional
getLongValue(); Optional
getBooleanValue(); Optional
getDoubleValue(); String getValueAsString(); Object getValue();}复制代码

属性和上传数据

通过将来自设备的消息根据类型划分为设备属性(AttributesUpdateRequest)和设备上传数据(TelemetryUploadRequest),

其中TelemetryUploadRequest包含了Long型的unix时间戳。

Json识别解析

属性识别解析

属性识别解析如下,上传数据解析识别类似

UML 时序图如下:

public class JsonConverter {    private static final Gson GSON = new Gson();    public static final String CAN_T_PARSE_VALUE = "Can't parse value: ";   //遍历键值属性,对相应键值进行处理   public static List
parseValues(JsonObject valuesObject) { List
result = new ArrayList<>(); for (Map.Entry
valueEntry : valuesObject.entrySet()) { JsonElement element = valueEntry.getValue(); if (element.isJsonPrimitive()) { JsonPrimitive value = element.getAsJsonPrimitive(); //如果值为字符串 if (value.isString()) { //新建StringDataEntry result.add(new StringDataEntry(valueEntry.getKey(), value.getAsString())); //如果值为布尔型 } else if (value.isBoolean()) { //新建BooleanDataEntry result.add(new BooleanDataEntry(valueEntry.getKey(), value.getAsBoolean())); //如果值为数值类型 } else if (value.isNumber()) { parseNumericValue(result, valueEntry, value); } else { throw new JsonSyntaxException(CAN_T_PARSE_VALUE + value); } } else { throw new JsonSyntaxException(CAN_T_PARSE_VALUE + element); } } return result; } private static void parseNumericValue(List
result, Map.Entry
valueEntry, JsonPrimitive value) { //数值转化为字符串类型,并判断是不是包含".",来判断是Long,还是Double if (value.getAsString().contains(".")) { result.add(new DoubleDataEntry(valueEntry.getKey(), value.getAsDouble())); } else { try { long longValue = Long.parseLong(value.getAsString()); result.add(new LongDataEntry(valueEntry.getKey(), longValue)); } catch (NumberFormatException e) { throw new JsonSyntaxException("Big integer values are not supported!"); } } } public static AttributesUpdateRequest convertToAttributes(JsonElement element) { return convertToAttributes(element, BasicRequest.DEFAULT_REQUEST_ID); } public static AttributesUpdateRequest convertToAttributes(JsonElement element, int requestId) { if (element.isJsonObject()) { BasicAttributesUpdateRequest request = new BasicAttributesUpdateRequest(requestId); long ts = System.currentTimeMillis(); //将JSON字符串解析为键值属性的集合 request.add(parseValues(element.getAsJsonObject()).stream().map(kv -> new BaseAttributeKvEntry(kv, ts)).collect(Collectors.toList())); return request; } else { throw new JsonSyntaxException(CAN_T_PARSE_VALUE + element); } }}复制代码

运行

准备工作:

​ 安装Docker

我已经将此工程制作成镜像,并上传到DockerHub上。

源代码地址

  1. 从DockerHub下载sanshengshui/iot-guide-tsl镜像
docker pull sanshengshui/iot-gui-tsl复制代码

​ 2. 后台运行iot-guide-tsl,并将镜像端口80080映射到本机的8080

docker run -d -p 8080:8080 sanshengshui/iot-guide-tsl复制代码
  1. 利用curl测试接口
curl -v -X POST -d '{"key1":"value1", "key2":true, "key3": 3.0, "key4": 4}' http://localhost:8080/api/v1/tsl --header "Content-Type:application/json"复制代码

转载地址:http://silxx.baihongyu.com/

你可能感兴趣的文章
一个关于log4j的悲伤的故事
查看>>
PCA
查看>>
ajax上传文件
查看>>
java中通过绝对路径将图片存入数据库
查看>>
ConcurrentHashMap(Java8)源码分析
查看>>
Python文件处理之文件指针(四)
查看>>
Numpy用法详解
查看>>
DataGridView在vb.net中的操作技巧
查看>>
PMP考试冲刺进行中。。。
查看>>
大换血的代价
查看>>
RunLoop--
查看>>
chrome 2行换行省略号 ... text-ellipse
查看>>
C语言第四次作业
查看>>
Java学习-集合的理解
查看>>
iOS验证码倒计时(GCD实现)
查看>>
iOS中的过滤器和正则表达式(NSPredicate,NSRegularExpression)
查看>>
canvas和svg
查看>>
结对:复利美化版
查看>>
HDU_2689_Sort it
查看>>
urllib模块使用笔记
查看>>