管理员配网 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 字节
增强配网 vs 基础配网

增强配网每次开窗都会生成新的 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 Feature

此命令需要设备支持 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 属性。

0
WindowNotOpen 配网窗口未开启 —— 设备不接受新的配网请求(默认状态)
1
EnhancedWindowOpen 增强配网窗口已开启 —— 使用新的 PAKE 验证器,安全性更高
2
BasicWindowOpen 基础配网窗口已开启 —— 使用设备出厂密码,需要 BC Feature 支持

Cluster 状态码(StatusCode)

AdministratorCommissioning 命令通过通用 Status 响应返回结果,除标准状态码外还定义了以下 Cluster 专属状态码:

2
Busy 设备已有一个活跃的配网窗口。同一时间只能开启一个配网窗口,需先关闭现有窗口或等待其超时
3
PAKEParameterError PAKE 参数无效 —— PAKEPasscodeVerifier、Iterations 或 Salt 参数不合法(仅 OpenCommissioningWindow)
4
WindowNotOpen 当前没有活跃的配网窗口 —— 试图在无活跃窗口时调用 RevokeCommissioning
常见错误速查

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 也能控制它。

  1. 用户在 Google Home App 中找到这盏灯的设备详情页
  2. 点击「分享设备」或「添加到其他平台」
  3. Google Home 在底层调用 OpenCommissioningWindow (0x00), 生成新的 PAKE 验证器和临时 Discriminator
  4. App 界面展示一个配网 QR Code(包含临时密码和 Discriminator)
  5. 用户打开 Apple Home,扫描该 QR Code
  6. Apple Home 使用临时密码建立 PASE 通道,完成配网
  7. 配网完成后窗口自动关闭,WindowStatus 恢复为 WindowNotOpen (0)

此时设备同时属于两个 Fabric(Google 和 Apple),可以被两个平台独立控制。 设备的 AdminFabricIndex 和 AdminVendorId 在窗口关闭后恢复为 null。

场景 2:恢复出厂设置的替代方案

背景:设备所属的 App 已卸载或 Fabric 信息丢失,但不想恢复出厂设置(会丢失所有配置)。

  1. 如果设备支持 BC Feature 且有物理按钮或其他本地触发方式:
    • 通过长按设备按钮等方式触发本地开窗(某些设备支持)
    • 设备进入基础配网窗口状态(BasicWindowOpen)
  2. 如果设备仍属于某个有效的 Fabric 且有另一个管理员:
  3. 新的 Commissioner 完成配网后,设备加入新的 Fabric
  4. 可以通过 OperationalCredentials Cluster 移除旧的、不再需要的 Fabric

注意:如果设备所有 Fabric 的管理员都无法访问,且设备不支持本地开窗方式, 那么恢复出厂设置可能是唯一选择。这也是为什么建议至少配置两个管理员(Fabric)作为备份的原因。

场景 3:安全审计(检测异常配网窗口)

背景:企业 IoT 管理员需要确保办公室内的 Matter 设备没有被意外开窗。

  1. 定期轮询所有设备的 WindowStatus (0x0000) 属性
  2. 如果发现某设备的 WindowStatus 不为 WindowNotOpen (0):
    • 读取 AdminFabricIndex (0x0001) 确认是哪个 Fabric 的管理员开的窗
    • 读取 AdminVendorId (0x0002) 确认使用的是哪个平台
  3. 如果这次开窗不在预期操作记录中:
    • 立即调用 RevokeCommissioning (0x02) 关闭窗口
    • 记录审计日志:设备 ID、开窗时间、AdminFabricIndex、AdminVendorId
    • 向安全团队发送告警
  4. 更好的方案:订阅 WindowStatus 属性变化,实现实时检测而非轮询

在安全要求较高的环境中,建议完全禁用 BC Feature(不支持基础配网), 只允许增强配网方式开窗 —— 这样每次开窗都需要新的 PAKE 验证器,被恶意利用的风险更低。