Administrator Assisted Commissioning Flows
在 Administrator Assisted Commissioning Flows中,节点的当前管理员首先通过 CASE会话向节点发送 Open Commissioning Window(打开调试窗口)命令。新管理员必须已经具有网络连接,并基于下面描述的两个流程完成调试。
Basic Commissioning Method (BCM)
此方法是节点和管理员/专员要实现的可选方法。在此方法中,当前管理员必须通过 CASE会话向节点发送 Open Basic Commissioning Window(打开基本调试窗口)命令。节点在收到 Open Basic Commissioning Window(打开基本调试窗口)命令后,应通过 DNS-SD 通告其存在(Section 5.4.2.7, “Using Existing IP-bearing Network” and Commissionable Node Discovery)。
新的管理员专员使用与新设备类似的调试流程完成节点的调试(使用IP 通道用于发现)。它可以扫描 QR 码格式,也可以使用节点的Onboarding Payload的手动配对代码格式。
以下步骤描述了 BCM 调试的可能事件序列:
- 当前管理员将节点置于“打开基本调试窗口”中指定的时间窗口,并在“打开基本调试窗口”命令中接收来自节点的成功响应。
- 当目标节点是 SED 时,当前管理员可以指导用户执行一些操作以将设备从睡眠周期中“唤醒”。
Enhanced Commissioning Method (ECM)
此方法是节点和专员/管理员必须实施的。使用 ECM 时,节点的当前管理员通过 CASE会话指示节点进入 Open Commissioning Window。它应选择一个新的passcode,并应计算并将相应的 PAKE passcode 验证器发送到节点。密码的实际值不得发送到节点。然后,当前管理员如下所述提供新的密码和鉴别器。节点在收到 Open Commissioning Window(打开调试窗口)命令后,应通过 DNS-SD 通告其存在。
Presentation of Onboarding Payload for ECM
密码和其他相关信息的出示应至少使用以下一种或多种方法完成,具体取决于打开 OCW 的第一位管理员的能力:
-
如果支持用户界面显示,则临时载入有效负载应使用手动配对代码的文本表示形式显示,并使用 11 位码。
-
如果支持用户界面显示,则临时载入有效负载也应使用第 5.1.3 节 “QR 码”中包含的定义显示。
- 如果只有一个节点受到 ECM 的影响,则载入有效负载中的供应商 ID 和产品 ID 应与该节点的供应商 ID 和产品 ID 相同。
- 如果多个节点使用相同的载入有效负载进行 ECM,则供应商 ID 应设置为 0x0000(Matter 标准),产品 ID 应设置为 0x0000(与用于在设备公告中不宣传产品 ID 的值一致)。
- 发现功能掩码 Discovery Capabilities Mask 应仅设置位 2,以指示节点只能在 IP 网络上发现。
-
远程用户界面(包括视觉和音频)在一组可接受的载入信息传达机制中明确允许,例如特定于制造商的移动应用程序或 Web UI。
-
如果仅支持音频输出,则应使用手动配对代码格式的语音提示来传递临时载入有效负载。应该有一种方法可供用户重复配对代码。
此方法允许当前管理员设置多个节点,以便通过打开“打开调试窗口”并将 PAKE passcode 验证器发送到一系列节点,与具有适当调试窗口的新管理员一起进行调试。新管理员使用手动配对代码中的信息来发现处于调试模式的节点,并使用新密码进行调试。
以下步骤描述了 ECM 调试的可能事件序列:
- 当前管理员使用新的设置密码将节点置于指定时间窗口的调试模式,并在“打开调试窗口”命令上接收相关节点的成功响应。
- 当一个或多个 SED 位于目标节点中时,当前管理员可以指导用户执行一些操作以将这些设备从睡眠周期中“唤醒”。
- 当前管理员如上所述显示载入有效负载。
PAKE Passcode Verifier
此字段由现有管理员计算的用于此调试的临时 PAKE 密码验证器(Section 3.10, “Password-Authenticated Key Exchange (PAKE)”) 。该字段是两个值 (w0 ||L) 应为 (CRYPTO_GROUP_SIZE_BYTES +CRYPTO_PUBLIC_KEY_SIZE_BYTES)-八位字节,如Crypto_PAKEValues_Responder中详述。它应源自临时密码(参见 PAKE)。在 OCW 调试结束时或到期时,节点应将其删除,并在将其发送到节点后由现有管理员删除。
Open Commissioning Window
以下序列图显示了当前管理员为启用“打开调试窗口”而采取的步骤。
iOS 验证代码
// iterations: An integer value specifying the number of PBKDF2 iterations: CRYPTO_PBKDF_ITERATIONS_MIN <= iterations <= CRYPTO_PBKDF_ITERATIONS_MAX.
// salt: A random value per device of at least 16 bytes and at most 32 bytes used as the PBKDF2 salt.
// 加盐数据,示例
NSString *saltString = @"Y8T4twDbVKTkppiUS5lpH8xi9qX8HTjkE1yMSL7uwhA=";
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:saltString options:0];
NSInteger passCode = [[MTRSetupPayload generateRandomSetupPasscode] integerValue];
// This protocol uses password-authenticated key exchange (PAKE) for the PASE protocol.
// 计算获取 PAKE Passcode Verifier
NSData *paseVerifier = [controller computePaseVerifier:passCode
iterations:15000
salt:decodedData];
NSLog(@"paseVerifier: %@", paseVerifier);
MTRBaseClusterAdministratorCommissioning *commissioningWindowCluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:dispatch_get_main_queue()];
MTRAdministratorCommissioningClusterOpenCommissioningWindowParams *params = [[MTRAdministratorCommissioningClusterOpenCommissioningWindowParams alloc] init];
params.pakePasscodeVerifier = paseVerifier;
params.salt = decodedData;
params.discriminator = @(3840);
params.iterations = @(15000);
params.commissioningTimeout = @(300);
params.timedInvokeTimeoutMs = @(60000);
[commissioningWindowCluster openCommissioningWindowWithParams:params completionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"commissioningWindowCluster OCW: %@", error);
} else {
// 根据之前生成的随机passcode 和 鉴别器 (3840)获取11位码展示
MTRSetupPayload *payload = [[MTRSetupPayload alloc] initWithSetupPasscode:@(passCode)
discriminator:@(3840)];
// 也可以生成QRCode
// [payload qrCodeString: &error]
NSLog(@"manualEntryCode OCW: %@", [payload manualEntryCode]);
}