2. Matter协议架构与Silicon Labs实现
Matter 并不是一个从零发明的全新协议栈,而是把成熟的 IP 网络能力、成熟的加密体系与一套统一的应用层语义组合起来,形成“应用层 + 数据模型 + 交互模型 + 安全层”四层协作的规范。理解这四层各自负责什么、边界在哪里,是后续在 Silicon Labs SDK 中定位代码、排查问题的前提。本节先建立整体架构认知,再落到 SDK 的组件与代码组织。
一、四层架构:各管一段,接口清晰
从下往上看,Matter 建立在 IPv6 之上,传输层可走 Thread(802.15.4)、Wi-Fi 或以太网,因此它天然支持“多网络共存、同一套应用语义”。在此之上是安全层,负责设备身份、会话密钥与消息加解密;再往上是交互模型,定义设备之间如何读写属性、调用命令、上报事件;最上层是数据模型,用节点(Node)、端点(Endpoint)、簇(Cluster)、属性(Attribute)、命令(Command)、事件(Event)这套词汇描述“一个设备是什么、能做什么”。
关键点在于:数据模型是“静态描述”,交互模型是“动态动作”,安全层是“通道保障”,应用层则是把三者串起来的业务逻辑。Silicon Labs 的 SDK 基本按这个分层来组织代码,所以定位问题时先判断“属于哪一层”,能大幅缩小排查范围。
二、数据模型:用“端点 + 簇”描述设备
数据模型的最小可寻址单位是“端点”。一个物理设备(Node)可以有多个端点,端点 0 固定为根端点,承载基础信息簇(Basic Information)、网络调试簇等;端点 1 及以后用于业务功能。每个端点挂载若干簇,簇是功能的集合,例如 On/Off 簇、Level Control 簇、Temperature Measurement 簇。簇内再分属性、命令、事件。
举例:一个可调光灯泡,端点 1 上挂 On/Off 簇(属性 OnOff,命令 Toggle/On/Off)、Level Control 簇(属性 CurrentLevel,命令 MoveToLevel)。控制器读取 Endpoint 1 / OnOff / OnOff 就能知道灯是否亮着;发送 Endpoint 1 / Level Control / MoveToLevel(128) 就能把亮度调到约 50%。这种“路径式寻址”是 Matter 互操作性的基础——不同厂商只要遵循同一簇规范,控制器无需定制代码。
在 Silicon Labs SDK 中,数据模型主要由 ZAP(ZCL Advanced Platform)工具生成。开发者通过 .zap 文件配置端点、簇、属性和命令,ZAP 生成 endpoint_config.h、zap-generated/ 下的回调桩与属性表。这意味着“改数据模型”通常不是手写结构体,而是改 ZAP 配置后重新生成。
三、交互模型:读写、调用与订阅
交互模型规定了四种基本动作:Read(读属性)、Write(写属性)、Invoke(调用命令)、Subscribe(订阅)。订阅是 Matter 的特色:控制器订阅某属性后,设备在属性变化时主动上报(Report),并受 MinInterval / MaxInterval 节流控制。例如温度传感器设置 MinInterval=1s、MaxInterval=60s,则变化频繁时最快 1 秒上报一次,长时间无变化时至少 60 秒上报一次,兼顾实时性与功耗。
交互模型还负责路径解析、权限检查(读/写/调用权限)、分块传输(大属性分片)和超时重传。在 SDK 中,这部分由 interaction model 引擎处理,应用层通常只需注册回调,例如 emberAfOnOffClusterSetOnOffCallback,在命令到达时执行实际动作。
四、安全层:从设备认证到会话加密
安全层解决三个问题:设备是不是可信的、消息有没有被篡改、重放攻击如何防范。设备入网时通过 DAC(设备认证证书)、PAI(中间证书)、PAA(根证书)三级证书链完成认证,证书由 CSA 认证体系签发。认证通过后协商出会话密钥,后续消息用 AES-CCM 加密并附带消息计数器,接收方检查计数器单调递增以拒绝重放。
在 SDK 中,安全相关代码集中在 security 目录与 Session Manager,Fabric 表记录已入网的控制方信息。调试阶段常见问题是证书未正确烧录或 Fabric 表已满,表现为入网失败或无法建立会话,此时应优先检查证书与 Fabric 状态,而不是应用逻辑。
五、SDK 代码组织与定位思路
Silicon Labs Matter SDK 大致按以下方式组织:src/app/ 放应用框架与 ZAP 生成物,src/protocols/ 放交互模型与数据模型引擎,src/security/ 放安全实现,src/platform/ 放芯片与外设适配,third_party/ 放 OpenThread 等依赖。实际项目里,应用代码通常只改 app/ 下的回调与 .zap 配置。