Matter设备如何共享

1,996 阅读5分钟

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 调试的可能事件序列:

  1. 当前管理员将节点置于“打开基本调试窗口”中指定的时间窗口,并在“打开基本调试窗口”命令中接收来自节点的成功响应。
  2. 当目标节点是 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 的第一位管理员的能力:

  1. 如果支持用户界面显示,则临时载入有效负载应使用手动配对代码的文本表示形式显示,并使用 11 位码。

  2. 如果支持用户界面显示,则临时载入有效负载也应使用第 5.1.3 节 “QR 码”中包含的定义显示。

    1. 如果只有一个节点受到 ECM 的影响,则载入有效负载中的供应商 ID 和产品 ID 应与该节点的供应商 ID 和产品 ID 相同。
    2. 如果多个节点使用相同的载入有效负载进行 ECM,则供应商 ID 应设置为 0x0000(Matter 标准),产品 ID 应设置为 0x0000(与用于在设备公告中不宣传产品 ID 的值一致)。
    3. 发现功能掩码 Discovery Capabilities Mask 应仅设置位 2,以指示节点只能在 IP 网络上发现。
  3. 远程用户界面(包括视觉和音频)在一组可接受的载入信息传达机制中明确允许,例如特定于制造商的移动应用程序或 Web UI。

  4. 如果仅支持音频输出,则应使用手动配对代码格式的语音提示来传递临时载入有效负载。应该有一种方法可供用户重复配对代码。

此方法允许当前管理员设置多个节点,以便通过打开“打开调试窗口”并将 PAKE passcode 验证器发送到一系列节点,与具有适当调试窗口的新管理员一起进行调试。新管理员使用手动配对代码中的信息来发现处于调试模式的节点,并使用新密码进行调试。

以下步骤描述了 ECM 调试的可能事件序列:

  1. 当前管理员使用新的设置密码将节点置于指定时间窗口的调试模式,并在“打开调试窗口”命令上接收相关节点的成功响应。
  2. 当一个或多个 SED 位于目标节点中时,当前管理员可以指导用户执行一些操作以将这些设备从睡眠周期中“唤醒”。
  3. 当前管理员如上所述显示载入有效负载。

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]);
        }