Matter 中的调试(commissioning)是将设备连接到fabric(操作网络)的过程。
调试设备角色
该过程在以下设备之间进行:
- Commissioner,即执行调试的 Matter 控制器。
- Commissionee,这是要添加到结构中的 Matter 附件设备。
调试的前提条件
要开始调试过程,控制器必须从 Matter 附件设备获取 onboarding information。 其中包括以下信息:
- 16-bit Vendor ID and 16-bit Product ID
- 12-bit device discriminator
- 27-bit setup passcode
- 8-bit Discovery Capabilities Bitmask
Onboarding information formats
数据有效负载可以通过以下方式之一进行编码,这些方式可以包含在设备上,也可以包含在最终产品的包装中(或两者兼而有之):
- 手动配对代码,它以数字序列的形式提供入职信息,可供大多数 Matter commissioners使用。
- 二维码,您可以使用适合您生态系统的移动应用程序进行扫描。
必须始终支持手动配对码,而建议使用QR码。 不同的生态系统也可以定义自己的方法来提供鉴别器和设置密码。
Commissioning 流程
Device discovery
要调试的设备需要让commissioner知道它们的存在,即宣传它们的存在。 这可以通过以下方法实现:
- 蓝牙® LE - 此方法尤其适用于将节点添加到其第一个 Matter fabric。
- DNS-SD - 如果节点已连接到以太网或已是 Wi-Fi 或 Thread 网络的成员,则通常使用此方法。
- Wi-Fi 接入点 - 此方法将使用 Wi-Fi Soft-AP 功能,并将用于尚未成为任何网络成员的设备。
优先级在Discovery Capabilities Bitmask中定义。
Connect to device (PASE)
一旦Commissioner发现并匹配鉴别器(Discriminator),Commissioner使用载入有效载荷的密码来 执行密码身份验证会话建立 (PASE) 以连接到设备。这是以下方法 安全地建立两个设备都能够用来建立的密钥通信。在这一步,Commissioner还配备了故障保险装置。故障保护(fail-safe)提供了一种在调试时将设备回滚到其原始状态的方法 未成功完成。
Passcode-Authenticated Session Establishment (PASE) 使用 PASE 时,两个节点以 8 位密码的形式共享相同的密钥。SPAKE2+ 算法使用共享密钥来确保通过非安全通道安全交换密钥。此过程在调试设备时进行。
Get Commissionee information
Commissioner获取Commissionee的所有描述。这 “DescriptorCluster”位于设备的endpoint 0 上,并描述所有其他端点。Commissioner还读取了基本信息组,其中包括 供应商 ID、产品 ID、产品名称和序列号等信息。 在此步骤中,Commissioner还读取了Commissionee的设备类型。
Commissionee attestation
Commissionee证明程序的目标是确定 设备已通过认证,是正品 Matter 设备。 Commissioner提取设备认证证书 (DAC) 和 Commissionee的产品认证中级 (PAI) 证书。 这些证书包含供应商 ID、产品 ID 和证明公用 钥匙。收到证书后,Commissioner会提出质疑 应由证明私钥签名的请求,并使用它来 确定被委托人的真实性。
Certificate Signing Request (CSR) 证书签名请求
Commissioner向Commissionee发送证书签名请求 (CSR)。 Commissionee创建一个唯一的操作密钥对,该密钥对将在证书身份验证会话建立(CASE)后。Commissionee将生成的 CSR 信息返回给 Commissioner。
Add Node Operational Certificate (NOC) 添加节点操作证书 (NOC)
Commissioner使用从被Commissionee那里收到的CSR 信息,以及 将其传递给Administrative Domain Manager (ADM) 以生成受信任的 节点操作证书 (NOC)。Commissioner安装 Root 使用“AddTrustedRootCertReq”命令的受委托人证书和 然后使用“AddNOC”命令安装节点操作证书。
Network provisioning
Commissioner在Commissionee上配置操作网络。这 Thread 或 Wi-Fi 设备需要 step。这一步是 对于设备已连接到的以太网设备,不需要 网络。它使用“ScanNetworks”、“AddOrUpdateWifiNetwork”和“ConnectNetwork” 命令。
Operational discovery
一旦新委托的节点连接到网络,Commissioner 使用 Operational discovery 以查找操作网络上的节点。操作发现是 在运营网络上找到委托节点的过程 使用 DNS-SD。如果Commissionee是 Wi-Fi 设备,它将使用 mDNS 来 发现设备。Operational discovery可帮助Commissioner和网络中的其他节点了解 Commissionee正在使用的 IP 地址和端口。
CASE session establishment
一旦发现新委托的节点,一个 CASE会议由Commissioner和 设备。本次会议由Commissioner发起,并由以下fabric回应设备。在此步骤中,将交换操作证书并共享 信任是通过验证它们是否位于同一逻辑结构中来建立的。
Certificate-Authenticated Session Establishment (CASE) 使用 CASE 时,两个节点都拥有链接回同一信任根的节点操作证书。SIGMA 算法使用 NOC 来确保相互节点身份验证和通过非安全通道安全交换密钥。此过程在已调试的节点之间建立安全通信时进行。
信任根是 Matter 中的一个概念,它以证书颁发机构 (CA) 为中心,由根公钥 (Root PK) 标识。CA 是负责颁发和分配节点操作证书 (NOC) 或中间证书颁发机构证书 (ICAC) 的设备。NOC 在commissioner的 Matter 网络调试期间与受信任的根 CA 证书一起安装。
Commissioning complete
Commissioner使用 CASE 发送 “CommissioningComplete”命令添加到新调试的设备。这是 调试过程的最后一步。自动撤防故障安全定时器。调试成功后,设备将像操作网络上的任何其他节点一样运行。
已加入 Matter 结构的设备将配置以下信息:
- 新实例名称,使用fabric ID 和node ID(由commissioner分配)构造
- 已加入的 Matter 结构的新节点操作证书
- NOC 的新私钥
- 新的访问控制列表 (
Access Control List) - 有关operational network的信息
iOS 流程代码
// matter support -> onboardingPayload
let topology = MatterAddDeviceRequest.Topology(ecosystemName: matterEcosystemName, homes: [MatterAddDeviceRequest.Home(displayName: groupName)])
var setupRequest = MatterAddDeviceRequest(topology: topology, setupPayload: nil)
try await setupRequest.perform()
// init Commissioning Controller
let factory = MTRDeviceControllerFactory.sharedInstance()
let factoryParams = MTRDeviceControllerFactoryParams(storage: storage)
try factory.start(factoryParams)
let params = MTRDeviceControllerStartupParams(ipk: finalIPK,
operationalKeypair: keys,
operationalCertificate: nocDerBytes,
intermediateCertificate: nil,
rootCertificate: rootCADerBytes)
params.vendorID = NSNumber(value: matterVendorId)
params.operationalCertificateIssuer = self
params.operationalCertificateIssuerQueue = self.matterQueue
// set MTRDeviceControllerDelegate
if let controller = try? factory.createController(onNewFabric: params) {
controller.setDeviceControllerDelegate(self, queue: self.matterQueue)
} else if let controller = try? factory.createController(onExistingFabric: params) {
controller.setDeviceControllerDelegate(self, queue: self.matterQueue)
}
// setup Commissioning Session
// Set up a commissioning session for a device,
// using the provided discovered result to connect to it.
let payload = try? MTRSetupPayload(onboardingPayload: onboardingPayload)
try controller.setupCommissioningSession(with: payload,
newNodeID: NSNumber(value: deviceId))
// MTRDeviceControllerDelegate
func controller(_ : MTRDeviceController, commissioningSessionEstablishmentDone error: Error?) {
let params = MTRCommissioningParameters()
params.deviceAttestationDelegate = self // MTRDeviceAttestationDelegate
// params.wifiSSID = ssid
// params.wifiCredentials = password
// params.failSafeExpiryTimeoutSecs = @600;
try controller.commissionNode(withID: NSNumber(value: deviceId),
commissioningParams: params)
}
func controller(_ controller: MTRDeviceController, commissioningComplete error: Error?) {
// 获取device node信息保存备用
if let device = try? controller.getDeviceBeingCommissioned(deviceId) {
// do somethings...
return
}
let device = MTRBaseDevice(nodeID: NSNumber(value: deviceId), controller: controller)
// do somethings...
}