북유럽에서 OTA 테스트

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

환경 설정

이러한 안내는 nRF Connect 도구 모음의 Docker 기반 설치를 기반으로 합니다. Docker를 사용하지 않는 경우 nRF Connect를 호스트 컴퓨터에 기본적으로 설치하는 방법에 대한 안내는 Nordic 사이트를 참조하세요.

Matter SDK 확인하기

user@host> mkdir otaprep
user@host> cd otaprep
user@host> git clone https://github.com/project-chip/connectedhomeip.git
user@host> cd connectedhomeip/
user@host> git fetch origin v1.0-branch
user@host> git checkout FETCH_HEAD

사용할 올바른 Docker 이미지를 확인합니다. Matter SDK 지속적 통합을 위해 만든 이미지 중 하나를 사용합니다.

user@host> cat .github/workflows/examples-nrfconnect.yaml | grep chip-build
            image: connectedhomeip/chip-build-nrf-platform:0.5.99

Nordic 보드를 컴퓨터에 연결합니다. 직렬 인터페이스의 USB 열거를 확인합니다.

MacOS에서:

user@host> ls /dev/tty.usbmodem*
/dev/tty.usbmodem0123456789000

Linux의 경우 다음 중 하나를 수행합니다.

user@host> ls /dev/tty*AC*
/dev/ttyACM0

사용하여

user@host> ls /dev/tty*USB*
/dev/ttyUSB0

이전 명령어에서 수집한 정보를 사용하여 컨테이너를 실행합니다. 플래그를 전달하여 호스트 Matter SDK 폴더와 USB 직렬 인터페이스를 컨테이너에 마운트합니다.

user@host> docker run --name container_name -it --user $(id -u):$(id -g) --mount source=$(pwd),target=/workspace,type=bind connectedhomeip/chip-build-nrf-platform: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와 Nordic nRF52 도구 모음의 환경 변수를 초기화합니다. Matter SDK 초기화에는 대개 몇 분 정도 걸립니다.

$ cd /workspace
$ git submodule update --init --recursive
$ source ./scripts/bootstrap.sh
$ source ./scripts/activate.sh
$ export ZEPHYR_BASE=/opt/NordicSemiconductor/nrfconnect/zephyr
$ export GNUARMEMB_TOOLCHAIN_PATH="$PW_ARM_CIPD_INSTALL_DIR"
$ scripts/run_in_build_env.sh "python3 scripts/setup/nrfconnect/update_ncs.py --update --shallow"
$ source /opt/NordicSemiconductor/nrfconnect/zephyr/zephyr-env.sh

빌드 및 플래시

기기의 VID 및 PID를 구성합니다.

$ cd examples/lighting-app/nrfconnect
$ west build -b nrf52840dk_nrf52840 -t menuconfig

대화형 메뉴 옵션:

  1. Modules --->

  2. connectedhomeip --->

  3. [*] Connected Home over IP protocol stack --->

  4. Device vendor ID (VID) 및 Device product ID (PID)를 10진수 형식으로 입력합니다.

  5. [*] Enable OTA requestor 플래그가 선택되어 있는지 확인합니다.

  6. s를 눌러 구성을 저장하고 Enter 키를 눌러 확인한 후 q를 눌러 menuconfig를 종료합니다.

테스트 인증서 설정

Matter 기기 테스트 인증서 만들기의 단계에 따라 CD, DAC, PAI 인증서를 만듭니다.

나만의 기기 만들기

$ west build -b nrf52840dk_nrf52840

기기 플래시

이 작업은 Docker 컨테이너가 아닌 호스트 컴퓨터에서 수행됩니다.

nRFConnect 명령줄 도구가 아직 없으면 다운로드하여 설치합니다.

user@host> nrfjprog --program build/zephyr/merged.hex --chiperase -f NRF52

호스트 또는 컨테이너에서 기기에 대한 터미널 연결을 엽니다. minicom 또는 GNU screen와 같이 선호하는 터미널 도구를 사용합니다.

user@host> minicom -c on -D /dev/ttyACM0 115200

user@host> screen /dev/ttyACM0 115200

OTA 이미지 생성 및 업로드

기기를 플래시한 후에는 빌드 설정을 한 번 더 변경하여 기기 소프트웨어 버전이 늘어난 OTA 이미지를 만듭니다.

Zephyr menuconfig를 실행합니다.

$ west build -b nrf52840dk_nrf52840 -t menuconfig

대화형 메뉴 옵션:

  1. Modules -->

  2. connectedhomeip -->

  3. Connected Home over IP protocol stack -->

  4. Device Software Version2로 변경합니다.

  5. Device Software Version Stringprerelease-2로 변경합니다.

  6. s를 눌러 구성을 저장하고 Enter 키를 눌러 확인한 후 q를 눌러 menuconfig를 종료합니다.

Matter OTA 번들 파일을 빌드합니다. 출력은 build/zephyr/zephyr.bin에 배치됩니다.

$ /workspace/src/app/ota_image_tool.py create -v hex_VID -p hex_PID -vn version_no -vs version_string path_to_binary -da digest_algorithm path_to_ota_file

생성된 Matter OTA 번들 파일의 속성을 확인합니다.

/workspace/examples/lighting-app/nrfconnect# /workspace/src/app/ota_image_tool.py show firmware-ota-update-test.bin
Magic: 1beef11e
Total Size: 951784
Header Size: 72
Header TLV:
  [0] Vendor Id: XXXXX (0xXXXX)
  [1] Product Id: 32768 (0x8000)
  [2] Version: 2 (0x2)
  [3] Version String: prerelease-2
  [4] Payload Size: 951696 (0xe8590)
  [8] Digest Type: 1 (0x1)
  [9] Digest: 75f2e8b0c8e922b8bb3841504190bcdd83533e936a284c7254d29327d605c930

Matter SDK는 컨테이너 호스트에서 마운트되므로 컨테이너 호스트에서 OTA 이미지를 사용할 수도 있습니다. OTA 업로드 안내에 따라 OTA 이미지를 Google Home Developer Console에 업로드합니다.

기기를 커미셔닝하고 OTA 프로세스를 관찰합니다.

호스트 또는 컨테이너에서 기기와의 터미널 연결을 엽니다. minicom 또는 GNU screen와 같이 선호하는 터미널을 사용합니다.

$ minicom -c on -D /dev/ttyACM0 115200

기기의 재설정 버튼을 눌러 부팅 로그를 확인합니다.

기기 출력에 설정한 VID 및 PID와 함께 커미셔닝 QR 코드의 URL이 표시됩니다.

I: nRF5 802154 radio initialized
I: 4 Sectors of 4096 bytes

(...)

I: 681 [SVR]Server Listening...
I: 684 [DL]Device Configuration:
I: 687 [DL]  Serial Number: 11223344556677889900
I: 692 [DL]  Vendor Id: XXXXX (0xXXXX)
I: 695 [DL]  Product Id: XXXXX (0xXXXX)
I: 699 [DL]  Hardware Version: 0
I: 702 [DL]  Setup Pin Code (0 for UNKNOWN/ERROR): 20202021
I: 708 [DL]  Setup Discriminator (0xFFFF for UNKNOWN/ERROR): 3840 (0xF00)
I: 714 [DL]  Manufacturing Date: (not set)
I: 718 [DL]  Device Type: 65535 (0xFFFF)
I: 723 [SVR]SetupQRCode: [MT:6FCJ142C00KA0648G00]
I: 727 [SVR]Copy/paste the below URL in a browser to see the QR Code:
I: 733 [SVR]https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%000000000000000000000
I: 742 [SVR]Manual pairing code: [30900112302]
I: 747 [DL]CHIP task running
I: 752 [DL]CHIPoBLE advertising started
I: 757 [DL]NFC Tag emulation started

허브가 온라인 상태인지 확인하고 로그에 있는 링크의 QR 코드를 사용하여 Google Home app (GHA)로 기기를 커미셔닝합니다.

커미셔닝 후 기기가 활동을 기록하도록 합니다.

기기 로그에 다음 텍스트가 표시됩니다.

/* Hub OTA provider identification */
I: 69642 [SWU]OTA Requestor received AnnounceOTAProvider
D: 69647 [SWU]  FabricIndex: 1
D: 69649 [SWU]  ProviderNodeID: 0x00000000XXXXXXXX
D: 69654 [SWU]  VendorID: 0x6006
D: 69657 [SWU]  AnnouncementReason: 0
D: 69660 [SWU]  Endpoint: 2
...
D: 69799 [SWU]Establishing session to provider node ID 0x00000000FC843D94 on fabric index 1
...
D: 262265 [SWU]QueryImageResponse:
D: 262268 [SWU]  status: 0
D: 262271 [SWU]  imageURI: bdx://00000000FC843D94/37f09fd6-0000-0000-0000-000000000000
D: 262278 [SWU]  softwareVersion: 2
D: 262281 [SWU]  softwareVersionString: 2
D: 262285 [SWU]  updateToken: 36
D: 262288 [SWU]  userConsentNeeded: 0
D: 262292 [SWU]Update available from version 0 to 2
...
D: 262372 [SWU]Establishing session to provider node ID 0x00000000FC843D94 on fabric index 1
...
D: 262409 [SWU]BDX::SendMessage

이미지가 적용된 후 기기가 재부팅됩니다. 재부팅 후에는 이미지의 컴파일 시간이 Developer Console에 업로드된 시간과 일치해야 합니다.

OTA 소프트웨어 업데이트 유효성 검사

기기 소프트웨어 버전은 Google Home 앱 (GHA)을 사용하여 확인할 수 있습니다. 기기가 커미셔닝되면 다음 절차를 따르세요.

  1. GHA 기본 화면에서 기기 타일 길게 누르기
  2. 오른쪽 상단의 아이콘을 탭합니다.
  3. 기술 정보를 탭합니다.
  4. 소프트웨어 버전 필드를 확인합니다.

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