阿里云物联网平台 - 物模型
物模型介绍
物模型是云平台为物联网产品定义的数据模型,用于描述产品的功能。将产品抽象成数据的集合,方便云端进行控制。
物模型从属性、服务和事件三个维度,分别描述了该实体是什么、能做什么、可以对外提供哪些信息。定义了物模型的这三个维度,即完成了产品功能的定义。
功能类型 | 说明 |
---|---|
属性(Property) | 设备可读取和设置的能力,类似于一个变量。一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。属性支持 GET 和 SET 请求方式。应用系统可发起对属性的读取和设置请求。 |
服务(Service) | 设备可被外部调用的能力或方法,类似于一个函数,可设置输入参数和输出参数。产品提供了什么功能供云端调用。相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务。 |
事件(Event) | 设备运行时,主动上报给云端的事件。事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。例如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送。 |
物模型TSL格式
TSL 格式是一个 JSON 格式的文件,完整的 TSL 格式可以参考:阿里云物模型 。
嵌入式端开发固件往往只需要关注少数几个参数,可以在产品的功能定义页面,单击物模型TSL,精简物模型里面查看。
需要关注的有 "properties","events","services",在 JSON 格式里,这三者都是数组,分别存储了该物模型的数据,事件和服务,在 C-SDK 里也就分别是 IOT_Linkkit_Report()
上报属性,IOT_Linkkit_TriggerEvent()
触发事件和注册为 ITE_SERVICE_REQUEST
的回调函数。
属性上报
在上报属性时,只需要关注 "identifier" 名称对应的值(字符串),此时表示该属性在产品下的唯一标识。例如一个精简物模型属性为:
{
"properties": [
{
"identifier": "count",
"dataType": {
"type": "int"
}
}
]
}
则上报的数据只需要为 {"count":10}
即可,需满足 JSON 字符串的格式,字符串内有一个名称/值对,名称为 "count"(物模型里 "identifier" 的值),值对为 10(满足物模型里数据类型为 int 的要求)。
事件触发
触发事件需要关注 "identifier" 名称对应的值(字符串),表示该事件在产品下的唯一标识;还需要关注 "outputData",表示上报事件的输出值。一个精简物模型例子如下:
{
"events": [
{
"outputData": [
{
"identifier": "power",
"dataType": {
"type": "int"
}
},
{
"identifier": "power_style",
"dataType": {
"type": "enum"
}
}
],
"identifier": "power_state",
"type": "info"
}
]
}
"outputData" 数组的使用与属性上报一致,这里就不介绍了。
服务调用
服务调用需要同时关注 "identifier","inputData" 和 "outputData" 这三个名称,分别表示该服务在产品下的唯一标识,服务的输入参数,服务的输出参数。与函数调用有输入值和输出值类似,服务调用也有这些特征。
物模型数据校验
物模型数据校验方式目前有两种,弱校验和免校验。
类型 | 说明 |
---|---|
弱校验 | 只校验设备数据的 idetifier 和 dataType 字段,不校验其他字段,流转全量数据。 |
免校验 | 对上报的数据不进行校验,流转全量数据。 |
也就是说,弱校验针对产品设备的上报数据,只要 idetifier 是一致的,且 dataType 字段满足要求,就接收该数据,并且在其他云端产品流转。
设备与云端交互过程
为什么云端可以设置和获取接入设备的属性呢?为什么接入设备可以上报事件给云端呢?又为什么云端可以调用接入设备提供的服务呢?这就是这一小节解释的内容。
物模型基于 MQTT 协议,MQTT 协议的介绍不在此处展开。
云端定义了一系列的 Topic,在设备接入云端时,C-SDK 向 MQTT broker 订阅了一些的 Topic,而云端需要与设备交互时,就向 MQTT broker 发布相应的 Topic,这样就完成了交互过程。同理,云端也会订阅一些 Topic,设备可以向这些 Topic 发布消息。
接入设备端订阅发布的 Topic 列表如下:
功能 | Topic类 | 操作权限 | 描述 |
---|---|---|---|
属性上报 | /sys/${productKey}/${deviceName}/thing/event/property/post | 发布 | 设备属性上报 |
/sys/${productKey}/${deviceName}/thing/event/property/post_reply | 订阅 | 云端响应属性上报 | |
属性设置 | /sys/${productKey}/${deviceName}/thing/service/property/set | 订阅 | 设备属性设置 |
事件上报 | /sys/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post | 发布 | 设备事件上报 |
/sys/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post_reply | 订阅 | 云端响应事件上报 | |
服务调用 | /sys/${productKey}/${deviceName}/thing/service/${tsl.service.identifier} | 订阅 | 设备服务调用 |
/sys/${productKey}/${deviceName}/thing/service/${tsl.service.identifier}_reply | 发布 | 设备端响应服务调用 |
其中 ${productKey} 会替换为实际的产品名,${deviceName} 会替换为实际的设备名,${tsl.event.identifier} 是事件的标识符,${tsl.service.identifier} 是服务的标识符,最大限度地保证了 Topic 的唯一性。
这些 Topic 的作用在后面用时序来描述。