Espressif ESP32에서 OTA 테스트

다음 안내에서는 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 이미지를 결정합니다.

$ 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 IDConnectivity Standards Alliance (Alliance)에 할당된 VID로 설정합니다.

  5. Product IDGoogle Home Developer ConsoleMatter 통합에서 설정한 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용 이미지의 위치와 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를 사용하여 다른 셸에 표시할 수 있습니다.

기기 측면의 빨간색 초기화 버튼을 눌러 부팅 로그를 확인합니다.

기기 출력에는 앞서 설정한 VID 및 PID와 기기 커미셔닝에 사용할 QR 코드 이미지의 URL이 표시됩니다.

[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

홈에서 허브가 온라인 상태인지 확인합니다.

로그 파일에 표시된 링크의 QR 코드를 사용하여 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를 실행하고 대화형 메뉴 옵션에서 다음을 실행합니다.

  1. Component config -->

  2. CHIP Device Layer --->

  3. Device Identification Options

  4. Version Stringv1.0로 설정합니다.

  5. Device Software Version Number1로 설정합니다.

  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. 소프트웨어 버전 필드를 확인합니다.

소프트웨어 버전 필드가 표시된 Google Home 앱 화면