在 Espressif ESP32 上測試 OTA

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

下列操作說明使用 Matter SDK along with an M5Stack ESP32 development board.Lighting 應用程式範例

建構環境設定

首先,請複製 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 Workflow 中所使用的版本,判斷哪個 Docker 映像檔最適合我們的建構作業:

$ 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

您也可以使用:

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 公用程式設定建構作業。

cd examples/lighting-app/esp32
idf.py menuconfig

在互動式選單中調整下列設定:

  1. Component config --->

  2. CHIP Device Layer --->

  3. Device Identification Options --->

  4. Vendor ID 設為 CSA 已指派的 VID。

  5. Product ID 設為您在 Google Home Developer Console . 中整合 Matter 時設定的 PID

啟用 OTA 要求標記:

  1. Component config -->

  2. CHIP Core -->

  3. System options --->

  4. 啟用 OTA 要求者標記 [*] Enable OTA Requestor

  5. 按 ESC 鍵兩次,即可返回頂層選單。

啟用 Matter OTA 映像檔建立旗標:

  1. Component config -->

  2. CHIP Device Layer --->

  3. Matter OTA Image --->

  4. [*] Generate OTA IMAGE

設定版本號碼:

  1. Application manager --->

  2. 選取「[*] Get the project version from Kconfig

  3. Project version (NEW) 設為 1.0

  4. 按下 s 儲存設定,按兩下 Enter 鍵,然後按下 q 鍵結束 menuconfig

設定測試憑證

按照建立 Matter 裝置測試憑證中的步驟,建立 CD、DAC 和 PAI 憑證。

打造您的裝置

現在請執行版本並刷新裝置:

idf.py build
idf.py -p /dev/ttyUSB0 erase_flash
idf.py -p /dev/ttyUSB0 flash

建立及上傳 OTA 映像檔

現在請再次變更建構設定,以建立 OTA 映像檔。請使用相同的映像檔,但版本號碼會遞增。

執行 menuconfig

idf.py menuconfig

在互動式選單中,更新下列項目:

  1. Application manager --->
  2. 選取「[*] Get the project version from Kconfig
  3. Project version (NEW) 設為 2.0
  4. 按下 s 儲存設定,按兩下 Enter 鍵,然後按下 q 鍵結束 menuconfig

建構並擷取映像檔。以下範例說明使用 ota_image_tool.py 剖析時,OTA 的映像檔位置和輸出內容。

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 檔案,或是透過 cattailmoregrep 在其他殼層顯示。

按下裝置側邊的紅色重設按鈕,可查看開機紀錄。

在裝置輸出結果中,您應該會看到先前設定的 VID 和 PID,以及用來註冊裝置的 QR 圖碼映像檔網址。

[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

確認 Nest Hub 位於你家中,

使用 Google Home app (GHA) using the QR code from the link that appears in the log file. 為裝置委託

委任後,裝置可持續運作數分鐘。您應該會觀察與 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,並在互動式選單選項中執行以下動作:

  1. Component config -->

  2. CHIP Device Layer --->

  3. Device Identification Options

  4. Version String 設為 v1.0

  5. Device Software Version Number 設為 1

  6. 按下 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) 檢查裝置軟體版本。委任裝置後,請按照下列指示操作:

  1. 長按 GHA 主畫面的裝置圖塊
  2. 輕觸右上方的 圖示
  3. 輕觸 [技術資訊]
  4. 查看「Software version」(軟體版本) 欄位

Google Home 應用程式畫面顯示軟體版本欄位