物模型指将物理空间中的实体数字化,并在云端构建的该实体的数据模型,用于描述实体的功能。下面介绍物模型相关概念和使用方法。
物模型TSL(Thing Specification Language)是一个JSON格式的文件。它是物理空间中的实体,如传感器、车载装置、楼宇、工厂等在云端的数字化表示,从属性、服务和事件三个维度,分别描述了该实体是什么、能做什么、可以对外提供哪些信息。定义了物模型的这三个维度,即完成了产品功能的定义。
物模型将产品功能类型分为三类:属性(properties),功能(function),事件(event)。
| 功能类型 | 说明 |
|---|---|
| 属性(Property) | 一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。属性支持GET和SET请求方式。应用系统可发起对属性的读取和设置请求。 |
| 服务(Service) | 设备可被外部调用的能力或方法,可设置输入参数和输出参数。相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务。 |
| 事件(Event) | 设备运行时的事件。事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送。 |
设备模型使用场景:
- 前端通过模型定义动态展示设备运行状态或者设备操作界面
- 服务端可通过统一的API获取设备模型并进行相关操作,如: 在发送设备消息时进行参数校验, 在收到设备消息进行类型转换处理.
物模型TSL格式
您可以在产品的功能定义页面,单击物模型TSL,查看JSON格式的TSL。
物模型TSL的JSON字段结构如下:{"id":"设备ID","name":"设备名称","properties":[...属性],"functions":[...功能],"events":[...事件]}
属性
用于定义设备属性,运行状态等如: 设备SN,当前CPU使用率等. 平台可主动下发消息获取设备属性,设备也通过事件上报属性.
数据结构:{"id": "cpu_usage", //属性标识"name": "CPU使用率","valueType": { //值类型"type": "double", //类型标识,见类型表"maxValue":100,"minValue":0,"unit":"percent", //单位"expands":{"key1":"value1"} //其他自定义拓展定义},"expands":{"key1":"value1"} //其他自定义拓展定义}
功能
用于定义设备功能,平台可主动调用,例如: 播放语音,开关操作等.
数据结构:{"id": "playVoice", //功能标识"name": "播放声音", //名称"inputs": [ //输入参数{"id": "text","name": "文字内容","valueType": { //参数类型"type": "string"},"expands":{"key1":"value1"} //其他自定义拓展定义}],"output": { //输出"type": "boolean" //输出类型},"expands":{"key1":"value1"} //其他自定义拓展定义}
事件
用于定义设备事件, 如: 定时上报设备属性, 设备报警等.
数据结构:{"id": "fire_alarm", //事件标识"name": "火警","valueType": {"type": "object", //对象(结构体)类型"properties": [ //对象属性(结构与属性定义相同){"id": "location","name": "地点","valueType": {"type": "string"}},{"id": "lng","name": "经度","valueType": {"type": "double"},"expands":{"gis":"lng"} //其他自定义拓展定义},{"id": "lat","name": "纬度","valueType": {"type": "double"},"expands":{"gis":"lat"} //其他自定义拓展定义}]},"expands":{"key1":"value1"} //其他自定义拓展定义}
阿里物联网平台物模型
{"schema": "物模型结构定义的访问URL","profile": {"productKey": "产品ProductKey"},"properties": [{"identifier": "属性唯一标识符(产品下唯一)","name": "属性名称","accessMode": "属性读写类型:只读(r)或读写(rw)。","required": "是否是标准功能的必选属性","dataType": {"type": "属性类型: int(原生)、float(原生)、double(原生)、text(原生)、date(String类型UTC毫秒)、bool(0或1的int类型)、enum(int类型,枚举项定义方法与bool类型定义0和1的值方法相同)、struct(结构体类型,可包含前面7种类型,下面使用"specs":[{}]描述包含的对象)、array(数组类型,支持int、double、float、text、struct)","specs": {"min": "参数最小值(int、float、double类型特有)","max": "参数最大值(int、float、double类型特有)","unit": "属性单位(int、float、double类型特有,非必填)","unitName": "单位名称(int、float、double类型特有,非必填)","size": "数组元素的个数,最大512(array类型特有)。","step": "步长(text、enum类型无此参数)","length": "数据长度,最大10240(text类型特有)。","0": "0的值(bool类型特有)","1": "1的值(bool类型特有)","item": {"type": "数组元素的类型(array类型特有)"}}}}],"events": [{"identifier": "事件唯一标识符(产品下唯一,其中post是默认生成的属性上报事件。)","name": "事件名称","desc": "事件描述","type": "事件类型(info、alert、error)","required": "是否是标准功能的必选事件","outputData": [{"identifier": "参数唯一标识符","name": "参数名称","dataType": {"type": "属性类型: int(原生)、float(原生)、double(原生)、text(原生)、date(String类型UTC毫秒)、bool(0或1的int类型)、enum(int类型,枚举项定义方法与bool类型定义0和1的值方法相同)、struct(结构体类型,可包含前面7种类型,下面使用"specs":[{}]描述包含的对象)、array(数组类型,支持int、double、float、text、struct)","specs": {"min": "参数最小值(int、float、double类型特有)","max": "参数最大值(int、float、double类型特有)","unit": "属性单位(int、float、double类型特有,非必填)","unitName": "单位名称(int、float、double类型特有,非必填)","size": "数组元素的个数,最大512(array类型特有)。","step": "步长(text、enum类型无此参数)","length": "数据长度,最大10240(text类型特有)。","0": "0的值(bool类型特有)","1": "1的值(bool类型特有)","item": {"type": "数组元素的类型(array类型特有)"}}}}],"method": "事件对应的方法名称(根据identifier生成)"}],"services": [{"identifier": "服务唯一标识符(产品下唯一,其中set/get是根据属性的accessMode默认生成的服务。)","name": "服务名称","desc": "服务描述","required": "是否是标准功能的必选服务","callType": "async(异步调用)或sync(同步调用)","inputData": [{"identifier": "入参唯一标识符","name": "入参名称","dataType": {"type": "属性类型: int(原生)、float(原生)、double(原生)、text(原生)、date(String类型UTC毫秒)、bool(0或1的int类型)、enum(int类型,枚举项定义方法与bool类型定义0和1的值方法相同)、struct(结构体类型,可包含前面7种类型,下面使用"specs":[{}]描述包含的对象)、array(数组类型,支持int、double、float、text、struct)","specs": {"min": "参数最小值(int、float、double类型特有)","max": "参数最大值(int、float、double类型特有)","unit": "属性单位(int、float、double类型特有,非必填)","unitName": "单位名称(int、float、double类型特有,非必填)","size": "数组元素的个数,最大512(array类型特有)。","step": "步长(text、enum类型无此参数)","length": "数据长度,最大10240(text类型特有)。","0": "0的值(bool类型特有)","1": "1的值(bool类型特有)","item": {"type": "数组元素的类型(array类型特有)"}}}}}],"outputData": [{"identifier": "出参唯一标识符","name": "出参名称","dataType": {"type": "属性类型: int(原生)、float(原生)、double(原生)、text(原生)、date(String类型UTC毫秒)、bool(0或1的int类型)、enum(int类型,枚举项定义方法与bool类型定义0和1的方法相同)、struct(结构体类型,可包含前面7种类型,下面使用"specs":[{}]描述包含的对象)、array(数组类型,支持int、double、float、text、struct)","specs": {"min": "参数最小值(int、float、double类型特有)","max": "参数最大值(int、float、double类型特有)","unit": "属性单位(int、float、double类型特有,非必填)","unitName": "单位名称(int、float、double类型特有,非必填)","size": "数组元素的个数,最大512(array类型特有)。","step": "步长(text、enum类型无此参数)","length": "数据长度,最大10240(text类型特有)。","0": "0的值(bool类型特有)","1": "1的值(bool类型特有)","item": {"type": "数组元素的类型(array类型特有)"}}}}],"method": "服务对应的方法名称(根据identifier生成)"}]}
