物模型¶
物模型指将物理空间中的实体数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能。完成功能定义后,系统将自动生成该产品的物模型。物模型描述产品是什么,能做什么,可以对外提供哪些服务。 物模型,简称TSL,即Thing Specification Language。是一个JSON格式的文件。它是物理空间中的实体,如传感器、车载装置、楼宇、工厂等在云端的数字化表示,从属性、服务和事件三个维度,分别描述了该实体是什么,能做什么,可以对外提供哪些信息。定义了这三个维度,即完成了产品功能的定义。
属性(Property):
一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。
属性支持 GET 和 SET 请求方式。应用系统可发起对属性的读取和设置请求。
服务(Service):
设备可被外部调用的能力或方法,可设置输入参数和输出参数。
相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务。
事件(Event):
设备运行时的事件。
事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。如:
某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送。
设备端可以:
上报属性和事件
云端可以:
设置设备属性,
调用设备服务。
物模型格式:
1{
2 "schema":"物的TSL描述schema",
3 "link":"云端系统级uri,用来调用服务/订阅事件",
4 "profile":{
5 "productKey":"产品key"
6 },
7 "properties":[
8 {
9 "identifier":"属性唯一标识符(产品下唯一)",
10 "name":"属性名称",
11 "accessMode":"属性读写类型,只读(r),读写(rw)",
12 "required":"是否是标准功能的必选属性"
13 "dataType":{
14 "type":"属性类型: int(原生),float(原生),double(原生), text(原生),date(String类型UTC毫秒),bool(0或1的int类型),enum(int类型), struct(结构体类型,可包含前面6种类型),array(数组类型,支持int/double/float/text)",
15 "specs":{
16 "min":"参数最小值(int, float, double类型特有)",
17 "max":"参数最大值(int, float, double类型特有)",
18 "unit":"属性单位",
19 "unitName":"单位名称",
20 "size":"数组大小,默认最大128(数组特有)",
21 "item":{
22 "type":"数组元素的类型"
23 }
24 }
25 }
26 }
27 ],
28 "events":[
29 {
30 "identifier":"事件唯一标识符(产品下唯一,其中post是默认生成的属性上报事件)",
31 "name":"事件名称",
32 "desc":"事件描述",
33 "type":"事件类型(info,alert,error)",
34 "required":"是否是标准功能的必选事件",
35 "outputData":[
36 {
37 "identifier":"参数唯一标识符",
38 "name":"参数名称",
39 "dataType":{
40 "type":"属性类型: int(原生),float(原生),double(原生), text(原生),date(String类型UTC毫秒),bool(0或1的int类型),enum(int类型), struct(结构体类型,可包含前面6种类型),array(数组类型,支持int/double/float/text)",
41 "specs":{
42 "min":"参数最小值(int, float, double类型特有)",
43 "max":"参数最大值(int, float, double类型特有)",
44 "unit":"属性单位",
45 "unitName":"单位名称",
46 "size":"数组大小,默认最大128(数组特有)",
47 "item":{
48 "type":"数组元素的类型"
49 }
50 }
51 }
52 }
53 ],
54 "method":"事件对应的方法名称(根据identifier生成)"
55 }
56 ],
57 "services":[
58 {
59 "identifier":"服务唯一标识符(产品下唯一,产品下唯一,其中set/get是根据属性的accessMode默认生成的服务)",
60 "name":"服务名称",
61 "desc":"服务描述",
62 "required":"是否是标准功能的必选服务",
63 "inputData":[
64 {
65 "identifier":"入参唯一标识符",
66 "name":"入参名称",
67 "dataType":{
68 "type":"属性类型: int(原生),float(原生),double(原生), text(原生),date(String类型UTC毫秒),bool(0或1的int类型),enum(int类型), struct(结构体类型,可包含前面6种类型),array(数组类型,支持int/double/float/text)",
69 "specs":{
70 "min":"参数最小值(int, float, double类型特有)",
71 "max":"参数最大值(int, float, double类型特有)",
72 "unit":"属性单位",
73 "unitName":"单位名称",
74 "size":"数组大小,默认最大128(数组特有)",
75 "item":{
76 "type":"数组元素的类型"
77 }
78 }
79 }
80 }
81 ],
82 "outputData":[
83 {
84 "identifier":"出参唯一标识符",
85 "name":"出参名称",
86 "dataType":{
87 "type":"属性类型: int(原生),float(原生),double(原生), text(原生),date(String类型UTC毫秒),bool(0或1的int类型),enum(int类型), struct(结构体类型,可包含前面6种类型),array(数组类型,支持int/double/float/text)",
88 "specs":{
89 "min":"参数最小值(int, float, double类型特有)",
90 "max":"参数最大值(int, float, double类型特有)",
91 "unit":"属性单位",
92 "unitName":"单位名称",
93 "size":"数组大小,默认最大128(数组特有)",
94 "item":{
95 "type":"数组元素的类型(数组特有)"
96 }
97 }
98 }
99 }
100 ],
101 "method":"服务对应的方法名称(根据identifier生成)"
102 }
103 ]
104}
物模型开发¶
设备属性上报:
device.postProps({
CurrentTemperature: 25
});
=>
method: POST_PROPERY: 'thing.event.property.post',
pubTopic: PROPERTY_POST_TOPIC: '/sys/%s/%s/thing/event/property/post',
params: props
=>
var msg = {
id: id(),
version: version,
params: params,
method: method
};
var payload = JSON.stringify(msg);
_mqttClient.publish(pubTopic, payload);
事件上报:
device.postEvent('<eventName>', {
key1: 'value1'
});
=>
method: POST_EVENT: 'thing.event.<eventName>.post',
pubTopic: EVENT_POST_TOPIC: '/sys/%s/%s/thing/event/%s/post',
=>
var msg = {
id: id(),
version: version,
params: params,
method: method
};
var payload = JSON.stringify(msg);
_mqttClient.publish(pubTopic, payload);
事件上报回调:
EVENT_POST_REPLY_TOPIC: '/sys/%s/%s/thing/event/%s/post_reply',