版權聲明: 做者:穆書偉
github出處:https://github.com/sanshengshui
我的博客出處:https://www.mushuwei.cn/
物模型是對設備在雲端的功能描述,包括設備的屬性,數據,服務和事件。html
物聯網平臺經過定義一種物的描述語言來描述物模型,稱之爲 TSL(即 Thing Specification Language),採用JSON格式,您能夠根據TSL組裝上報設備的數據。git
最終能達到的效果:github
識別JSON中的鍵值內容,默認狀況下,Key始終是一個字符串,而value能夠是String,boolean,double或long。docker
解析識別JSON字符串和JSON數組類型的字符串json
解析識別帶有毫秒精度的unix時間戳的JSON字符串api
效果以下:數組
使用序列化框架GSON對JSON格式的鍵值對進行識別解析,能夠經過引入com.google.code.gson來配置關係。app
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
在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),curl
其中TelemetryUploadRequest包含了Long型的unix時間戳。
屬性識別解析以下,上傳數據解析識別相似
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
從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
利用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"
原文出處:https://www.cnblogs.com/sanshengshui/p/10725330.html