Espressif ESP32에서 OTA 테스트

다음 안내에서는 M5Stack ESP32 개발 보드와 함께 Matter SDK의 조명 앱 예를 사용합니다.

빌드 환경 설정

먼저 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 ID을(를) Connectivity 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 앱 화면