物模型指将物理空间中的实体数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能。完成功能定义后,系统将自动生成该产品的物模型。物模型描述产品是什么,能做什么,可以对外提供哪些服务。

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

物模型将产品功能类型分为三类:属性、服务、和事件。定义了这三类功能,即完成了物模型的定义。

功能类型 说明
属性(Property) 一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。属性支持 GET 和 SET 请求方式。应用系统可发起对属性的读取和设置请求。
服务(Service) 设备可被外部调用的能力或方法,可设置输入参数和输出参数。相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务。
事件(Event) 设备运行时的事件。事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送。

物模型格式

您可以在产品的功能定义页面,单击查看物模型,查看JSON格式的 TSL。

物模型的JSON字段结构如下:

{
    "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(数组特有)",
                    "step": "步长,字符串类型",
                    "item": {
                        "type": "数组元素的类型"
                    }
                }
            }
        }
    ],
    "events": [
        {
            "identifier": "事件唯一标识符(产品下唯一,其中post是默认生成的属性上报事件)",
            "name": "事件名称",
            "desc": "事件描述",
            "type": "事件类型(info,alert,error)",
            "required": "是否是标准功能的必选事件",
            "callType": "async(异步调用),sync(同步调用)",
            "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(数组特有)",
                            "step": "步长,字符串类型",
                            "item": {
                                "type": "数组元素的类型"
                            }
                        }
                    }
                }
            ],
            "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类型), struct(结构体类型,可包含前面6种类型),array(数组类型,支持int/double/float/text)",
                        "specs": {
                            "min": "参数最小值(int, float, double类型特有)",
                            "max": "参数最大值(int, float, double类型特有)",
                            "unit": "属性单位",
                            "unitName": "单位名称",
                            "size": "数组大小,默认最大128(数组特有)",
                            "step": "步长,字符串类型",
                            "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(数组特有)",
                            "step": "步长,字符串类型",
                            "item": {
                                "type": "数组元素的类型(数组特有)"
                            }
                        }
                    }
                }
            ],
            "method": "服务对应的方法名称(根据identifier生成)"
        }
    ]
}

若产品的节点类型是设备,且接入网关协议为Modbus、OPC UA或自定义时,可以查看物模型扩展配置。

Modbus协议产品的扩展配置数据结构如下:

{
  "profile": {
    "productKey": "产品key"
  },
  "properties": [
    {
      "identifier": "属性唯一标识符(产品下唯一)",
      "operateType": "(线圈状态/输入状态/保持寄存器/输入寄存器: coilStatus/inputStatus/holdingRegister/inputRegister)",
      "registerAddress": "寄存器地址",
      "originalDataType": {
        "type": "属性类型:int16,uint16, int32,uint32,int64,uint64, float,double, string,customized data(按大端顺序返回hex data)",
        "specs": {
          "registerCount": "寄存器的数据个数”, string,customized data特有",
          "swap16": "把寄存器内16位数据的前后8个bits互换(byte1byte2 -> byte2byte1),除 string,customized data外,其他数据类型特有",
          "reverseRegister": "Ex:把原始数据32位数据的bits互换(byte1byte2byte3byte4 ->byte3byte4byte1byte2”,除 string,customized data外,其他数据类型特有"
        }
      },
      "scaling": "缩放因子",
      "pollingTime": "采集间隔, 单位是ms",
      "trigger": "数据的上报方式,目前有 按时上报:1和变更上报:2"
    }
  ]
}

			

物模型使用流程

  1. 使用控制台,单个添加物模型,或批量添加属性、事件和服务
  2. 参见Link Kit SDK文档,进行设备端物模型开发。
  3. 开发完成后,设备端可以上报属性和事件;云端可以向设备端发送设置属性和调用服务的指令。