阿里云物聯(lián)網(wǎng)平臺(tái) - 物模型
物模型介紹
物模型是云平臺(tái)為物聯(lián)網(wǎng)產(chǎn)品定義的數(shù)據(jù)模型,用于描述產(chǎn)品的功能。將產(chǎn)品抽象成數(shù)據(jù)的集合,方便云端進(jìn)行控制。
物模型從屬性、服務(wù)和事件三個(gè)維度,分別描述了該實(shí)體是什么、能做什么、可以對(duì)外提供哪些信息。定義了物模型的這三個(gè)維度,即完成了產(chǎn)品功能的定義。
| 功能類型 | 說明 |
|---|---|
| 屬性(Property) | 設(shè)備可讀取和設(shè)置的能力,類似于一個(gè)變量。一般用于描述設(shè)備運(yùn)行時(shí)的狀態(tài),如環(huán)境監(jiān)測(cè)設(shè)備所讀取的當(dāng)前環(huán)境溫度等。屬性支持 GET 和 SET 請(qǐng)求方式。應(yīng)用系統(tǒng)可發(fā)起對(duì)屬性的讀取和設(shè)置請(qǐng)求。 |
| 服務(wù)(Service) | 設(shè)備可被外部調(diào)用的能力或方法,類似于一個(gè)函數(shù),可設(shè)置輸入?yún)?shù)和輸出參數(shù)。產(chǎn)品提供了什么功能供云端調(diào)用。相比于屬性,服務(wù)可通過一條指令實(shí)現(xiàn)更復(fù)雜的業(yè)務(wù)邏輯,如執(zhí)行某項(xiàng)特定的任務(wù)。 |
| 事件(Event) | 設(shè)備運(yùn)行時(shí),主動(dòng)上報(bào)給云端的事件。事件一般包含需要被外部感知和處理的通知信息,可包含多個(gè)輸出參數(shù)。例如,某項(xiàng)任務(wù)完成的信息,或者設(shè)備發(fā)生故障或告警時(shí)的溫度等,事件可以被訂閱和推送。 |
物模型TSL格式
TSL 格式是一個(gè) JSON 格式的文件,完整的 TSL 格式可以參考:阿里云物模型 。
嵌入式端開發(fā)固件往往只需要關(guān)注少數(shù)幾個(gè)參數(shù),可以在產(chǎn)品的功能定義頁(yè)面,單擊物模型TSL,精簡(jiǎn)物模型里面查看。
需要關(guān)注的有 "properties","events","services",在 JSON 格式里,這三者都是數(shù)組,分別存儲(chǔ)了該物模型的數(shù)據(jù),事件和服務(wù),在 C-SDK 里也就分別是 IOT_Linkkit_Report() 上報(bào)屬性,IOT_Linkkit_TriggerEvent() 觸發(fā)事件和注冊(cè)為 ITE_SERVICE_REQUEST 的回調(diào)函數(shù)。
屬性上報(bào)
在上報(bào)屬性時(shí),只需要關(guān)注 "identifier" 名稱對(duì)應(yīng)的值(字符串),此時(shí)表示該屬性在產(chǎn)品下的唯一標(biāo)識(shí)。例如一個(gè)精簡(jiǎn)物模型屬性為:
{
"properties": [
{
"identifier": "count",
"dataType": {
"type": "int"
}
}
]
}
則上報(bào)的數(shù)據(jù)只需要為 {"count":10} 即可,需滿足 JSON 字符串的格式,字符串內(nèi)有一個(gè)名稱/值對(duì),名稱為 "count"(物模型里 "identifier" 的值),值對(duì)為 10(滿足物模型里數(shù)據(jù)類型為 int 的要求)。
事件觸發(fā)
觸發(fā)事件需要關(guān)注 "identifier" 名稱對(duì)應(yīng)的值(字符串),表示該事件在產(chǎn)品下的唯一標(biāo)識(shí);還需要關(guān)注 "outputData",表示上報(bào)事件的輸出值。一個(gè)精簡(jiǎn)物模型例子如下:
{
"events": [
{
"outputData": [
{
"identifier": "power",
"dataType": {
"type": "int"
}
},
{
"identifier": "power_style",
"dataType": {
"type": "enum"
}
}
],
"identifier": "power_state",
"type": "info"
}
]
}
"outputData" 數(shù)組的使用與屬性上報(bào)一致,這里就不介紹了。
服務(wù)調(diào)用
服務(wù)調(diào)用需要同時(shí)關(guān)注 "identifier","inputData" 和 "outputData" 這三個(gè)名稱,分別表示該服務(wù)在產(chǎn)品下的唯一標(biāo)識(shí),服務(wù)的輸入?yún)?shù),服務(wù)的輸出參數(shù)。與函數(shù)調(diào)用有輸入值和輸出值類似,服務(wù)調(diào)用也有這些特征。
物模型數(shù)據(jù)校驗(yàn)
物模型數(shù)據(jù)校驗(yàn)方式目前有兩種,弱校驗(yàn)和免校驗(yàn)。
| 類型 | 說明 |
|---|---|
| 弱校驗(yàn) | 只校驗(yàn)設(shè)備數(shù)據(jù)的 idetifier 和 dataType 字段,不校驗(yàn)其他字段,流轉(zhuǎn)全量數(shù)據(jù)。 |
| 免校驗(yàn) | 對(duì)上報(bào)的數(shù)據(jù)不進(jìn)行校驗(yàn),流轉(zhuǎn)全量數(shù)據(jù)。 |
也就是說,弱校驗(yàn)針對(duì)產(chǎn)品設(shè)備的上報(bào)數(shù)據(jù),只要 idetifier 是一致的,且 dataType 字段滿足要求,就接收該數(shù)據(jù),并且在其他云端產(chǎn)品流轉(zhuǎn)。
設(shè)備與云端交互過程
為什么云端可以設(shè)置和獲取接入設(shè)備的屬性呢?為什么接入設(shè)備可以上報(bào)事件給云端呢?又為什么云端可以調(diào)用接入設(shè)備提供的服務(wù)呢?這就是這一小節(jié)解釋的內(nèi)容。
物模型基于 MQTT 協(xié)議,MQTT 協(xié)議的介紹不在此處展開。
云端定義了一系列的 Topic,在設(shè)備接入云端時(shí),C-SDK 向 MQTT broker 訂閱了一些的 Topic,而云端需要與設(shè)備交互時(shí),就向 MQTT broker 發(fā)布相應(yīng)的 Topic,這樣就完成了交互過程。同理,云端也會(huì)訂閱一些 Topic,設(shè)備可以向這些 Topic 發(fā)布消息。
接入設(shè)備端訂閱發(fā)布的 Topic 列表如下:
| 功能 | Topic類 | 操作權(quán)限 | 描述 |
|---|---|---|---|
| 屬性上報(bào) | /sys/${productKey}/${deviceName}/thing/event/property/post | 發(fā)布 | 設(shè)備屬性上報(bào) |
| /sys/${productKey}/${deviceName}/thing/event/property/post_reply | 訂閱 | 云端響應(yīng)屬性上報(bào) | |
| 屬性設(shè)置 | /sys/${productKey}/${deviceName}/thing/service/property/set | 訂閱 | 設(shè)備屬性設(shè)置 |
| 事件上報(bào) | /sys/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post | 發(fā)布 | 設(shè)備事件上報(bào) |
| /sys/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post_reply | 訂閱 | 云端響應(yīng)事件上報(bào) | |
| 服務(wù)調(diào)用 | /sys/${productKey}/${deviceName}/thing/service/${tsl.service.identifier} | 訂閱 | 設(shè)備服務(wù)調(diào)用 |
| /sys/${productKey}/${deviceName}/thing/service/${tsl.service.identifier}_reply | 發(fā)布 | 設(shè)備端響應(yīng)服務(wù)調(diào)用 |
其中 ${productKey} 會(huì)替換為實(shí)際的產(chǎn)品名,${deviceName} 會(huì)替換為實(shí)際的設(shè)備名,${tsl.event.identifier} 是事件的標(biāo)識(shí)符,${tsl.service.identifier} 是服務(wù)的標(biāo)識(shí)符,最大限度地保證了 Topic 的唯一性。
這些 Topic 的作用在后面用時(shí)序來描述。
屬性上報(bào)與設(shè)置

事件上報(bào)

服務(wù)調(diào)用
