以下说明使用 Matter SDK 中的照明应用示例以及 M5Stack ESP32 开发板。
构建环境设置
首先,克隆 Matter SDK。
在此示例中,我们将检查 Google Home 的 Matter 版本 5 支持的最低提交:
$ mkdir otaprep
$ cd otaprep
git clone https://github.com/project-chip/connectedhomeip.git
cd connectedhomeip
git fetch origin v1.0-branch
git checkout FETCH_HEAD
git submodule update --init --recursive
source ./scripts/activate.sh
接下来,我们检查 ESP32 GitHub 工作流中使用的版本,以确定哪个 Docker 映像最适合我们的 build:
$ cat .github/workflows/examples-esp32.yaml | grep chip-build | head -n 1
image: connectedhomeip/chip-build-esp32:0.5.99
我们从 Docker 映像运行容器,传递标志以在容器中挂载 Matter SDK 并提供对 ESP32 设备的访问权限。
$ docker run --name container_name -it --user $(id -u):$(id -g) --mount source=$(pwd),target=/workspace,type=bind --device=/dev/ttyUSB0 connectedhomeip/chip-build-esp32:0.5.99 /bin/bash
停止并启动 Matter Docker 容器
每当您运行 docker run
命令时,都会使用指定映像创建一个新容器。执行此操作后,保存在之前容器实例中的旧数据会丢失。有时,您希望发生这种情况,因为这样您就可以从全新安装开始。但在此示例中,您很可能希望在会话之间保存工作和环境配置。
user@host> docker stop container_name
准备好重新运行后,启动容器并打开一个终端窗口:
user@host> docker start container_name
user@host> docker exec -it container_name /bin/bash
您可以使用以下命令打开与容器的其他终端会话:
user@host> docker exec -it container_name /bin/bash
或者,使用以下命令启动 root 会话:
user@host> docker exec -u 0 -it container_name /bin/bash
初始化 SDK
在容器中,我们初始化 Matter SDK 和 ESP IDF:
cd /workspace
git submodule update --init --recursive
source ./scripts/activate.sh
source /opt/espressif/esp-idf/export.sh
构建和刷写
下一个任务是构建映像并刷写开发套件,以接收 Matter OTA 固件更新。
为此,您必须创建映像。
首先,使用 ESP IDF 中的 menuconfig
实用程序配置 build。
cd examples/lighting-app/esp32
idf.py menuconfig
在交互式菜单中,配置以下设置:
Component config --->
CHIP Device Layer --->
Device Identification Options --->
将
Vendor ID
设置为 Connectivity Standards Alliance (Alliance) 分配的 VID。将
Product ID
设置为您在 Google Home Developer Console 中的 Matter 集成中设置的 PID。
启用 OTA 请求方标志:
Component config -->
CHIP Core -->
System options --->
启用 OTA 请求方标志
[*] Enable OTA Requestor
按两次 ESC 键返回顶级菜单。
启用 Matter OTA 映像创建标志:
Component config -->
CHIP Device Layer --->
Matter OTA Image --->
[*] Generate OTA IMAGE
设置版本号:
Application manager --->
选择
[*] Get the project version from Kconfig
将
Project version (NEW)
设置为1.0
按 s 保存配置,按两次 Enter,然后按 q 退出
menuconfig
。
设置测试证书
按照创建 Matter 设备测试证书中的步骤创建 CD、DAC 和 PAI 证书。
构建设备
现在,运行 build 并刷写设备:
idf.py build
idf.py -p /dev/ttyUSB0 erase_flash
idf.py -p /dev/ttyUSB0 flash
创建并上传 OTA 映像
现在,再次更改 build 设置以创建 OTA 映像。使用相同的映像,但版本号递增。
运行 menuconfig
。
idf.py menuconfig
在交互式菜单中,更新以下内容:
Application manager --->
- 选择
[*] Get the project version from Kconfig
- 将
Project version (NEW)
设置为2.0
- 按 s 保存配置,按 Enter 键两次,然后按 q 退出
menuconfig
。
构建并检索映像。以下示例演示了 OTA 映像的位置以及使用 ota_image_tool.py
解析时的输出。
cd build
/workspace/src/app/ota_image_tool.py show ./chip-lighting-app-ota.bin
Magic: 1beef11e
Total Size: 1243360
Header Size: 64
Header TLV:
[0] Vendor Id: XXXXX (0x000)
[1] Product Id: XXXXX (0x000)
[2] Version: 2 (0x2)
[3] Version String: v2.0
[4] Payload Size: 1243280 (0x12f890)
[8] Digest Type: 1 (0x1)
[9] Digest: e367f4d71e2ccd554b9a399c864abbf2c039382ef1def1b986fb2f59a99923a8
由于 Matter SDK 是从容器主机挂载的,因此 OTA 映像可在容器主机上使用。
按照 OTA 上传说明将 OTA 映像上传到 Developer Console。
调试以添加到 Google Home 并观察 OTA
确保您的设备已通过 USB 连接到宿主 Linux 计算机。以下示例展示了如何使用 GNU screen
读取设备日志:
screen -L /dev/ttyUSB0 115200
这会将设备的输出显示到终端,并将相同的输出写入名为 screenlog.0
的默认屏幕日志文件。
您可以在其他文本编辑器中打开 screenlog.0
文件,也可以使用 cat
、tail
、more
或 grep
在其他 Shell 中显示该文件。
按设备侧边的红色重置按钮,查看启动日志。
在设备输出中,您应该会看到之前设置的 VID 和 PID,以及用于配置设备的二维码图片的网址。
[0;32mI (2388) chip[DIS]: Advertise commission parameter vendorID=XXXXX productID=XXXX discriminator=3840/15 cm=1[0m
[0;32mI (1928) chip[SVR]: SetupQRCode: [MT:E59-000000000000000][0m
https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%3AE59-000000000000000
确保住宅中的 Hub 已联网。
使用日志文件中显示的链接中的二维码,通过 Google Home app (GHA) 对设备进行配置。
在调试完成后,让设备连续运行几分钟。您应该会看到与 OTA 请求方、OTA 映像下载和 OTAImageProcessor
相关的日志输出。
安装映像后,请注意映像的编译时间与上传到控制台的映像的编译时间一致,并且晚于首次启动时报告的编译时间。在 screenlog.0
上使用正则表达式模式执行以下模式的 grep
可以说明 OTA 过程:
$ grep -E "(Compile time|OTA)" screenlog.0
I (76) boot: 1 otadata OTA data 01 00 0000f000 00002000
I (91) boot: 3 ota_0 OTA app 00 10 00020000 00177000
I (99) boot: 4 ota_1 OTA app 00 11 001a0000 00177000
I (645) cpu_start: Compile time: Oct 15 2022 06:21:59
I (135558) chip[SWU]: OTA Requestor received AnnounceOTAProvider
I (540658) chip[SWU]: OTA image downloaded to offset 0x1a0000
I (541348) OTAImageProcessor: Applying, Boot partition set offset:0x1a0000
I (76) boot: 1 otadata OTA data 01 00 0000f000 00002000
I (91) boot: 3 ota_0 OTA app 00 10 00020000 00177000
I (99) boot: 4 ota_1 OTA app 00 11 001a0000 00177000
I (645) cpu_start: Compile time: Oct 15 2022 07:35:31
I (76) boot: 1 otadata OTA data 01 00 0000f000 00002000
I (91) boot: 3 ota_0 OTA app 00 10 00020000 00177000
I (99) boot: 4 ota_1 OTA app 00 11 001a0000 00177000
I (645) cpu_start: Compile time: Oct 15 2022 07:35:31
初次执行后,您可以重复创建和上传 OTA 映像部分中的步骤,而无需上传新映像。这次,将版本设回 1
。
运行 menuconfig
,然后在交互式菜单选项中执行以下操作:
Component config -->
CHIP Device Layer --->
Device Identification Options
将
Version String
设置为v1.0
。将
Device Software Version Number
设置为1
。按 s 保存配置,然后按 q 退出
menuconfig
。
在 GHA 中将设备从住宅中移除。
如果映像尚未构建,请构建映像:
idf.py build
刷写:
idf.py -p /dev/ttyUSB0 erase_flash
idf.py -p /dev/ttyUSB0 flash
根据需要重复委托给 Google Home 并观察 OTA 中的步骤。
验证 OTA 软件更新
您可以使用 Google Home 应用 (GHA) 查看设备软件版本。设备调试完毕后,请按以下步骤操作:
- 长按 GHA 主屏幕上的设备功能块
- 点按右上角的 图标
- 点按技术信息
- 检查软件版本字段