前言
物联网的核心目标是将现实世界中的万”物”通过网络连接在一起,并将其数字化为云端的服务或资源。在这个过程中,首先需要对”物”有一个清晰、统一的定义——物模型应运而生。本文将从物模型的基本概念出发,结合行业标准(YD/T 4915-2024),详解物模型的设计方法和实战应用。
一、什么是物模型
物模型是物理空间中的实体(如传感器、车载装置、楼宇、工厂等)在云端的数字化表示,从属性、服务和事件三个维度,分别描述了该实体是什么、能做什么、可以对外提供哪些信息。
简单来说,物模型就是对物理设备的一种标准化抽象。以智能灯为例,不同品牌的灯规格各异,但它们都有”开关状态”的属性,功能逻辑也相仿。将这些共同特征标准化,就形成了智能灯的物模型。
物的抽象模型
物的抽象模型是对设备的完整描述,包含三个部分:
| 组成部分 | 说明 |
|---|---|
| 物的状态(Status) | 设备在线/离线、激活/未激活的状态 |
| 物的档案信息(Profile) | 设备身份详情的静态描述,包含设备身份标识和设备描述信息 |
| 物的功能定义(Functionality) | 属性、服务、事件三大功能要素 |
为什么要使用物模型
- 统一处理逻辑:基于共同的抽象特征,应用程序不再针对一个个产品设备,而是同一类设备采用相同的处理逻辑。即使是不同品牌的烟感产品,应用程序也可以对数值做相同的处理和判断
- 场景联动:物模型中设备的功能是明确定义的,可以方便地实现场景联动。例如,光线传感器基于光照强度,向智能电灯发送亮度控制命令
- 标准化开发:新增加的设备遵循相同的功能定义,降低开发和维护成本
二、物模型三大功能要素
物模型将产品功能分为三类:属性(Property)、服务(Service)、事件(Event)。定义了这三类功能,即完成了物模型的定义。
2.1 属性(Property)
属性用于描述设备运行时可持续存在的状态,是设备是什么的体现。
| 特性 | 说明 |
|---|---|
| 含义 | 设备运行时的状态信息 |
| 示例 | 电源开关状态、空调目标温度、灯的亮度、环境温度 |
| 访问模式 | 只读(r)或读写(rw) |
| 操作方式 | 应用系统可发起读取(GET)和设置(SET)请求 |
属性支持两种模式:
- 只读(r):仅支持读取属性值,如环境传感器读取的温度
- 读写(rw):支持读取和设置属性值,如智能灯的开关、亮度
2.2 服务(Service)
服务是设备可被外部调用的能力或方法,是设备能做什么的体现。
| 特性 | 说明 |
|---|---|
| 含义 | 设备可供外部调用的指令或方法 |
| 示例 | 设备复位、重启、修改密码、切换场景模式 |
| 参数 | 支持输入参数和输出参数 |
| 调用方式 | 同步调用或异步调用 |
服务与属性的区别:
- 属性是简单的状态读写,一次只能操作一个值
- 服务可通过一条指令实现更复杂的业务逻辑,例如一键切换”浪漫模式”同时设置颜色、亮度和色温
2.3 事件(Event)
事件是设备运行时主动上报给云端的信息,是需要被外部感知和处理的体现。
| 特性 | 说明 |
|---|---|
| 含义 | 设备在某种情况下主动上报的信息 |
| 示例 | 低电压告警、硬件故障、任务完成通知 |
| 参数 | 可包含多个输出参数 |
| 特性 | 可被订阅和推送 |
事件类型分为三种:
| 事件类型 | 说明 |
|---|---|
| 信息(info) | 设备运行状态的通知信息 |
| 告警(alert) | 需要关注的预警信息 |
| 故障(fault) | 设备发生故障时的信息 |
三要素对比
| 特性 | 属性 | 服务 | 事件 |
|---|---|---|---|
| 方向 | 双向(读写) | 云端→设备 | 设备→云端 |
| 发起方 | 应用或设备 | 应用 | 设备 |
| 复杂度 | 单一值 | 可含输入输出参数 | 可含多个输出参数 |
| 典型场景 | 读取/设置状态 | 执行复杂指令 | 告警/通知 |
三、数据类型
物模型支持六种基本数据类型,用于定义属性、服务参数和事件参数:
| 数据类型 | 标识 | 说明 | 示例 |
|---|---|---|---|
| 布尔型 | bool | 非真即假的二值型变量 | 开关状态(0=关,1=开) |
| 整数型 | int | 可线性调节的整数变量 | 亮度 0-100 |
| 浮点型 | float | 精度为浮点型的数值 | 电压 0.0-24.0V |
| 字符串型 | string | 以字符串形式表达的功能点 | 设备位置名称 |
| 枚举型 | enum | 自定义的有限集合值 | 颜色(红/绿/蓝) |
| 时间型 | timestamp | String 类型的 UTC 时间戳 | 故障发生时间 |
对于数值型(int、float),还可以定义以下约束:
| 约束项 | 说明 | 示例 |
|---|---|---|
min | 最小值 | 0 |
max | 最大值 | 100 |
step | 步长 | 1 |
unit | 单位 | %、V、℃ |
start | 起始值 | 0 |
四、TSL 描述语言
ICA 联盟定义了统一的物的描述语言(TSL,Things Specification Language),采用 JSON 格式来描述物模型。TSL 是物模型的标准表达形式。
4.1 TSL 基本结构
{
"version": "1.0",
"profile": {
"ProductId": "8D1GQLE4VA",
"CategoryId": "141"
},
"properties": [],
"events": [],
"actions": []
}
4.2 物模型模块
物联网平台支持为产品定义多组功能(属性、服务和事件)。一组功能定义的集合,就是一个物模型模块。多个物模型模块彼此互不影响。
物模型模块功能解决了工业场景中复杂的设备建模,便于在同一产品下开发不同功能的设备。例如,电暖扇产品可以拆分为:
- 模块一:电源开关、档位
- 模块二:室内温度监测
每个产品中默认模块和自定义模块总个数不能超过 200 个。
五、实战:智能电灯物模型
5.1 需求分析
以智能电灯为例,需要定义以下功能:
| 功能类型 | 功能点 | 数据类型 | 模式 |
|---|---|---|---|
| 属性 | 电源开关 | bool | rw |
| 属性 | 亮度 | int(0-100%) | rw |
| 属性 | 颜色 | enum(红/绿/蓝) | rw |
| 属性 | 色温 | int(0-100%) | rw |
| 事件 | 低电压告警 | float(0.0-24.0V) | - |
| 事件 | 硬件故障 | string + int | - |
| 事件 | 运行状态报告 | bool + string | - |
5.2 属性定义
电源开关(布尔型):
{
"id": "power_switch",
"name": "电灯开关",
"desc": "控制电灯开灭",
"required": true,
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
}
}
亮度(整数型):
{
"id": "brightness",
"name": "亮度",
"desc": "灯光亮度",
"mode": "rw",
"define": {
"type": "int",
"unit": "%",
"step": "1",
"min": "0",
"max": "100",
"start": "1"
}
}
颜色(枚举型):
{
"id": "color",
"name": "颜色",
"desc": "灯光颜色",
"mode": "rw",
"define": {
"type": "enum",
"mapping": {
"0": "Red",
"1": "Green",
"2": "Blue"
}
}
}
5.3 事件定义
低电压告警:
{
"id": "low_voltage",
"name": "LowVoltage",
"desc": "Alert for device voltage is low",
"type": "alert",
"required": false,
"params": [
{
"id": "voltage",
"name": "Voltage",
"desc": "Current voltage",
"define": {
"type": "float",
"unit": "V",
"step": "1",
"min": "0.0",
"max": "24.0",
"start": "1"
}
}
]
}
硬件故障:
{
"id": "hardware_fault",
"name": "Hardware_fault",
"desc": "Report hardware fault",
"type": "fault",
"required": false,
"params": [
{
"id": "name",
"name": "Name",
"desc": "Name like: memory, tf card, censors ...",
"define": {
"type": "string",
"min": "0",
"max": "64"
}
},
{
"id": "error_code",
"name": "Error_Code",
"desc": "Error code for fault",
"define": {
"type": "int",
"unit": "",
"step": "1",
"min": "0",
"max": "2000",
"start": "1"
}
}
]
}
5.4 完整物模型
将所有属性、事件和动作合并,智能电灯物模型的完整 TSL 如下:
{
"version": "1.0",
"properties": [
{
"id": "power_switch",
"name": "电灯开关",
"desc": "控制电灯开灭",
"required": true,
"mode": "rw",
"define": {
"type": "bool",
"mapping": { "0": "关", "1": "开" }
}
},
{
"id": "brightness",
"name": "亮度",
"desc": "灯光亮度",
"mode": "rw",
"define": {
"type": "int",
"unit": "%",
"step": "1",
"min": "0",
"max": "100",
"start": "1"
}
},
{
"id": "color",
"name": "颜色",
"desc": "灯光颜色",
"mode": "rw",
"define": {
"type": "enum",
"mapping": { "0": "Red", "1": "Green", "2": "Blue" }
}
},
{
"id": "color_temp",
"name": "色温",
"desc": "灯光冷暖",
"mode": "rw",
"define": {
"type": "int",
"min": "0",
"max": "100",
"start": "0",
"step": "10",
"unit": "%"
}
}
],
"events": [
{
"id": "status_report",
"name": "DeviceStatus",
"desc": "Report the device status",
"type": "info",
"required": false,
"params": [
{
"id": "status",
"name": "running_state",
"desc": "Report current device running state",
"define": {
"type": "bool",
"mapping": { "0": "normal", "1": "fault" }
}
},
{
"id": "message",
"name": "Message",
"desc": "Some extra message",
"define": {
"type": "string",
"min": "0",
"max": "64"
}
}
]
},
{
"id": "low_voltage",
"name": "LowVoltage",
"desc": "Alert for device voltage is low",
"type": "alert",
"required": false,
"params": [
{
"id": "voltage",
"name": "Voltage",
"desc": "Current voltage",
"define": {
"type": "float",
"unit": "V",
"step": "1",
"min": "0.0",
"max": "24.0",
"start": "1"
}
}
]
},
{
"id": "hardware_fault",
"name": "Hardware_fault",
"desc": "Report hardware fault",
"type": "fault",
"required": false,
"params": [
{
"id": "name",
"name": "Name",
"desc": "Name like: memory, tf card, censors ...",
"define": {
"type": "string",
"min": "0",
"max": "64"
}
},
{
"id": "error_code",
"name": "Error_Code",
"desc": "Error code for fault",
"define": {
"type": "int",
"unit": "",
"step": "1",
"min": "0",
"max": "2000",
"start": "1"
}
}
]
}
],
"actions": [],
"profile": {
"ProductId": "8D1GQLE4VA",
"CategoryId": "141"
}
}
六、模型的创建方式
创建物模型时有两种模式:拷贝和继承。
6.1 拷贝模式
类似于编程语言中的值拷贝:
- 新建模型与被拷贝模型有完全相同的三要素
- 两个模型相互独立,模型变更互不影响
6.2 继承模式
类似于面向对象编程中的继承概念:
- 子模型继承父模型的所有要素,且继承的元素无法被修改
- 子模型可以再被继承,支持多层的继承关系
- 子模型可以创建独立的要素,但不能与上级父模型中的元素重名
- 父模型变更时,子模型中继承的元素同步变更
以智能电灯为例,如果要增加”安装位置”属性,可以继承已有模型再扩展:
{
"id": "name",
"name": "灯位置名称",
"desc": "灯位置名称:书房、客厅等",
"mode": "rw",
"required": false,
"define": {
"type": "string",
"min": "0",
"max": "64"
}
}
七、行业标准:YD/T 4915-2024
《物联网物模型总体技术要求》(YD/T 4915-2024)是工业和信息化部发布的行业标准,对物模型的技术规范进行了统一要求,主要涵盖:
| 规范内容 | 说明 |
|---|---|
| 物模型框架 | 定义物的抽象模型和描述语言规范 |
| 功能要素 | 统一属性、服务、事件的定义方式 |
| 数据类型 | 规范物模型支持的数据类型和约束 |
| 标识符命名 | 英文标识符的命名规范 |
| TSL 格式 | JSON 格式的描述规范 |
| 模块化设计 | 物模型模块的定义和管理方式 |
该标准的出台,为不同厂商、不同平台的物模型互操作提供了统一基础,推动了物联网设备的标准化开发。
八、物模型设计最佳实践
8.1 属性设计原则
- 只放可持续存在的状态:属性是设备的状态,不是瞬时动作
- 合理选择读写模式:传感器数据用只读,可控参数用读写
- 善用枚举类型:有限集合值使用 enum 而非 int
- 定义合理的取值范围:设置 min/max 约束,防止异常值
8.2 服务设计原则
- 复杂逻辑用服务:需要同时操作多个属性时使用服务
- 明确定义输入输出:服务的参数要清晰明确
- 区分同步和异步:耗时操作使用异步调用
8.3 事件设计原则
- 只放需要主动推送的信息:可通过查询获取的不用事件
- 合理选择事件类型:info/alert/fault 分级处理
- 包含足够的上下文参数:事件参数应足够定位问题
8.4 通用原则
- 标识符命名规范:使用有意义的英文标识符,遵循驼峰或下划线命名
- 必填项谨慎设置:只有核心功能设为 required
- 版本管理:物模型变更时注意版本号管理
- 模块化拆分:复杂设备按功能域拆分为多个模块
总结
物模型是物联网平台的基石,它从属性、服务、事件三个维度对物理设备进行标准化抽象,通过 TSL(JSON 格式) 进行描述。掌握物模型的设计方法,是物联网开发的核心能力:
- 属性描述设备是什么——状态信息
- 服务描述设备能做什么——可调用的能力
- 事件描述设备可以提供什么——主动上报的信息
随着 YD/T 4915-2024 等行业标准的推进,物模型将进一步规范化,推动物联网生态的互联互通。
参考资源
- 阿里云物联网平台 - 什么是物模型
- YD/T 4915-2024《物联网物模型总体技术要求》