网络配置 Cluster(NetworkCommissioning)
Cluster ID: 0x0031 |
所在 Endpoint: 通常在 Endpoint 0(Root Endpoint)
NetworkCommissioning 是 Matter 设备配网过程中最关键的 Cluster,负责管理设备的网络凭据 —— 包括 Wi-Fi 密码、Thread 网络参数或以太网配置。 Commissioner(手机 App)通过这个 Cluster 扫描设备周围的可用网络、写入网络凭据、指示设备连接到指定网络。
这个 Cluster 是配网流程的基础设施。几乎所有 Matter 设备(除了纯以太网设备)都需要通过它完成网络接入。 它不控制设备的业务功能,而是让设备「上网」—— 只有网络配置完成后,其他 Cluster 的远程操作才有意义。
Feature 特性(Feature Map)
NetworkCommissioning Cluster 通过 Feature Map 标识设备支持的网络接口类型。 一个设备必须且只能支持以下三种特性之一(互斥关系):
以太网设备的 NetworkCommissioning Cluster 只有只读属性,不支持任何命令(没有扫描、添加网络等操作)。 判断 Feature Map 是开发配网流程的第一步 —— 它决定了后续要调用哪些命令。
命令(Commands)
NetworkCommissioning 的命令分为两类:Client → Server(Commissioner 发给设备的请求)和 Server → Client(设备返回的响应)。配网操作是请求-响应模式,每个请求命令都有对应的响应命令。
Client → Server(请求命令)
| ID | 名称 | 说明 | 依赖 Feature |
|---|---|---|---|
0x00 |
ScanNetworks | 扫描周围可用网络 | WI 或 TH |
0x02 |
AddOrUpdateWiFiNetwork | 添加或更新 Wi-Fi 网络凭据 | WI |
0x03 |
AddOrUpdateThreadNetwork | 添加或更新 Thread 网络凭据 | TH |
0x04 |
RemoveNetwork | 删除已存储的网络凭据 | WI 或 TH |
0x06 |
ConnectNetwork | 指示设备连接到指定网络 | WI 或 TH |
0x08 |
ReorderNetwork | 调整网络优先级顺序 | WI 或 TH |
Server → Client(响应命令)
| ID | 名称 | 说明 | 对应请求 |
|---|---|---|---|
0x01 |
ScanNetworksResponse | 返回扫描结果列表 | ScanNetworks |
0x05 |
NetworkConfigResponse | 返回网络配置操作结果 | Add / Remove / Reorder |
0x07 |
ConnectNetworkResponse | 返回网络连接结果 | ConnectNetwork |
ScanNetworks —— 扫描网络(0x00)
指示设备扫描周围可用的 Wi-Fi 或 Thread 网络。这通常是配网流程的第一步 —— 让用户看到可以连接的网络列表。 设备会返回 ScanNetworksResponse。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| SSID | OctetString / Nullable | 否 | null = 扫描所有网络;指定值 = 只扫描匹配的 SSID(仅 Wi-Fi) |
| Breadcrumb | uint64 | 否 | 配网进度标记,Commissioner 用来追踪配网步骤是否按预期执行 |
使用场景与注意事项
Commissioner(App)发起扫描后,设备会在 ScanMaxTimeSeconds 时间内完成扫描并返回结果。扫描期间设备可能无法处理其他命令。Wi-Fi 设备返回 WiFiInterfaceScanResultStruct 列表,Thread 设备返回 ThreadInterfaceScanResultStruct 列表。
ScanNetworksResponse —— 扫描结果(0x01)
设备完成网络扫描后返回的响应,包含扫描到的网络列表。Wi-Fi 和 Thread 设备返回的结构体不同。
| 字段 | 类型 | 说明 |
|---|---|---|
| NetworkingStatus | NetworkCommissioningStatusEnum | 操作结果状态码 |
| DebugText | String | 可选的调试信息(如错误描述) |
| WiFiScanResults | WiFiInterfaceScanResultStruct[] | Wi-Fi 扫描结果列表(仅 WI feature) |
| ThreadScanResults | ThreadInterfaceScanResultStruct[] | Thread 扫描结果列表(仅 TH feature) |
AddOrUpdateWiFiNetwork —— 添加/更新 Wi-Fi 网络(0x02)
向设备写入 Wi-Fi 网络凭据(SSID + 密码)。如果设备已存储相同 SSID 的凭据,则更新密码;否则新增一条。 设备返回 NetworkConfigResponse。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| SSID | OctetString | 是 | 目标 Wi-Fi 网络的 SSID(最长 32 字节) |
| Credentials | OctetString | 是 | Wi-Fi 密码(最长 64 字节) |
| Breadcrumb | uint64 | 否 | 配网进度标记 |
| NetworkIdentity | OctetString | 否 | 网络身份标识(Matter 1.3+,用于 Per-Device Credentials) |
| ClientIdentifier | OctetString | 否 | 客户端标识(Matter 1.3+,用于 Per-Device Credentials) |
| PossessionNonce | OctetString | 否 | 持有者证明随机数(Matter 1.3+,用于 Per-Device Credentials) |
使用场景与注意事项
这是配网流程中写入 Wi-Fi 凭据的关键步骤。SSID 和密码都是 OctetString 类型(二进制),通常以 Base64 编码传输。注意:此命令只是存储凭据,不会立即连接 —— 需要后续发送 ConnectNetwork 才会真正连接。
AddOrUpdateThreadNetwork —— 添加/更新 Thread 网络(0x03)
向设备写入 Thread 网络凭据(Operational Dataset)。Thread 的凭据是一个完整的 Operational Dataset, 包含 PAN ID、Channel、Network Key 等信息。设备返回 NetworkConfigResponse。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| OperationalDataset | OctetString | 是 | Thread Operational Dataset(TLV 编码的完整网络参数) |
| Breadcrumb | uint64 | 否 | 配网进度标记 |
使用场景与注意事项
Thread 网络的凭据不是简单的 SSID + 密码,而是一个包含多种参数的二进制数据块(Operational Dataset)。Commissioner 通常从 Thread Border Router 获取这个 Dataset,然后写入设备。同样需要后续 ConnectNetwork 才会真正加入 Thread 网络。
RemoveNetwork —— 删除网络(0x04)
删除设备上已存储的网络凭据。通过 NetworkID 指定要删除的网络。设备返回 NetworkConfigResponse。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| NetworkID | OctetString | 是 | 要删除的网络 ID(Wi-Fi 为 SSID,Thread 为 Extended PAN ID) |
| Breadcrumb | uint64 | 否 | 配网进度标记 |
使用场景与注意事项
用于切换网络时先移除旧凭据,或者恢复出厂设置前清理网络配置。如果删除的是当前连接的网络,设备会断开连接。
NetworkConfigResponse —— 网络配置响应(0x05)
设备对 AddOrUpdateWiFiNetwork、AddOrUpdateThreadNetwork、RemoveNetwork、ReorderNetwork 命令的统一响应。
| 字段 | 类型 | 说明 |
|---|---|---|
| NetworkingStatus | NetworkCommissioningStatusEnum | 操作结果状态码 |
| DebugText | String | 可选的调试信息 |
| NetworkIndex | uint8 | 被操作的网络在列表中的索引位置 |
| ClientIdentity | OctetString | 客户端身份(Matter 1.3+,Per-Device Credentials 响应) |
| PossessionSignature | OctetString | 持有者证明签名(Matter 1.3+,Per-Device Credentials 响应) |
ConnectNetwork —— 连接网络(0x06)
指示设备连接到之前通过 AddOrUpdateWiFiNetwork / AddOrUpdateThreadNetwork 存储的网络。 这是配网流程中让设备「真正上网」的那一步。设备返回 ConnectNetworkResponse。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| NetworkID | OctetString | 是 | 要连接的网络 ID(必须是已存储的网络) |
| Breadcrumb | uint64 | 否 | 配网进度标记 |
使用场景与注意事项
发送 ConnectNetwork 后,设备会在 ConnectMaxTimeSeconds 时间内尝试连接。
重要:连接过程中,Commissioner 和设备之间的 BLE 或现有通信链路可能会中断(因为设备切换到了新网络)。
Commissioner 需要通过新网络重新发现并连接设备。
ConnectNetworkResponse —— 连接结果(0x07)
设备返回的网络连接结果。如果连接失败,ErrorValue 会包含平台层的错误码,有助于排查问题。
| 字段 | 类型 | 说明 |
|---|---|---|
| NetworkingStatus | NetworkCommissioningStatusEnum | 连接结果状态码 |
| DebugText | String | 可选的调试信息 |
| ErrorValue | int32 / Nullable | 平台层错误码。Wi-Fi 为 Status(802.11 定义),Thread 为 OperationalError(Thread 协议定义) |
ErrorValue 不是 Matter 定义的错误码,而是底层平台(Wi-Fi 芯片驱动或 Thread 协议栈)返回的原始错误码。
Wi-Fi 场景下常见的值包括:密码错误(认证失败)、信号太弱(超时)、DHCP 失败等。
需要结合具体芯片平台的文档来解读。
ReorderNetwork —— 调整网络优先级(0x08)
调整已存储网络的优先级顺序。设备在重启或网络切换时,会按优先级从高到低尝试连接。 设备返回 NetworkConfigResponse。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| NetworkID | OctetString | 是 | 要调整位置的网络 ID |
| NetworkIndex | uint8 | 是 | 目标位置索引(0 = 最高优先级) |
| Breadcrumb | uint64 | 否 | 配网进度标记 |
使用场景与注意事项
当设备存储了多个网络凭据时(MaxNetworks > 1),可以通过此命令调整连接优先级。大多数消费级设备 MaxNetworks 为 1,此命令较少使用。
属性详解
NetworkCommissioning Cluster 的属性描述了网络接口的能力和当前状态。点击下方汇总表中的属性 ID 可跳转到详细说明。
| ID | 名称 | 类型 | 分组 | 说明 |
|---|---|---|---|---|
0x00 |
MaxNetworks | uint8 | 网络容量 | 最大可存储网络数 |
0x01 |
Networks | list<NetworkInfoStruct> | 网络容量 | 已配置的网络列表 |
0x02 |
ScanMaxTimeSeconds | uint8 | 时间参数 | 扫描最大耗时(秒) |
0x03 |
ConnectMaxTimeSeconds | uint8 | 时间参数 | 连接最大耗时(秒) |
0x04 |
InterfaceEnabled | bool | 接口状态 | 网络接口是否启用 |
0x05 |
LastNetworkingStatus | enum8 / null | 接口状态 | 上次网络操作的结果状态 |
0x06 |
LastNetworkID | octstr / null | 接口状态 | 上次操作涉及的网络 ID |
0x07 |
LastConnectErrorValue | int32 / null | 接口状态 | 上次连接失败的平台层错误码 |
0x08 |
SupportedWiFiBands | list<WiFiBandEnum> | Wi-Fi 扩展 | 支持的 Wi-Fi 频段列表 |
0x09 |
SupportedThreadFeatures | bitmap16 | Thread 扩展 | 支持的 Thread 特性位图 |
0x0A |
ThreadVersion | uint16 | Thread 扩展 | Thread 协议版本 |
网络容量(0x00-0x01)
描述设备能存储多少个网络凭据,以及当前已配置了哪些网络。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x00 |
MaxNetworks 最大网络数 |
uint8 | 设备最多可存储的网络凭据数量。大多数消费级设备为 1 |
0x01 |
Networks 网络列表 |
list<NetworkInfoStruct> | 已配置的网络凭据列表。每项包含 NetworkID(Wi-Fi 的 SSID 或 Thread 的 Extended PAN ID)和连接状态 |
NetworkInfoStruct 结构体
| 字段 | 类型 | 说明 |
|---|---|---|
| NetworkID | OctetString (1-32 字节) | 网络标识。Wi-Fi 为 SSID,Thread 为 Extended PAN ID |
| Connected | bool | 是否当前已连接到此网络 |
| NetworkIdentifier | OctetString | 可选,网络身份标识(Matter 1.3+) |
| ClientIdentifier | OctetString | 可选,客户端标识(Matter 1.3+) |
Networks 列表不包含密码 —— 出于安全考虑,网络凭据一旦写入设备就无法读回。 你只能看到网络的 ID 和连接状态,无法获取密码原文。
时间参数(0x02-0x03)
定义扫描和连接操作的最大耗时,帮助 Commissioner 设置合理的超时等待。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x02 |
ScanMaxTimeSeconds 扫描超时 |
uint8 | 设备完成网络扫描的最大时间(秒)。Commissioner 应至少等待这么长时间再判定超时 |
0x03 |
ConnectMaxTimeSeconds 连接超时 |
uint8 | 设备完成网络连接的最大时间(秒)。包括 DHCP 获取 IP 的时间 |
实际开发中,App 端的超时时间应该设置为 ScanMaxTimeSeconds + 适当余量(如 +5 秒)。
Wi-Fi 设备的扫描通常在 10-30 秒内完成,Thread 设备可能更快。
连接超时一般在 30-120 秒,取决于网络环境和 DHCP 响应速度。
接口状态(0x04-0x07)
网络接口的启用状态和上次操作结果,是排查配网问题的核心信息。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x04 |
InterfaceEnabled 接口启用 |
bool | 网络接口是否启用。false 时设备不会连接任何网络,扫描和连接命令也可能被拒绝 |
0x05 |
LastNetworkingStatus 上次操作状态 |
NetworkCommissioningStatusEnum / null | 上次网络操作的结果状态码。null 表示尚未执行过任何网络操作 |
0x06 |
LastNetworkID 上次操作网络 |
OctetString / null | 上次网络操作涉及的网络 ID。配合 LastNetworkingStatus 可定位是哪个网络出了问题 |
0x07 |
LastConnectErrorValue 上次连接错误码 |
int32 / null | 上次 ConnectNetwork 失败时的平台层错误码。null 表示无错误或尚未执行过连接 |
配网失败时,优先读取这三个「Last*」属性:LastNetworkingStatus 告诉你大类原因(密码错误?网络找不到?),
LastNetworkID 确认是哪个网络,LastConnectErrorValue 给出底层的具体错误码。
三者配合使用,能快速定位绝大多数配网问题。
Wi-Fi 扩展(0x08)
Matter 1.3 新增的 Wi-Fi 相关属性,仅当 Feature Map 包含 WI 时存在。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x08 |
SupportedWiFiBands 支持的 Wi-Fi 频段 |
list<WiFiBandEnum> | 设备支持的 Wi-Fi 频段列表(如 2.4GHz、5GHz) |
Thread 扩展(0x09-0x0A)
Matter 1.3 新增的 Thread 相关属性,仅当 Feature Map 包含 TH 时存在。
| ID | 名称 | 类型 | 说明 |
|---|---|---|---|
0x09 |
SupportedThreadFeatures Thread 特性支持 |
bitmap16 | 设备支持的 Thread 协议特性位图 |
0x0A |
ThreadVersion Thread 版本 |
uint16 | 设备支持的 Thread 协议版本号 |
枚举与结构体
NetworkCommissioningStatusEnum
所有网络操作命令的响应都会包含这个状态码,用于表示操作结果。这是排查配网问题时最先看的字段。
密码错了 → 7 (AuthFailure);
网络名写错或路由器关了 → 5 (NetworkNotFound);
网络存满了 → 2 (BoundsExceeded);
设备不支持 5GHz → 扫描结果里就没有该网络,硬连可能得到 8 (UnsupportedSecurity) 或 9 (OtherConnectionFailure)。
WiFiBandEnum
标识 Wi-Fi 工作频段,用于扫描结果和 SupportedWiFiBands 属性。
WiFiSecurityBitmap
Wi-Fi 网络的安全类型位图,一个网络可以同时支持多种安全协议(多个 bit 为 1)。
扫描结果中 security = 12(二进制 01100)表示该网络同时支持 WPA2-PERSONAL(Bit 3)和 WPA-PERSONAL(Bit 2)。
值为 4(二进制 00100)表示只支持 WPA-PERSONAL。
WiFiInterfaceScanResultStruct
Wi-Fi 扫描结果中每个网络的详细信息。
| 字段 | 类型 | 说明 |
|---|---|---|
| Security | WiFiSecurityBitmap | 安全类型位图 |
| SSID | OctetString (0-32 字节) | 网络名称 |
| BSSID | OctetString (6 字节) | 接入点 MAC 地址 |
| Channel | uint16 | Wi-Fi 信道号 |
| WiFiBand | WiFiBandEnum | 工作频段(2.4G / 5G 等) |
| RSSI | int8 | 信号强度(dBm),值越大信号越好(通常 -30 极好,-70 一般,-90 很差) |
ThreadInterfaceScanResultStruct
Thread 扫描结果中每个网络的详细信息。
| 字段 | 类型 | 说明 |
|---|---|---|
| PanId | uint16 | Personal Area Network ID(PAN 标识) |
| ExtendedPanId | uint64 | Extended PAN ID(全局唯一网络标识) |
| NetworkName | String (1-16 字符) | Thread 网络名称 |
| Channel | uint16 | Thread 信道号 |
| Version | uint8 | Thread 协议版本 |
| ExtendedAddress | OctetString (8 字节) | 设备扩展 MAC 地址(IEEE EUI-64) |
| RSSI | int8 | 信号强度(dBm) |
| LQI | uint8 | Link Quality Indicator(链路质量指标,0-255,越大越好) |
标准示例
属性数据示例
以下是一个已配网的 Wi-Fi 设备的典型属性数据:
{
// --- 网络容量 ---
"0x00": 1, // MaxNetworks = 1(最多存 1 个网络凭据)
"0x01": [{ // Networks = 已配置的网络列表
"networkID": "TXlIb21lV2lGaQ==", // Base64 编码的 SSID
"connected": true // 当前已连接
}],
// --- 扫描与连接超时 ---
"0x02": 30, // ScanMaxTimeSeconds = 30 秒
"0x03": 60, // ConnectMaxTimeSeconds = 60 秒
// --- 接口状态 ---
"0x04": true, // InterfaceEnabled = true(网络接口已启用)
// --- 上次操作结果 ---
"0x05": 0, // LastNetworkingStatus = Success
"0x06": "TXlIb21lV2lGaQ==", // LastNetworkID(上次操作的网络 ID)
"0x07": null // LastConnectErrorValue = null(无错误)
}
扫描网络流程示例
Commissioner 发起 Wi-Fi 扫描并获取结果:
// Commissioner → Device:扫描 Wi-Fi 网络
{
"invokeRequests": [{
"commandPath": {
"endpointId": 0,
"clusterId": "0x0031",
"commandId": "0x00" // ScanNetworks
},
"commandFields": {
"ssid": null, // null = 扫描所有网络
"breadcrumb": 1 // 配网进度标记
}
}]
}
// Device → Commissioner:返回扫描结果
{
"networkingStatus": 0, // Success
"wiFiScanResults": [
{
"security": 4, // WPA2-Personal
"ssid": "MyHomeWiFi",
"bssid": "AA:BB:CC:DD:EE:FF",
"channel": 6,
"wiFiBand": 0, // 2.4GHz
"rssi": -45
},
{
"security": 8, // WPA3-Personal
"ssid": "Office5G",
"bssid": "11:22:33:44:55:66",
"channel": 36,
"wiFiBand": 1, // 5GHz
"rssi": -62
}
]
}
添加 Wi-Fi 网络示例
向设备写入 Wi-Fi 凭据:
// 添加 Wi-Fi 网络凭据
{
"invokeRequests": [{
"commandPath": {
"endpointId": 0,
"clusterId": "0x0031",
"commandId": "0x02" // AddOrUpdateWiFiNetwork
},
"commandFields": {
"ssid": "TXlIb21lV2lGaQ==", // "MyHomeWiFi" 的 Base64
"credentials": "cGFzc3dvcmQ=", // 密码的 Base64
"breadcrumb": 2
}
}]
}
// 设备回复 NetworkConfigResponse
{
"networkingStatus": 0, // Success
"networkIndex": 0 // 存储在索引 0
}
SSID 和密码在 Matter 协议中都是 OctetString(字节数组),传输时通常使用 Base64 编码。
上面示例中的 "TXlIb21lV2lGaQ==" 解码后就是 "MyHomeWiFi"。
常见场景
场景 1:Wi-Fi 设备配网完整流程
- Commissioner 通过 BLE 与设备建立 PASE 安全通道
- 读取
FeatureMap确认是 Wi-Fi 设备(Bit 0 = 1) - 读取
ScanMaxTimeSeconds (0x02)获取扫描超时 - 发送
ScanNetworks (0x00),SSID 传null扫描所有网络 - 收到
ScanNetworksResponse (0x01),展示 Wi-Fi 列表给用户 - 用户选择网络并输入密码
- 发送
AddOrUpdateWiFiNetwork (0x02)写入 SSID + 密码 - 收到
NetworkConfigResponse (0x05),确认NetworkingStatus = 0 (Success) - 发送
ConnectNetwork (0x06)指示设备连接 - 设备连接 Wi-Fi,通过
ConnectNetworkResponse (0x07)返回结果 - Commissioner 通过 Wi-Fi 网络重新发现设备,继续后续配网步骤(NOC 证书安装等)
场景 2:Thread 设备配网
- Commissioner 通过 BLE 与设备建立 PASE 安全通道
- 读取
FeatureMap确认是 Thread 设备(Bit 1 = 1) - Commissioner 从 Thread Border Router 获取 Operational Dataset
- 发送
AddOrUpdateThreadNetwork (0x03)写入 Dataset - 发送
ConnectNetwork (0x06)指示设备加入 Thread 网络 - 设备加入 Thread 网络后,Commissioner 通过 Thread 网络继续配网
注意:Thread 配网通常不需要先扫描,因为 Dataset 已经包含了目标网络的全部参数。
场景 3:配网失败排查
- 读取
LastNetworkingStatus (0x05)查看错误类型 - 读取
LastNetworkID (0x06)确认是哪个网络 - 读取
LastConnectErrorValue (0x07)获取平台层错误码
常见问题对照:
- Status = 7 (AuthFailure):密码错误,让用户重新输入
- Status = 5 (NetworkNotFound):网络不在范围内,检查路由器是否开启、信号是否太弱
- Status = 10 (IPV6Failed):路由器可能不支持 IPv6,检查路由器设置
- Status = 8 (UnsupportedSecurity):设备不支持目标网络的加密方式,检查 SupportedWiFiBands 和扫描结果
场景 4:切换 Wi-Fi 网络
- 读取
Networks (0x01)查看当前已存储的网络 - 读取
MaxNetworks (0x00),如果只能存 1 个,需要先删除旧网络 - 发送
RemoveNetwork (0x04)删除旧凭据 - 按照场景 1 的流程添加并连接新网络
注意:删除当前连接的网络会导致设备断网。如果 MaxNetworks > 1,可以先添加新网络再删除旧网络,减少断网时间。