跟Thingsboard學IOT架構-物模型


 

前言

物模型是對設備在雲端的功能描述,包括設備的屬性,數據,服務和事件。

物聯網平台通過定義一種物的描述語言來描述物模型,稱之為 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-Guide-TSL

  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"

 

版權聲明: 作者:穆書偉

github出處:https://github.com/sanshengshui    

個人博客出處:https://www.mushuwei.cn/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM