86Box Matter 开关

现在 86box 项目直接包含 Matter 相关库,我们提供了一套支持11个端点的相关库。 如果您想为 86box 构建 Matter 库,您必须按照以下步骤进行。

构建和使用 86box 库

  1. 准备 Matter

  2. 修改zap文件

文件位于:./subsys/matter/connectedhomeip/examples/light-switch-app/Realtek/common/chip_main.cmake

chip_configure_data_model(chip_main
INCLUDE_SERVER
ZAP_FILE ${matter_example_path}/../data_model/light-switch-app-1_to_11.zap
  1. 禁用DLPS

86box不支持DLPS,因此在构建库时禁用DLPS。

文件位于:./subsys/matter/CMakePresets.json

"ENABLE_DLPS": "OFF"
  1. 构建命令如下所示

./build.py evb light-switch
  1. 构建完成后,在以下位置找到库文件

./subsys/matter/samples/build

  1. 将这些库复制到 subsys/matter/lib/switch。它们将被链接到 86box 应用程序图像。

灯泡- OTBR - 86box 开关用户场景

RTL87X2G-Bcut-SDK-MATTER 主要在 86box 上提供 matter 开关功能。

../../../../_images/light_bulb-OTBR-86box_switch_scene.png

如果您想设置一个完整的开关控制 Matter 灯泡的环境,您需要购买以下设备:

  1. Matter 照明设备

请自行购买或构建照明设备

  1. OTBR

目前,Google Nest Home、亚马逊Echo4(已测试)和 Apple Homepod 都支持 OTBR 。您可以使用它们的APP通过开关控制灯泡。

您也可以使用我们提供的 RTL8771HTV 进行操作,在这种情况下,您需要:

  1. 通过购买的 Raspberry Pi 和 RTL8771HTV 设置 OTBR 。

  2. 使用 ubuntu 上的 chiptool 完成绑定。

使用 86box 开关控制灯泡

构建 86box 开关

用户需要首先在 menu_config.h 中启用宏 "CONFIG_REALTEK_BUILD_MATTER_SWITCH" 。然后运行命令 "scons matter=1" 。编译完成后,App 将生成在默认项目路径中。

请参考 86box

开关端点使用

用户需要准备8个灯(也可以使用2个灯)和1个 86box 开关。开关上的每个端点都对应一个灯光开关的使用。

要确定 86box 开关对应灯光的端点,用户需要遵循两个步骤:

  1. 以下命令返回端点号为1。

./chip-tool descriptor read parts-list <node_id> 0
CHIP:TOO: 端点:0 集群:0x0000_001D 属性 0x0000_0003 数据版本:618585211
[1714376633.690399][622920:622922] CHIP:TOO:   PartsList: 1 entries
[1714376633.690405][622920:622922] CHIP:TOO:     [1]: 1
  1. 获取条目时,用户可以逐个读取所有端点的设备类型。端点从1开始。269表示它是一个扩展彩灯。因此,86box 应该通过端点1控制灯光。

./chip-tool descriptor read device-type-list <node_id> <endpoint>
CHIP:TOO: Endpoint: 1 Cluster: 0x0000_001D Attribute 0x0000_0000 DataVersion: 2886212486
CHIP:TOO:   DeviceTypeList: 1 entries
CHIP:TOO:     [1]: {
CHIP:TOO:       DeviceType: 269
CHIP:TOO:       Revision: 1
CHIP:TOO:      }

所有设备的调试

请按照 openthread指南 来形成线程网络。用户可以按照以下步骤将8个灯(节点ID 1-8)和 86box(节点ID 9)开关添加到线程网络的一个结构中。可以通过"sudo ot-ctl dataset active -x"获取OperationalDataset。可以通过扫描灯具表面的二维码获得Pin_code和discriminator。

Lighting1: ./chip-tool pairing ble-thread 1 hex:<operationalDataset> <pin_code> <discriminator>
Lighting2: ./chip-tool pairing ble-thread 2 hex:<operationalDataset> <pin_code> <discriminator>
Lighting3: ./chip-tool pairing ble-thread 3 hex:<operationalDataset> <pin_code> <discriminator>
Lighting4: ./chip-tool pairing ble-thread 4 hex:<operationalDataset> <pin_code> <discriminator>
Lighting5: ./chip-tool pairing ble-thread 5 hex:<operationalDataset> <pin_code> <discriminator>
Lighting6: ./chip-tool pairing ble-thread 6 hex:<operationalDataset> <pin_code> <discriminator>
Lighting7: ./chip-tool pairing ble-thread 7 hex:<operationalDataset> <pin_code> <discriminator>
Lighting8: ./chip-tool pairing ble-thread 8 hex:<operationalDataset> <pin_code> <discriminator>
86box: ./chip-tool pairing ble-thread 9 hex:<operationalDataset> <pin_code> <discriminator>

创建单播绑定

用户可以按照以下步骤建立单播绑定。完成单播绑定后,用户可以通过 86box 开关一次控制一个灯光。

重写新的 ACL 列表

Matter中的所有交互模型操作必须通过访问控制机制进行验证。

每当客户端设备和服务器设备希望通过读取(或订阅)属性或事件、写入属性或调用命令来相互交互时,访问控制机制必须验证客户端是否有足够的权限在服务器设备上执行操作。 如果没有获得足够的权限,则无法进行操作并被拒绝(状态0x7E访问被拒绝)。 用户应为 86box 添加 ACL 条目以访问所有照明设备。

首先,通过 "./chip-tool accesscontrol read acl node_id 0" 读取现有的 ACL 条目列表,以检索管理员的默认条目。"Targets: null" 表示管理员的权限。

./chip-tool accesscontrol read acl _node_id_ 0
...
[1714291047.397431][504978:504980] CHIP:TOO:   ACL: 1 entries
[1714291047.397456][504978:504980] CHIP:TOO:     [1]: {
[1714291047.397473][504978:504980] CHIP:TOO:       Privilege: 5
[1714291047.397483][504978:504980] CHIP:TOO:       AuthMode: 2
[1714291047.397495][504978:504980] CHIP:TOO:       Subjects: 1 entries
[1714291047.397535][504978:504980] CHIP:TOO:         [1]: 112233
[1714291047.397549][504978:504980] CHIP:TOO:       Targets: null
[1714291047.397559][504978:504980] CHIP:TOO:       FabricIndex: 1
[1714291047.397568][504978:504980] CHIP:TOO:      }
...

事实证明,"Subjects: 112233(0x1B669 in hex)" 是 chip-tool 的固定节点 ID ,对应于 CASE 建立过程中 chip-tool 的 NOC 证书。 此外,"Targets: null" 表示管理员的权限。

./chip-cert print-cert chip-noc.chip-b64
Signature Algo  : ECDSAWithSHA256
Issuer          : [[ MatterICACId = 0000000000000002 ]]
Not Before      : 0x27812280  ( 2021/01/01 00:00:00 )
Not After       : 0x3A4D2580  ( 2030/12/30 00:00:00 )
Subject         : [[ MatterFabricId = 0000000000000001,
                     MatterNodeId = 000000000001B669 ]]

然后重写整个 ACL 列表,包括上面检索到的管理员条目。 Lighting_node_id 范围从1到8,endpoint 固定为0(根)作为示例。

./chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": [9], "targets": [{"cluster": 6, "endpoint": 1, "deviceType": null}]}]' <lighting_node_id> <endpoint>

注意:Matter SDK(chip-tool) 不支持列表操作"追加"、"更新"和"删除"。如在 https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads 中所示:

Alt text

Matter SDK 不支持列表操作

绑定 86box 端点到所有照明设备

分别将照明设备的照明集群绑定到 86box 端点如下。演示中 86box_node_id 固定为9,端点范围从2到9。

./chip-tool binding write binding '[{"fabricIndex": 1, "node": 1, "endpoint": 1, "cluster": 6}]' <86box_node_id> <endpoint>

创建群组绑定

用户可以按照以下步骤建立群组绑定。完成这些步骤后,您可以执行群组控制。

添加群组密钥集

群组密钥集用于在群组通信中加密消息。用户应通过以下命令添加群组密钥集。 Node_id 范围为 1 到 9,包括 86box 。对于这个演示,端点固定为 0,因为只有端点 0 有群组密钥管理集群。

./chip-tool groupkeymanagement key-set-write '{"groupKeySetID": 417, "groupKeySecurityPolicy": 0, "epochKey0":"a0a1a2a3a4a5a6a7a8a9aaabacadaeaf", "epochStartTime0": 1110000, "epochKey1":"b0b1b2b3b4b5b6b7b8b9babbbcbdbebf", "epochStartTime1": 1110001, "epochKey2":"c0c1c2c3c4c5c6c7c8c9cacbcccdcecf", "epochStartTime2": 1110002 }' <node_id> <endpoint>

添加群组密钥映射

添加一个新群组并将群组密钥集映射到这个群组。 下面的命令添加一个新群组。Node_id 和端点与上面相同。

./chip-tool groupkeymanagement write group-key-map '[{"groupId": 257, "groupKeySetID": 417, "fabricIndex": 1}]' <node_id> <endpoint>

添加端点到群组

所有照明设备的端点应按照以下命令添加到组中,其中节点 ID 从 1 到 9,端点固定为 1。


./chip-tool groups add-group 257 demo <node_id> <endpoint>

重写照明设备的新ACL列表

所有照明的端点应添加到组中。照明节点ID从1到8,灯光端点固定为0。


./chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": null, "targets": null},{"fabricIndex": 1, "privilege": 3, "authMode": 3, "subjects": [257], "targets": null}]' <lighting_node_id> <lighting_ndpoint>

将 86box 端点1绑定到组

将开关绑定到其开关群集的组可以向组发送命令。

./chip-tool binding write binding '[{"fabricIndex": 1, "group": 257}]' 9 1

按钮控制

AllTurnon -> 打开所有灯光:

../../../../_images/all_turn_on.png

Sleep -> 关闭所有灯光:

../../../../_images/all_turn_off.png

每个灯都可以单独控制:

../../../../_images/one_light_turn_on.png