다음 안내에서는 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
대화형 메뉴에서 다음 설정을 구성합니다.
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 인증서를 만듭니다.
기기 빌드
이제 빌드를 실행하고 기기를 플래시합니다.
idf.py build
idf.py -p /dev/ttyUSB0 erase_flash
idf.py -p /dev/ttyUSB0 flash
OTA 이미지 만들기 및 업로드
이제 빌드 설정을 다시 변경하여 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
를 사용하여 다른 셸에 표시할 수 있습니다.
기기 측면의 빨간색 초기화 버튼을 눌러 부팅 로그를 확인합니다.
기기 출력에는 앞서 설정한 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
를 실행하고 대화형 메뉴 옵션에서 다음을 실행합니다.
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 기본 화면에서 기기 타일을 길게 누릅니다.
- 오른쪽 상단의 아이콘을 탭합니다.
- 기술 정보를 탭합니다.
- 소프트웨어 버전 필드를 확인합니다.