物模型
更新时间: 2023-04-10

物模型是物联网平台为产品定义的物体数据模型,在物联网平台中用于描述任何数字孪生设备的能力,使IoT平台和IoT解决方案能够使用每个数字孪生模型的语义。

本文介绍物模型的相关概念、DTML(数字孪生模型语言,Digital Twins Model Language)格式和规范、使用流程。

# 物模型概述

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

物模型将产品功能类型分为三类:

  • 属性

  • 服务

  • 事件

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

# 使用说明

平台通过定义一种物的描述语言来表达物模型的功能,称之为数字孪生模型语言DTML(Digital Twins Model Language,以下简称物模型)。DTML基于JSON-LD来描述数字孪生模型,是一个JSON格式的文件。

用户对物模型的主要操作:

  1. 可以在物联网平台产品的功能定义页面,单击物模型,查看JSON格式的DTML。
  2. 平台支持在产品上导入和导出物模型,快速将物模型与产品进行关联。
  3. 在产品上通过添加或删除功能,即可自动更新物模型。
  4. 通过openapi获取指定产品、设备的物模型,以便业务应用使用物模型进行自动化业务逻辑处理。

物模型的JSON示例,详见下一章节《物模型JSON文件示例》。进一步了解物模型规范可查看中国信通院发布的《IoT 物模型标准 DTML 规范 v1.0》。

# 物模型操作

可以通过控制台或openapi对物模型进行操作。

# 产品添加功能

在产品功能中添加属性、事件和服务平台即为产品自动生成相应的物模型。

# 操作步骤

  1. 进入产品详情页,点击左侧【产品功能】菜单,在相应的tab下添加功能

image.png

  1. 切换到【物模型】tab,查看物模型

image.png

# 设备基于物模型通信

# 使用流程

  1. 设备上报数据:平台根据封装的G+link协议数据格式,生成数据,然后上报。物联网平台也可以通过openapi设置属性、设备期望属性值和调用服务。(G+link协议的数据格式,请参见设备属性、事件、服务和设备期望属性值。)

  2. 平台校验数据:平台校验设备端上报的属性、事件数据和服务调用数据(服务请求参数和服务调用结果),并将校验通过的数据显示在平台控制台对应设备的设备详情页面下物模型数据页签。

  3. 服务端订阅和规则引擎:用户的服务器可通过规则引擎,获取设备属性和事件数据,以及设备属性设置和服务调用指令的响应结果。

# 导出物模型

在物模型预览页面可以将物模型导出为JSON文件。

image.png

# 物模型示例

以下是一个实际的DTML文件,进一步了解物模型规范可查看中国信通院发布的《IoT 物模型标准 DTML 规范 v1.0》。

物模型示例:

{
    "properties":{
        "Device_ID":{
            "@id":"dtml:CNCMInformation:DeviceID;1",
            "dataSchema":{
                "@type":"string",
                "maxLength":10,
                "minLength":1,
                "pattern":"[a-zA-z]"
            },
            "displayName":"设备ID",
            "description":"设备的唯一标识码,例如数控机床的制造商ID和生产SN号码,系统ID不应超过255个字节"
        },
        "Name":{
            "@id":"dtml:CNCMInformation:Name;1",
            "dataSchema":"string",
            "displayName":"名称",
            "description":"设备名称应保证唯一性,能够区分同品牌、同型号的不同数控机床",
            "writable":true
        },
        "Description":{
            "@id":"dtml:CNCMInformation:Description;1",
            "dataSchema":{
                "@type":"string",
                "maxLength":5
            },
            "displayName":"描述",
            "description":"设备描述"
        },
        "Vendor_Name":{
            "@id":"dtml:CNCMInformation:VendorName;1",
            "dataSchema":"COMMON_STRING",
            "displayName":{
                "zh-Hans":"制造商名称",
                "en":"manufacturer "
            },
            "description":{
                "zh-Hans":"制造商名称中文描述",
                "en":"manufacturer description"
            }
        },
        "Device_Length":{
            "@id":"dtml:CNCMInformation:DeviceLength;1",
            "@type":[
                "LengthUnit"
            ],
            "dataSchema":{
                "@type":"float",
                "max":100,
                "min":0,
                "step":0.1
            },
            "unit":"metre",
            "displayName":"设备长度",
            "description":"该设备的长度"
        },
        "Electric_Value":{
            "@id":"dtml:CNCMInformation:DeviceLength;1",
            "dataSchema":{
                "@type":"int",
                "max":50,
                "min":0
            },
            "displayName":"电量值",
            "description":"该设备的电量值",
            "writable":true
        },
        "Property_Object_Demo":{
            "@id":"dtml:CNCMInformation:Property:Object:Demo;1",
            "dataSchema":{
                "@type":"object",
                "fileds":{
                    "SUB_1":{
                        "@type":"integer",
                        "max":10,
                        "min":1
                    },
                    "SUB_2":{
                        "@type":"integer"
                    },
                    "SUB_3":{
                        "@type":"string",
                        "maxLength":10,
                        "minLength":1,
                        "pattern":"[a-zA-z]"
                    },
                    "required":[
                        "SUB_1",
                        "SUB_2"
                    ]
                }
            },
            "displayName":"属性对象示例",
            "description":"举例属性object类型格式",
            "writable":true
        },
        "Close_Clock_Time":{
            "@id":"dtml:Close_Clock_Time;1",
            "dataSchema":"CLOCK_TIME",
            "displayName":"关机时间",
            "description":"数控机床的最新关机运行时间",
            "writable":true
        },
        "Real_TIme_Electrical_Energy":{
            "@id":"dtml:Real_TIme_Electrical_Energy;1",
            "dataSchema":"ELECTRICAL_ENERGY",
            "displayName":"实时能耗信息",
            "description":"数控机床当前的电能消耗值"
        }
    },
    "commands":{
        "ncProgramLoad":{
            "@id":"dtml:ncProgramLoad;1",
            "displayName":"NC程序加载操作",
            "description":"加载操作演示",
            "input":{
                "fileds":{
                    "MACHINE_ID":{
                        "@type":"integer",
                        "max":10,
                        "min":1
                    },
                    "PROGRAM_ID":{
                        "@type":"integer"
                    },
                    "PROGRAM":{
                        "@type":"string",
                        "maxLength":10,
                        "minLength":1,
                        "pattern":"[a-zA-z]"
                    },
                    "required":[
                        "MACHINE_ID",
                        "PROGRAM_ID"
                    ]
                }
            },
            "output":{
                "fields":{
                    "SUCCESS":{
                        "@type":"boolean"
                    }
                }
            }
        }
    },
    "events":{
        "airConError":{
            "displayName":"空调故障",
            "description":"空调出现异常,上报故障事件",
            "data":{
                "fields":{
                    "sourceIP":{
                        "@type":"string",
                        "minLength":1,
                        "maxLength":"20"
                    },
                    "sourceName":{
                        "@type":"string",
                        "minLength":1,
                        "maxLength":"100",
                        "pattern":"[a-zA-Z]"
                    },
                    "content":{
                        "@type":"float",
                        "min":"1.0",
                        "max":"10.0",
                        "step":"2.0"
                    },
                    "switch":{
                        "@type":"enum",
                        "enumType":"integer",
                        "enumValues":{
                            "off":{
                                "enumValue":1,
                                "displayName":"Off"
                            },
                            "online":{
                                "enumValue":2,
                                "displayName":"On"
                            }
                        }
                    },
                    "time":{
                        "@type":"dateTime",
                        "format":"yy/MM/dd HH:mm:ss"
                    }
                }
            }
        }
    },
    "@id":"dtml:bce:iot:dmp:4eb7ynb9;1",
    "@context":[
        "dtml:context:thing;1"
    ]
}