网络配置 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 标识设备支持的网络接口类型。 一个设备必须且只能支持以下三种特性之一(互斥关系):

Bit 0
WI — WiFiNetworkInterface 设备支持 Wi-Fi 网络接口,可扫描 Wi-Fi 网络并存储 SSID + 密码
Bit 1
TH — ThreadNetworkInterface 设备支持 Thread 网络接口,可扫描 Thread 网络并存储 Operational Dataset
Bit 2
ET — EthernetNetworkInterface 设备使用以太网连接,无需扫描或配置凭据(即插即用)
开发提示

以太网设备的 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 的实际含义

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

所有网络操作命令的响应都会包含这个状态码,用于表示操作结果。这是排查配网问题时最先看的字段。

0
Success 操作成功
1
OutOfRange 值超出有效范围
2
BoundsExceeded 已达网络存储上限(MaxNetworks)
3
NetworkIDNotFound 指定的网络 ID 在已存储列表中找不到
4
DuplicateNetworkID 网络 ID 重复(已存在相同 ID)
5
NetworkNotFound 扫描或连接时找不到目标网络(不在空中)
6
RegulatoryError 因法规限制无法使用该网络(如频段在当前国家/地区不合规)
7
AuthFailure 认证失败(通常是 Wi-Fi 密码错误)
8
UnsupportedSecurity 不支持目标网络的安全协议(如设备不支持 WPA3)
9
OtherConnectionFailure 其他连接失败(不属于以上任何类别)
10
IPV6Failed IPv6 地址获取失败
11
IPBindFailed IP 地址绑定失败
12
UnknownError 未知错误
常见错误速查

密码错了 → 7 (AuthFailure); 网络名写错或路由器关了 → 5 (NetworkNotFound); 网络存满了 → 2 (BoundsExceeded); 设备不支持 5GHz → 扫描结果里就没有该网络,硬连可能得到 8 (UnsupportedSecurity) 或 9 (OtherConnectionFailure)。

WiFiBandEnum

标识 Wi-Fi 工作频段,用于扫描结果和 SupportedWiFiBands 属性。

0
2G4 2.4 GHz 频段(802.11b/g/n)
1
3G65 3.65 GHz 频段
2
5G 5 GHz 频段(802.11a/n/ac)
3
6G 6 GHz 频段(802.11ax / Wi-Fi 6E)
4
60G 60 GHz 频段(802.11ad / WiGig)
5
1G Sub-1 GHz 频段(802.11ah / Wi-Fi HaLow)

WiFiSecurityBitmap

Wi-Fi 网络的安全类型位图,一个网络可以同时支持多种安全协议(多个 bit 为 1)。

Bit 0
Unencrypted 开放网络,无加密
Bit 1
WEP WEP 加密(已不安全,逐步淘汰)
Bit 2
WPA-PERSONAL WPA 个人版(PSK)
Bit 3
WPA2-PERSONAL WPA2 个人版(PSK),目前最常见
Bit 4
WPA3-PERSONAL WPA3 个人版(SAE),更安全的新标准
位图读取示例

扫描结果中 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 设备配网完整流程
  1. Commissioner 通过 BLE 与设备建立 PASE 安全通道
  2. 读取 FeatureMap 确认是 Wi-Fi 设备(Bit 0 = 1)
  3. 读取 ScanMaxTimeSeconds (0x02) 获取扫描超时
  4. 发送 ScanNetworks (0x00),SSID 传 null 扫描所有网络
  5. 收到 ScanNetworksResponse (0x01),展示 Wi-Fi 列表给用户
  6. 用户选择网络并输入密码
  7. 发送 AddOrUpdateWiFiNetwork (0x02) 写入 SSID + 密码
  8. 收到 NetworkConfigResponse (0x05),确认 NetworkingStatus = 0 (Success)
  9. 发送 ConnectNetwork (0x06) 指示设备连接
  10. 设备连接 Wi-Fi,通过 ConnectNetworkResponse (0x07) 返回结果
  11. Commissioner 通过 Wi-Fi 网络重新发现设备,继续后续配网步骤(NOC 证书安装等)
场景 2:Thread 设备配网
  1. Commissioner 通过 BLE 与设备建立 PASE 安全通道
  2. 读取 FeatureMap 确认是 Thread 设备(Bit 1 = 1)
  3. Commissioner 从 Thread Border Router 获取 Operational Dataset
  4. 发送 AddOrUpdateThreadNetwork (0x03) 写入 Dataset
  5. 发送 ConnectNetwork (0x06) 指示设备加入 Thread 网络
  6. 设备加入 Thread 网络后,Commissioner 通过 Thread 网络继续配网

注意:Thread 配网通常不需要先扫描,因为 Dataset 已经包含了目标网络的全部参数。

场景 3:配网失败排查
  1. 读取 LastNetworkingStatus (0x05) 查看错误类型
  2. 读取 LastNetworkID (0x06) 确认是哪个网络
  3. 读取 LastConnectErrorValue (0x07) 获取平台层错误码

常见问题对照:

  • Status = 7 (AuthFailure):密码错误,让用户重新输入
  • Status = 5 (NetworkNotFound):网络不在范围内,检查路由器是否开启、信号是否太弱
  • Status = 10 (IPV6Failed):路由器可能不支持 IPv6,检查路由器设置
  • Status = 8 (UnsupportedSecurity):设备不支持目标网络的加密方式,检查 SupportedWiFiBands 和扫描结果
场景 4:切换 Wi-Fi 网络
  1. 读取 Networks (0x01) 查看当前已存储的网络
  2. 读取 MaxNetworks (0x00),如果只能存 1 个,需要先删除旧网络
  3. 发送 RemoveNetwork (0x04) 删除旧凭据
  4. 按照场景 1 的流程添加并连接新网络

注意:删除当前连接的网络会导致设备断网。如果 MaxNetworks > 1,可以先添加新网络再删除旧网络,减少断网时间。