物模型

物模型指将物理空间中的实体数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能。完成功能定义后,系统将自动生成该产品的物模型。物模型描述产品是什么,能做什么,可以对外提供哪些服务。 物模型,简称TSL,即Thing Specification Language。是一个JSON格式的文件。它是物理空间中的实体,如传感器、车载装置、楼宇、工厂等在云端的数字化表示,从属性、服务和事件三个维度,分别描述了该实体是什么,能做什么,可以对外提供哪些信息。定义了这三个维度,即完成了产品功能的定义。

属性(Property):

一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。
属性支持 GET 和 SET 请求方式。应用系统可发起对属性的读取和设置请求。

服务(Service):

设备可被外部调用的能力或方法,可设置输入参数和输出参数。
相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务。

事件(Event):

设备运行时的事件。
事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。如:
  某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送。

设备端可以:

上报属性和事件

云端可以:

设置设备属性,
调用设备服务。

物模型格式:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
{
    "schema":"物的TSL描述schema",
    "link":"云端系统级uri,用来调用服务/订阅事件",
    "profile":{
        "productKey":"产品key"
    },
    "properties":[
        {
            "identifier":"属性唯一标识符(产品下唯一)",
            "name":"属性名称",
            "accessMode":"属性读写类型,只读(r),读写(rw)",
            "required":"是否是标准功能的必选属性"
            "dataType":{
                "type":"属性类型: int(原生),float(原生),double(原生), text(原生),date(String类型UTC毫秒),bool(0或1的int类型),enum(int类型), struct(结构体类型,可包含前面6种类型),array(数组类型,支持int/double/float/text)",
                "specs":{
                    "min":"参数最小值(int, float, double类型特有)",
                    "max":"参数最大值(int, float, double类型特有)",
                    "unit":"属性单位",
                    "unitName":"单位名称",
                    "size":"数组大小,默认最大128(数组特有)",
                    "item":{
                        "type":"数组元素的类型"
                    }
                }
            }
        }
    ],
    "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类型), struct(结构体类型,可包含前面6种类型),array(数组类型,支持int/double/float/text)",
                        "specs":{
                            "min":"参数最小值(int, float, double类型特有)",
                            "max":"参数最大值(int, float, double类型特有)",
                            "unit":"属性单位",
                            "unitName":"单位名称",
                            "size":"数组大小,默认最大128(数组特有)",
                            "item":{
                                "type":"数组元素的类型"
                            }
                        }
                    }
                }
            ],
            "method":"事件对应的方法名称(根据identifier生成)"
        }
    ],
    "services":[
        {
            "identifier":"服务唯一标识符(产品下唯一,产品下唯一,其中set/get是根据属性的accessMode默认生成的服务)",
            "name":"服务名称",
            "desc":"服务描述",
            "required":"是否是标准功能的必选服务",
            "inputData":[
                {
                    "identifier":"入参唯一标识符",
                    "name":"入参名称",
                    "dataType":{
                        "type":"属性类型: int(原生),float(原生),double(原生), text(原生),date(String类型UTC毫秒),bool(0或1的int类型),enum(int类型), struct(结构体类型,可包含前面6种类型),array(数组类型,支持int/double/float/text)",
                        "specs":{
                            "min":"参数最小值(int, float, double类型特有)",
                            "max":"参数最大值(int, float, double类型特有)",
                            "unit":"属性单位",
                            "unitName":"单位名称",
                            "size":"数组大小,默认最大128(数组特有)",
                            "item":{
                                "type":"数组元素的类型"
                            }
                        }
                    }
                }
            ],
            "outputData":[
                {
                    "identifier":"出参唯一标识符",
                    "name":"出参名称",
                    "dataType":{
                        "type":"属性类型: int(原生),float(原生),double(原生), text(原生),date(String类型UTC毫秒),bool(0或1的int类型),enum(int类型), struct(结构体类型,可包含前面6种类型),array(数组类型,支持int/double/float/text)",
                        "specs":{
                            "min":"参数最小值(int, float, double类型特有)",
                            "max":"参数最大值(int, float, double类型特有)",
                            "unit":"属性单位",
                            "unitName":"单位名称",
                            "size":"数组大小,默认最大128(数组特有)",
                            "item":{
                                "type":"数组元素的类型(数组特有)"
                            }
                        }
                    }
                }
            ],
            "method":"服务对应的方法名称(根据identifier生成)"
        }
    ]
}

物模型开发

设备属性上报:

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',