天天看點

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

業務場景

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

1、裝置端主動上報物模型屬性,物聯網平台更新物模型屬性值

2、前端下發更新物模型屬性指令,物模型平台不更新屬性值,平台将臨時的物模型屬性值再轉發到裝置端。

3、雲平台自發向裝置端下發更新物模型屬性指令(雲平台流轉->下發物模型屬性),物模型平台不更新屬性值。

4、裝置端從物模型接收到臨時的物模型屬性值後進行其業務邏輯處理。

5、前端擷取物模型屬性值,物模型平台給真實的物模型屬性值。

6、服務端擷取物模型屬性值,物模型平台給真實的物模型屬性值。

原理

1、物模型屬性的真實值來源隻有一個,裝置端主動上報

2、物聯網平台隻有裝置端主動上報才會更新真實的物模型屬性值

剖析

1、為什麼物模型真實來源隻能是裝置端上報,下發更新物模型屬性指令為什麼都不行?

因為阿裡雲平台物模型屬性的更新機制隻認裝置上報的屬性,這又是為什麼呢?

(1)裝置上報的屬性肯定是展現了裝置目前真正的狀态

(2)指令下發也有同步和異步的,并不能保證指令一下發,裝置的真實狀态就發生了變化,這樣物模型屬性就和裝置真實的狀态不同步了。

(3)裝置端可能由于種種原因,或者其業務邏輯限制,指令下發下來并不代表一定會生效,并不代表一定要按照指令去執行

(4)指令下發過程中指令也可能被丢失,由于網絡波動,資源緊張等情況,指令被舍棄。

(5)有可能同時存在多個用戶端同時下發指令到裝置,那到底誰才是正确的呢?那當然是裝置端自己主動上報的那個咯。

2、什麼樣的物模型消息才是正确的呢?

先看協定格式:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

日志服務中有物模型才能代表物模型資料更新

物模型消息隻能代表向物模型topic發送了資料,不一定是正确的

來看下錯誤的格式:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

正确的格式:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?
阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

從這裡可以看到,time字段和value字段是可選的,也就是物模型消息的時間戳可以有,也可以沒有,但是就是不能沒有Params字段

3、Payload格式注意事項

A、Payload格式必須為json格式

Payload上報資料會經過哪些流程?
 (1) 首先,如果內建了SDK,會先經過SDK的校驗。如果沒有內建SDK或者直接使用MQTT接口進行上報
  那麼會先經過平台的 《物模型消息》這一關,如果不是Json格式:           
阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

(2)然後是《物模型check》這一關,雖然滿足了json格式,但是如果不滿足Alink Json協定

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

(3)《物模型check》如果滿足Alink Json協定,但是部分資料不滿足物模型定義

AMQP可以正常訂閱,物模型可以正常更新資料,但是物模型資料的日志沒有生成。(後來驗證又有一條錯誤日志,感覺平台還是有bug)

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?
阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

AMQP:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

經過後來多次驗證,發現《物模型check》還是有個錯誤日志的,平台6332也沒有定義這個錯誤碼

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

(4)《物模型check》如果滿足Alink Json協定,但是全部資料都不滿足物模型定義

物模型資料不會更新,AMQP正常訂閱消息,但是消息内容裡面有倆條5092的錯誤碼

日志中物模型check這一關會提示6332錯誤碼,tsl parse failed

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

(5)《物模型check》如果滿足Alink Json協定,也滿足物模型定義

物模型check通過,物模型資料更新正常,AMQP消息訂閱正常,内容正常

物模型check通過

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

物模型資料

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

AMQP:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

B、帶time的格式和不帶time的格式都是可以成功上報的

不帶time格式:

"{"params":{"Temperature":99.99,"BatteryPercentage":88.88}}";

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

帶time格式

"{"params":{"Temperature":{"value":75.75,"time":1603248612000}}}";

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

C、如果上報的時候自帶time,那麼控制台上最新的資料按照控制台的時間排布,但是曆史資料就是按照自帶的time的資料

eg:測試時間:2020-10-24 14:46:50

驗證:當上報資料time寫死1603248612000 (2020/10/21 10:50:12)

{"params":{"Temperature":{"value":75.75,"time":1603248612000}}}

曆史資料:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

但是最新資料也是他:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

AMQP訂閱到的消息:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

順便再看看日志記錄裡是什麼樣:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?
阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

D、如果上報資料的時候不帶time

曆史資料就是最新資料

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

看看AMQP收到的消息:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

再看看日志:

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?
阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

4、通過雲平台流轉至物模型屬性下發怎樣才能生效?

阿裡雲物聯網平台 “物模型屬性” 的分析&&易錯點&&上報屬性時Payload如何正确組裝?

物模型屬性的真實值來源隻有一個,裝置端主動上報。是以不管是雲端下發指令,還是平台轉發指令(如雲平台流轉)等,裝置端需要接收到指令的後,再将該屬性進行上報

小結

本片文章隻是剖析,不講實操,把原理講通

3、Payload注意事項

4、物模型消息的正确格式

後續再逐漸更新實操文檔:

《阿裡雲物聯網平台物模型屬性下發如何才能生效》

《阿裡雲物聯網平台通過雲平台流轉實作裝置間物模型屬性的同步》

《阿裡雲物聯網雲平台物模型流轉SQL編寫技巧》