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_IDattributeId가 제대로 비어있는지 확인해야 합니다.

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;
    }

    ...
}

clusterIdattributeId가 맞으면 개발 키트의 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 컨트롤러 도구로 개발 키트를 제어하는 방법

자세히 알아보기

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