前言

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

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

最终能达到的效果:

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

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

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

效果如下:

引入依赖

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

 <dependency>
           <groupId>com.google.code.gson</groupId>
           <artifactId>gson</artifactId>
</dependency>

键值属性

KvEntry

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


public interface KvEntry extends Serializable {

   String getKey();

   DataType getDataType();

   Optional<String> getStrValue();

   Optional<Long> getLongValue();

   Optional<Boolean> getBooleanValue();

   Optional<Double> 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<KvEntry> parseValues(JsonObject valuesObject) {
      List<KvEntry> result = new ArrayList<>();
      for (Map.Entry<String, JsonElement> 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<KvEntry> result, Map.Entry<String, JsonElement> 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上。

我是庖丁,<肢解IOT平台>之物模型的更多相关文章

  1. 【阿里云IoT+YF3300】3. Alink物模型之属性上传和下发

    [名词解释]属性:设备的功能模型之一,一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等.属性支持 GET 和 SET 请求方式.应用系统可发起对属性的读取和设置请求. 在上一篇文章& ...

  2. 【阿里云IoT+YF3300】4.Alink物模型之事件触发

    名词解释:设备的功能模型之一,设备运行时的事件,事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数.如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送. 在工控 ...

  3. 【阿里云IoT+YF3300】5. Alink物模型之服务下发

    名词解释: 服务:设备的功能模型之一,设备可被外部调用的能力或方法,可设置输入参数和输出参数.相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务.    -摘自阿里云物联网产品文 ...

  4. iot平台

    iot平台 iot平台卓岚云是一个免费的物联网云平台,用户只需按步骤完成注册即可免费使用卓岚云 .支持PC.Android.iOS多平台终端.用户可以在任何地方远程访问任何地方的串口设备,并对远程设备 ...

  5. mqtt网关服务器连接阿里云关联物模型

    mqtt网关服务器连接阿里云关联物模型 卓岚专门为工业环境设计的RS485设备数据采集器/物联网网关,兼具串口服务器.Modbus网关.MQTT网关.RS485转JSON等多种功能于一体. 可以连接阿 ...

  6. 聊聊如何在华为云IoT平台进行产品开发

    摘要:华为云物联网平台承载着南北向数据互通的功能职责. 本文分享自华为云社区<如何基于华为云IoT物联网平台进行产品开发>,作者: Super.雯 . 华为云物联网平台承载着南北向数据互通 ...

  7. Linux驱动之平台设备驱动模型简析(驱动分离分层概念的建立)

    Linux设备模型的目的:为内核建立一个统一的设备模型,从而有一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...

  8. 阿里云 IOT 对接设备开发 C# 开发设备对接阿里云 IOT平台

    一,创建阿里云 IOT 产品.设备 目前阿里云每月赠送 100 万条流量,可以免费使用基础版.高级版,开通后即可免费使用. 阿里云 IOT 平台地址 https://iot.console.aliyu ...

  9. 通过阿里云的IOT平台控制ESP8266

    通过阿里云的IOT平台控制ESP8266 #include <ESP8266WiFi.h> /* 依赖 PubSubClient 2.4.0 */ #include <PubSubC ...

随机推荐

  1. Angular6.0发布

    Angular v6 新版本重点关注工具链以及工具链在 Angular 中的运行速度问题. Angular v6 是统一整体框架.Material 和 CLI 三大 Angular 组件的第一个版本, ...

  2. QQ connect client request's parameters are invalid, invalid openid 问题的解决

    很多人的这个问题是POST的时候发生,我的也恰好在POST的时候发生.后来我发现可能是因为QQ的这个后端是采用类PHP的语言开发,在动态语言的获取参数时POST参数和GET参数是可以分开读取的,也就是 ...

  3. 基于JS的WEB会议室预订拖拽式图形界面的实现

    06年的一篇blog,转到这个博客上: 很早之前写的,后来由于这个功能模块取消,最终没有上线,所以与Server交互的那部分还没有写,不过那部分方案我也已经出来了,而且现在客户端这一部分已经通过了比较 ...

  4. python3学习笔记4---引用http://python3-cookbook.readthedocs.io/zh_CN/latest/

    2018-03-01数据结构与算法(4) 1.16过滤序列元素 最简单的过滤序列元素的方法就是使用列表推导.比如: >>> mylist = [1, 4, -5, 10, -7, 2 ...

  5. Java并发-任务执行

    大多数的应用程序都是围绕"任务执行"来构造的:任务常常是一些抽象的并且离散的工作单元.我们把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事物便捷来优化错误 ...

  6. 搭建centos7的开发环境2-单机版Hadoop2.7.3配置

    最近公司准备升级spark环境,主要原因是生产环境的spark和hadoop版本都比较低,但是具体升级到何种版本还不确定,需要做进一步的测试分析.这个任务对于大数据开发环境配置有要求,这里记录一下配置 ...

  7. php中的session_id详解

    php中session_id()函数原型及说明session_id()函数说明:stringsession_id([string$id])session_id() 可以用来获取/设置 当前会话 ID. ...

  8. spring boot入门篇,helloworld案例演示

    为什么用spring boot? 嵌入的 Tomcat,无需部署 WAR 文件 简化 Maven 配置 无需 XML 配置,轻松快速地搭建Spring Web应用 开始学习SpringBoot 构建简 ...

  9. Python_正则表达式二

    ''' 正则表达式对象的sub(repl,string[,count=0])和subn(repl,string[,count=0])方法用来实现字符串替换功能 ''' example='''Beaut ...

  10. eclipse springmvc+Thymeleaf

    修改pom.xml引入Thymeleaf相关包: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=& ...