管理员配网 Cluster(AdministratorCommissioning)
Cluster ID: 0x003C |
所在 Endpoint: 固定在 Endpoint 0(Root Endpoint)
AdministratorCommissioning 负责控制设备的配网窗口(Commissioning Window)的开启与关闭。 当一个设备已经加入了某个 Fabric(已被配网),想要让新的管理员也能配网这台设备时, 就需要通过这个 Cluster 打开配网窗口。它不负责配网流程本身(那是 GeneralCommissioning 的事), 而是控制「设备是否接受新的配网请求」这个开关。
如果把设备比作一栋房子,AdministratorCommissioning 就是门口的门禁系统。 房子的主人(已有管理员)可以选择暂时打开门禁,让新的住户(新管理员)进来完成入住手续(配网)。 OpenCommissioningWindow 是换了一把新门锁密码再开门(更安全), OpenBasicCommissioningWindow 是直接用现有密码开门(更方便), RevokeCommissioning 则是随时把门关上。
Feature Map
| Bit | 代码 | 名称 | 说明 |
|---|---|---|---|
0 |
BC | Basic Commissioning | 支持基础配网方法 —— 即 OpenBasicCommissioningWindow 命令。如果设备不支持此 Feature,则只能通过增强配网方式开窗 |
命令(Commands)
AdministratorCommissioning Cluster 共有 3 个命令,分别用于开启增强配网窗口、开启基础配网窗口和关闭配网窗口。 这三个命令都没有专属的响应结构体,通过通用的 Status 响应返回结果。 点击下方表格中的命令 ID 可跳转到对应的详细说明。
| ID | 名称 | Feature | 说明 |
|---|---|---|---|
0x00 |
OpenCommissioningWindow | -- | 使用新的 PAKE 验证器开启增强配网窗口 |
0x01 |
OpenBasicCommissioningWindow | BC | 使用现有密码开启基础配网窗口 |
0x02 |
RevokeCommissioning | -- | 关闭当前已开启的配网窗口 |
OpenCommissioningWindow —— 增强配网开窗(0x00)
开启增强配网窗口(Enhanced Commissioning Window)。调用者需要提供一个全新的 PAKE 验证器, 新的 Commissioner 将使用这个验证器而非设备出厂密码来建立 PASE 安全通道。 这是最安全的开窗方式 —— 每次开窗都使用一次性的密码,即使密码被截获也无法用于下一次配网。
| 参数 | 类型 | 说明 |
|---|---|---|
| CommissioningTimeout | uint16 | 窗口保持打开的秒数。超时后窗口自动关闭。范围通常为 60 ~ 900 秒 |
| PAKEPasscodeVerifier | octstr | 新的 PAKE 密码验证器(Verifier)。由 Commissioner 根据新的 passcode 计算生成 |
| Discriminator | uint16 | 12-bit 设备识别码,用于新 Commissioner 在发现阶段识别目标设备 |
| Iterations | uint32 | PBKDF2 迭代次数,范围 1000 ~ 100000 |
| Salt | octstr | PBKDF2 盐值,长度 16 ~ 32 字节 |
增强配网每次开窗都会生成新的 PAKE 验证器,旧密码完全失效。 这意味着即便有人嗅探到了本次配网过程中的 PASE 握手数据,也无法用于破解下一次配网。 相比之下,OpenBasicCommissioningWindow 使用设备出厂密码(通常印在设备标签上), 安全性较低但操作更方便。生产环境建议优先使用增强配网。
使用场景与注意事项
典型场景:用户在 App A 上已经配网了设备,现在希望 App B 也能控制这台设备。 App A 调用 OpenCommissioningWindow 开窗,提供一个临时的配网密码(以 QR Code 或数字代码的形式展示给用户)。 用户在 App B 中扫描该 QR Code 或输入数字代码即可完成二次配网。窗口会在超时后自动关闭。
注意:如果设备已经有一个活跃的配网窗口(WindowStatus 不为 0),再次调用会返回 Busy (2) 错误。 需要先调用 RevokeCommissioning 关闭现有窗口,或等待其超时。
OpenBasicCommissioningWindow —— 基础配网开窗(0x01)
开启基础配网窗口(Basic Commissioning Window)。与增强方式不同,基础配网使用设备的出厂 passcode (印在设备标签上的那个配对码)来建立 PASE 安全通道。操作简单,但安全性较低。
此命令需要设备支持 BC(Basic Commissioning) Feature。 可以通过读取 Feature Map 确认设备是否支持。不支持此 Feature 的设备只能通过 OpenCommissioningWindow(增强方式)开窗。
| 参数 | 类型 | 说明 |
|---|---|---|
| CommissioningTimeout | uint16 | 窗口保持打开的秒数。超时后窗口自动关闭 |
使用场景与注意事项
适用于家庭环境中快速添加第二个控制器的场景。比如用户已经用 Google Home 配网了灯泡, 现在想让 Apple Home 也能控制它。在 Google Home App 中打开基础配网窗口后, 直接用灯泡背面的配对码在 Apple Home 中配网即可。
由于使用固定的出厂 passcode,不推荐在安全要求较高的场景使用。 出厂密码可能被多次使用,如果曾被第三方获取,存在被恶意配网的风险。
RevokeCommissioning —— 关闭配网窗口(0x02)
关闭当前已开启的配网窗口。此命令没有参数。
调用成功后,设备立即停止接受新的配网请求,WindowStatus 恢复为 WindowNotOpen (0),
AdminFabricIndex 和 AdminVendorId 重置为 null。
只有在配网窗口已经打开的情况下才能调用。如果当前没有活跃的配网窗口(WindowStatus = 0), 会返回 WindowNotOpen (4) 错误。
使用场景与注意事项
主要用途:管理员开启了配网窗口后改变了主意,或者发现安全隐患需要立即关闭窗口。 比如在商业环境中,IT 管理员开窗给新同事配网,但新同事临时有事未到场, 管理员可以主动关闭窗口避免未授权访问。
自动化系统在检测到异常配网尝试时,也可以调用此命令作为安全响应措施。
属性详解
AdministratorCommissioning Cluster 共有 3 个属性,描述配网窗口的当前状态和操作者信息。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
WindowStatus | CommissioningWindowStatusEnum | 当前配网窗口的状态 |
0x0001 |
AdminFabricIndex | fabric-idx (nullable) | 开启窗口的管理员所在 Fabric 索引 |
0x0002 |
AdminVendorId | vendor-id (nullable) | 开启窗口的管理员供应商 ID |
窗口状态(0x0000)
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0000 |
WindowStatus 窗口状态 |
CommissioningWindowStatusEnum |
表示设备当前的配网窗口状态。
WindowNotOpen (0) 表示未开窗,设备不接受新的配网请求;
EnhancedWindowOpen (1) 表示增强配网窗口已打开;
BasicWindowOpen (2) 表示基础配网窗口已打开。
同一时间只能有一个窗口处于打开状态
|
在安全敏感的部署环境中,可以通过订阅 WindowStatus 属性变化来实时监控设备的配网窗口状态。
一旦检测到非预期的窗口开启(比如 BasicWindowOpen),
可以立即调用 RevokeCommissioning 关闭窗口并发送告警。
管理员信息(0x0001, 0x0002)
记录是谁开启了当前的配网窗口。窗口关闭或未开启时,这两个属性均为 null。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x0001 |
AdminFabricIndex 管理员 Fabric 索引 |
fabric-idx (nullable) |
开启配网窗口的管理员所在的 Fabric 索引。
可用于追溯哪个 Fabric 的管理员执行了开窗操作。
窗口未开启时为 null
|
0x0002 |
AdminVendorId 管理员供应商 ID |
vendor-id (nullable) |
开启配网窗口的管理员的供应商 ID(Vendor ID)。
标识是哪个厂商的 App 或控制器执行了开窗操作。
窗口未开启时为 null
|
AdminFabricIndex 和 AdminVendorId 配合使用,可以完整追溯「谁」在「什么身份」下开启了配网窗口。 这对安全审计非常有价值 —— 比如在企业环境中,发现设备被意外配网时, 可以通过这两个属性确认是哪个管理员、使用哪个平台执行了开窗操作。
枚举定义
CommissioningWindowStatusEnum
表示设备当前的配网窗口状态,用于 WindowStatus 属性。
Cluster 状态码(StatusCode)
AdministratorCommissioning 命令通过通用 Status 响应返回结果,除标准状态码外还定义了以下 Cluster 专属状态码:
OpenCommissioningWindow 返回 Busy → 已有配网窗口在开启状态,先调用 RevokeCommissioning 关闭再重试; OpenCommissioningWindow 返回 PAKEParameterError → 检查 PAKE 验证器的生成参数,确认 Iterations 和 Salt 在有效范围内; RevokeCommissioning 返回 WindowNotOpen → 窗口已超时自动关闭或从未开启,无需处理。
示例数据
属性数据示例(窗口未开启)
设备处于正常状态,没有活跃的配网窗口:
{
// --- 配网窗口状态 ---
"0x0000": 0, // WindowStatus = WindowNotOpen(当前未开启配网窗口)
// --- 管理员信息 ---
"0x0001": null, // AdminFabricIndex = null(无管理员开启窗口)
"0x0002": null // AdminVendorId = null(无管理员开启窗口)
}
属性数据示例(窗口已开启)
某管理员已通过增强方式开启了配网窗口:
{
// --- 配网窗口状态 ---
"0x0000": 1, // WindowStatus = EnhancedWindowOpen(增强配网窗口已开启)
// --- 管理员信息 ---
"0x0001": 1, // AdminFabricIndex = 1(Fabric 索引为 1 的管理员开启了窗口)
"0x0002": 4996 // AdminVendorId = 0x1384(开启窗口的管理员供应商 ID)
}
OpenCommissioningWindow 交互示例
使用增强配网方式开启配网窗口:
// Commissioner → Device:开启增强配网窗口
{
"invokeRequests": [{
"commandPath": {
"endpointId": 0,
"clusterId": "0x003C",
"commandId": "0x00" // OpenCommissioningWindow
},
"commandFields": {
"commissioningTimeout": 180, // 180 秒后自动关闭
"PAKEPasscodeVerifier": "base64...", // 新的 PAKE 验证器
"discriminator": 3840, // 12-bit 设备识别码
"iterations": 1000, // PBKDF2 迭代次数
"salt": "base64..." // PBKDF2 盐值
}
}]
}
// Device → Commissioner:成功开启(Status = SUCCESS)
// 此命令无专属响应结构体,通过通用 Status 返回结果
OpenBasicCommissioningWindow 交互示例
使用基础配网方式开启配网窗口(需要 BC Feature):
// Commissioner → Device:开启基础配网窗口
{
"invokeRequests": [{
"commandPath": {
"endpointId": 0,
"clusterId": "0x003C",
"commandId": "0x01" // OpenBasicCommissioningWindow
},
"commandFields": {
"commissioningTimeout": 180 // 180 秒后自动关闭
}
}]
}
// Device → Commissioner:成功开启(Status = SUCCESS)
RevokeCommissioning 交互示例
关闭当前已开启的配网窗口:
// Commissioner → Device:关闭配网窗口
{
"invokeRequests": [{
"commandPath": {
"endpointId": 0,
"clusterId": "0x003C",
"commandId": "0x02" // RevokeCommissioning
},
"commandFields": {} // 无参数
}]
}
// Device → Commissioner:成功关闭(Status = SUCCESS)
在实际开发中,Commissioner SDK 通常会封装 OpenCommissioningWindow 的调用,自动处理 PAKE 验证器的生成。 App 开发者通常只需要调用 SDK 提供的「多管理员配网」接口,SDK 会在底层完成 PAKE 参数计算和命令发送。 但理解底层原理有助于排查多管理员配网失败的问题。
常见场景
场景 1:添加第二个管理员(多平台共管)
背景:用户已经用 Google Home 配网了一盏智能灯,现在希望 Apple Home 也能控制它。
- 用户在 Google Home App 中找到这盏灯的设备详情页
- 点击「分享设备」或「添加到其他平台」
- Google Home 在底层调用
OpenCommissioningWindow (0x00), 生成新的 PAKE 验证器和临时 Discriminator - App 界面展示一个配网 QR Code(包含临时密码和 Discriminator)
- 用户打开 Apple Home,扫描该 QR Code
- Apple Home 使用临时密码建立 PASE 通道,完成配网
- 配网完成后窗口自动关闭,WindowStatus 恢复为
WindowNotOpen (0)
此时设备同时属于两个 Fabric(Google 和 Apple),可以被两个平台独立控制。
设备的 AdminFabricIndex 和 AdminVendorId 在窗口关闭后恢复为 null。
场景 2:恢复出厂设置的替代方案
背景:设备所属的 App 已卸载或 Fabric 信息丢失,但不想恢复出厂设置(会丢失所有配置)。
- 如果设备支持 BC Feature 且有物理按钮或其他本地触发方式:
- 通过长按设备按钮等方式触发本地开窗(某些设备支持)
- 设备进入基础配网窗口状态(BasicWindowOpen)
- 如果设备仍属于某个有效的 Fabric 且有另一个管理员:
- 用该管理员调用
OpenBasicCommissioningWindow (0x01) - 使用设备背面的出厂 passcode 重新配网
- 用该管理员调用
- 新的 Commissioner 完成配网后,设备加入新的 Fabric
- 可以通过 OperationalCredentials Cluster 移除旧的、不再需要的 Fabric
注意:如果设备所有 Fabric 的管理员都无法访问,且设备不支持本地开窗方式, 那么恢复出厂设置可能是唯一选择。这也是为什么建议至少配置两个管理员(Fabric)作为备份的原因。
场景 3:安全审计(检测异常配网窗口)
背景:企业 IoT 管理员需要确保办公室内的 Matter 设备没有被意外开窗。
- 定期轮询所有设备的
WindowStatus (0x0000)属性 - 如果发现某设备的 WindowStatus 不为
WindowNotOpen (0):- 读取
AdminFabricIndex (0x0001)确认是哪个 Fabric 的管理员开的窗 - 读取
AdminVendorId (0x0002)确认使用的是哪个平台
- 读取
- 如果这次开窗不在预期操作记录中:
- 立即调用
RevokeCommissioning (0x02)关闭窗口 - 记录审计日志:设备 ID、开窗时间、AdminFabricIndex、AdminVendorId
- 向安全团队发送告警
- 立即调用
- 更好的方案:订阅 WindowStatus 属性变化,实现实时检测而非轮询
在安全要求较高的环境中,建议完全禁用 BC Feature(不支持基础配网), 只允许增强配网方式开窗 —— 这样每次开窗都需要新的 PAKE 验证器,被恶意利用的风险更低。