1. 소개
Matter는 Connectivity Standards Alliance(이전 명칭: Zigbee Alliance) 내의 새로운 표준입니다. 안정적이고 안전한 연결을 약속하는 업계 통합 표준으로, 기기 간 연동이 언제나 원활하게 작동하도록 보장합니다.
이 표준의 목표는 제조업체의 개발 작업을 간소화하고 소비자가 편리하게 사용하도록 호환성을 높이는 것입니다. 스마트 홈 기기는 안전하고 안정적이며 원활하게 사용할 수 있어야 한다는 공통의 신념을 토대로 GitHub의 IP를 통한 커넥티드 홈 프로젝트에서 활발히 개발되고 있습니다. 프로젝트의 목표는 인터넷 프로토콜(IP)을 바탕으로 스마트 홈 기기, 모바일 앱, 클라우드 서비스 간의 통신을 가능하게 하고 기기 인증을 위한 특정 IP 기반 네트워킹 기술 세트를 정의하는 것입니다.
달리 명시되지 않는 한 이 Codelab 콘텐츠의 라이선스는
Apache 2.0 라이선스의 적용을 받습니다. 자세한 내용은 프로젝트 CHIP 오픈소스 라이선스를 참고하세요.
이 Codelab에서는 ESP32 개발 보드를 사용하여 Wi-Fi 기기를 설정하고 사용/사용 중지 기능을 추가한 다음, 이를 명령줄 인터페이스로 제어하는 방법을 배워보겠습니다.
학습할 내용
- CHIP 지원 기기를 연결하고 제어하는 방법
- 예시 기기 애플리케이션에 기능을 추가하는 방법
필요한 항목
- Linux에 관한 기본 지식
- ESP32 개발 보드
- 'git'이 설치된 Linux 시스템
2. 시작하기
직렬 포트 터미널
터미널을 통해 직렬 포트에 연결하는 방법을 잘 알고 있어야 합니다. 이 Codelab에서는 screen
을 사용하여 사용 개요를 제공하지만, 다른 터미널 소프트웨어를 사용해도 됩니다.
Linux 시스템
이 Codelab은 x86 기반 64비트 Linux 시스템을 사용하여 칩 도구를 실행하고 모든 개발 보드를 플래시하도록 설계되었습니다. 모든 단계는 Ubuntu 20.04.2.0 LTS에서 테스트했습니다.
ESP32 개발 보드
이 Codelab에서는 다음 ESP32 개발 보드 중 하나를 사용합니다.
- ESP32-DevkitC
- ESP32-WROVER-KIT V4.1
- M5Stack ESP32 시리즈 Basic Core IoT 개발 키트
USB 케이블을 통해 개발 키트를 Linux 시스템에 연결하여 펌웨어를 플래시하고 기기 로그에 액세스해야 합니다.
3. 저장소 클론하기
이 문서와 호환되는 소스 코드의 버전을 확인하려면 다음 단계에 따라 저장소를 클론하세요.
$ git clone git@github.com:project-chip/connectedhomeip.git $ cd connectedhomeip $ git checkout 1de2b73bb4123af5f184eac54d1b1d76985b4f62 $ git submodule update --init
그런 다음 플랫폼에 관한 GitHub의 빌드 문서에 있는 '기본 요건' 및 '빌드 준비' 섹션의 단계를 따르세요. 완료되면 읽기를 계속합니다.
Codelab 패치 적용
이 패치로 CHIP에서 on/off 명령어를 처리하는 콜백을 삭제해보겠습니다. 나중에 이를 자세히 살펴보며 단계별로 다시 추가해봅니다.
$ git fetch origin ce1e0ab44c367bc9d5907115e09a4c45fc6d8c96 $ git cherry-pick ce1e0ab44c367bc9d5907115e09a4c45fc6d8c96
4. CHIP 클라이언트 빌드하기 예시
호스트 머신에서 CHIP 기기와 통신하려면 호스트용 chip-tool
을 빌드해야 합니다.
GitHub에서 chip-tool
을 빌드하기 위한 안내를 따르세요.
chip-tool
을 보유하고 나면 이를 사용하여 기기 엔드포인트를 켜고 끄는 등의 작업을 실행해보겠습니다.
다양한 chip-tool
작업에 관한 자세한 내용은 GitHub의 chip-tool
문서 및 소스 코드를 참고하세요.
5. 모든 클러스터 빌드하기 예시
호스트를 설정하고 chip-tool
을 빌드한 후에는 ESP32의 모든 클러스터 예시를 빌드하고 실행할 수 있습니다.
먼저 모든 클러스터 예시 디렉터리로 변경합니다.
$ cd examples/all-clusters-app/esp32
그런 후 다음 명령어를 실행하라는 안내가 표시될 때까지 GitHub의 안내를 따릅니다.
$ idf make menuconfig
이 명령어를 실행하면 예시를 위한 구성 편집기가 표시됩니다.
보드 유형 구성
데모 → 기기 유형으로 이동하여 빌드하려는 보드를 선택하세요.
Rendezvous 모드 사용 중지
Rendezvous 모드를 사용 중지하면 기기가 안전하지 않은 채널을 통해 chip-tool
과 통신할 수 있게 됩니다. 구성 메뉴에서 데모 → Rendezvous 모드로 이동하여 모드를 우회로 설정하세요.
Wi-Fi SSID 및 비밀번호 구성
구성 메뉴에서 구성요소 구성 → CHIP 기기 레이어 → Wi-Fi 스테이션 옵션으로 이동하여 Wi-Fi 네트워크의 다음 두 가지 옵션을 설정하세요.
- 기본 Wi-Fi SSID
- 기본 Wi-Fi 비밀번호
빌드 및 플래시
이 구성 설정을 적용한 후 예시 애플리케이션을 빌드하고 플래시합니다.
아래 'USB0
'을 개발 보드가 연결된 tty로 대체합니다. 호스트 머신에 연결된 직렬 케이블이 2개 이상이면 tty가 다를 수 있습니다(예: /dev/ttyUSB1
또는 /dev/ttyUSB2
). 이 문서에서 USB0
이 표시되는 모든 위치를 계속 이렇게 대체하세요.
$ idf make $ idf make erase_flash ESPPORT=/dev/ttyUSB0 $ idf make flash ESPPORT=/dev/ttyUSB0
위 단계는 CHIP 모든 클러스터 예시 리드미에서도 사용할 수 있습니다.
6. OnOff 명령어 사용 설정하기
편집기의 examples/all-clusters-app/esp32/main
에 있는 DeviceCallbacks.cpp
를 엽니다. 편집기에서 열리면 'DeviceCallbacks::PostAttributeChangeCallback()
' 함수로 이동하세요.
chip-tool
에서 on-off 명령어를 전송하면 기기에 ZCL_ON_OFF_CLUSTER_ID 이벤트가 전송되어야 합니다. 이러한 이벤트를 처리하기 위해 다양한 clusterID
를 처리하는 이벤트 콜백에 명령어를 추가합니다.
void DeviceCallbacks::PostAttributeChangeCallback(...) { ... switch (clusterId) { case ZCL_ON_OFF_CLUSTER_ID: break; default: ESP_LOGI(TAG, "Unhandled cluster ID: %d", clusterId); break; } ... }
모든 클러스터는 여러 속성을 지원합니다. 여기서는 간단한 사용/사용 중지 기능을 지원해 보겠습니다. 따라서 코드에서 ZCL_ON_OFF_ATTRIBUTE_ID의 attributeId
가 제대로 비어있는지 확인해야 합니다.
void DeviceCallbacks::PostAttributeChangeCallback(...) { ... switch (clusterId) { case ZCL_ON_OFF_CLUSTER_ID: if (attributeId == ZCL_ON_OFF_ATTRIBUTE_ID) { } else { ESP_LOGI(TAG, "Unhandled attribute ID: %d", attributeId); } break; default: ESP_LOGI(TAG, "Unhandled cluster ID: %d", clusterId); break; } ... }
clusterId
와 attributeId
가 맞으면 개발 키트의 LED 상태를 제어하는 함수 호출을 추가합니다.
void DeviceCallbacks::PostAttributeChangeCallback(...) { ... switch (clusterId) { case ZCL_ON_OFF_CLUSTER_ID: if (attributeId == ZCL_ON_OFF_ATTRIBUTE_ID) { statusLED1.Set(*value); } else { ESP_LOGI(TAG, "Unhandled attribute ID: %d", attributeId); } break; default: ESP_LOGI(TAG, "Unhandled cluster ID: %d", clusterId); break; } ... }
파일을 저장하고 이전 단계의 빌드 및 플래시와 동일한 프로세스에 따라 애플리케이션을 빌드하고 개발 키트를 다시 플래시합니다.
$ idf make $ idf make erase_flash ESPPORT=/dev/ttyUSB0 $ idf make flash ESPPORT=/dev/ttyUSB0
7. 예시 애플리케이션 실행하기
ESP32 보드의 USB 케이블을 호스트 머신에 연결하고 직렬 터미널을 시작합니다. screen
은 사용하기 좋은 프로그램 중 하나이며, 다음 명령어를 실행하여 ESP32의 직렬 출력을 확인할 수 있습니다.
$ screen /dev/ttyUSB0 115200
기기가 부팅되고 Wi-Fi에 연결되면 직렬 콘솔에 IP 주소가 표시됩니다. chip-tool
을 사용하여 기기와 상호작용하려면 이 주소가 필요합니다.
위 예시에서는 IP 주소가 192.168.117.134이고 기기는 포트 11097에서 수신 대기 중입니다.
다음과 같이 IP 주소와 포트를 사용하여 기기에 연결을 설정하고 페어링 단계를 우회합니다.
$ cd examples/chip-tool $ ./out/debug/chip-tool pairing bypass 192.168.117.134 11097
이제 다음 명령어를 사용하여 엔드포인트 1을 전환할 수 있습니다.
$ ./out/debug/chip-tool onoff toggle 1
ESP32 DevKitC에서는 GPIO2의 신호를 전환합니다.
위 그림에서 1.8V/20mA 빨간색 LED는 GPIO2에 유선으로 연결되어 있고 75옴 저항기를 직렬로 사용합니다.
ESP32-WROVER-KIT에서 위 명령어를 실행하면 디스플레이 왼쪽 상단에 있는 가상의 녹색 LED가 전환됩니다.
M5Stack 보드에서 위 명령어를 실행하면 디스플레이 왼쪽 상단에 있는 가상의 녹색 LED가 전환됩니다.
8. 마무리 단계
수고하셨습니다. CHIP을 사용하여 개발 키트를 성공적으로 제어했습니다.
이 Codelab을 통해 학습한 내용은 다음과 같습니다.
- 개발 키트에서 OnOff 기능을 사용 설정하는 방법
- CHIP 컨트롤러 도구로 개발 키트를 제어하는 방법
자세히 알아보기
다음은 작업을 좀 더 활용하기 위해 구현할 수 있는 몇 가지 아이디어입니다.
- ZAP 파일을 수정하여 기능을 확장합니다.
- ZCL_IDENTIFY_CLUSTER_ID 기능을
DeviceCallbacks.cpp
파일에 추가합니다. - 이 사양은 ZigBee 클러스터 라이브러리를 정의합니다.
- 프로젝트 CHIP에 관한 최신 정보는 GitHub를, Matter에 관한 최신 정보는 buildwithmatter.com을 확인하세요.