IP를 통한 커넥티드 홈(CHIP) 시작하기

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

이 명령어를 실행하면 예시를 위한 구성 편집기가 표시됩니다.

보드 유형 구성

데모 → 기기 유형으로 이동하여 빌드하려는 보드를 선택하세요.

35343b20891ccdfd.png

Rendezvous 모드 사용 중지

Rendezvous 모드를 사용 중지하면 기기가 안전하지 않은 채널을 통해 chip-tool과 통신할 수 있게 됩니다. 구성 메뉴에서 데모 → Rendezvous 모드로 이동하여 모드를 우회로 설정하세요.

9db9116fda290c03.png

Wi-Fi SSID 및 비밀번호 구성

구성 메뉴에서 구성요소 구성 → CHIP 기기 레이어 → Wi-Fi 스테이션 옵션으로 이동하여 Wi-Fi 네트워크의 다음 두 가지 옵션을 설정하세요.

  • 기본 Wi-Fi SSID
  • 기본 Wi-Fi 비밀번호

60b3fe446c502711.png

빌드 및 플래시

이 구성 설정을 적용한 후 예시 애플리케이션을 빌드하고 플래시합니다.

아래 '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을 사용하여 기기와 상호작용하려면 이 주소가 필요합니다.

b8b3b97d230997e0.png

위 예시에서는 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의 신호를 전환합니다.

2bc30b2e82b22153.png

위 그림에서 1.8V/20mA 빨간색 LED는 GPIO2에 유선으로 연결되어 있고 75옴 저항기를 직렬로 사용합니다.

ESP32-WROVER-KIT에서 위 명령어를 실행하면 디스플레이 왼쪽 상단에 있는 가상의 녹색 LED가 전환됩니다.

8f9ab6a82f525248.png

M5Stack 보드에서 위 명령어를 실행하면 디스플레이 왼쪽 상단에 있는 가상의 녹색 LED가 전환됩니다.

8067715c8175fee9.png

8. 마무리 단계

수고하셨습니다. CHIP을 사용하여 개발 키트를 성공적으로 제어했습니다.

이 Codelab을 통해 학습한 내용은 다음과 같습니다.

  • 개발 키트에서 OnOff 기능을 사용 설정하는 방법
  • CHIP 컨트롤러 도구로 개발 키트를 제어하는 방법

자세히 알아보기

다음은 작업을 좀 더 활용하기 위해 구현할 수 있는 몇 가지 아이디어입니다.