Matter의 기기에는 기기 기능의 계층적 모델링인 잘 정의된 데이터 모델(DM)이 있습니다. 이 계층 구조의 최상위 수준에는 기기가 있습니다.
기기 및 엔드포인트
스마트폰과 홈 어시스턴트를 비롯한 모든 기기는 노드1로 구성됩니다. 노드는 사용자가 기능적으로 온전하다고 인식할 수 있는 네트워크 내 고유하게 식별 가능하며 주소 지정이 가능한 리소스입니다. Matter의 네트워크 통신은 노드에서 시작되고 종료됩니다.
노드는 엔드포인트 모음입니다. 각 엔드포인트는 기능 집합을 묶습니다. 예를 들어 한 엔드포인트는 조명 기능과 관련이 있고 다른 엔드포인트는 움직임 감지와 관련이 있으며 또 다른 엔드포인트는 기기 OTA와 같은 유틸리티를 처리합니다.
노드 역할
노드 역할은 관련 동작의 집합입니다. 각 노드에는 하나 이상의 역할이 있을 수 있습니다. 노드 역할은 다음과 같습니다.
- 커미셔너: 커미셔닝을 실행하는 노드입니다.
- 컨트롤러: 하나 이상의 노드를 제어할 수 있는 노드입니다. 예를 들어 Google Home app (GHA), Google Assistant, Google Nest Hub (2nd gen)가 있습니다. 켜기/끄기 전등 스위치와 같은 일부 기기 유형에는 컨트롤러 역할이 있습니다.
- 제어 대상: 하나 이상의 노드에서 제어할 수 있는 노드입니다. 불 켜기/끄기 스위치와 같이 컨트롤러 역할이 있는 일부 기기 유형을 제외하고 대부분의 기기 유형은 제어 대상이 될 수 있습니다. 전원 스위치는 컨트롤러 전용입니다. 제어 대상이 될 수 없습니다.
- OTA 제공업체: OTA 소프트웨어 업데이트를 제공할 수 있는 노드입니다.
- OTA 요청자: OTA 소프트웨어 업데이트를 요청할 수 있는 노드입니다.
클러스터
엔드포인트 내에서 노드에는 하나 이상의 클러스터가 있습니다. 클러스터는 기기 계층 구조의 또 다른 단계입니다. 스마트 플러그의 켜기/끄기 클러스터나 조광등 엔드포인트의 밝기 제어 클러스터와 같은 특정 기능을 그룹화하기 때문입니다.
노드에 여러 엔드포인트가 있을 수도 있으며, 각 엔드포인트는 동일한 기능의 인스턴스를 만듭니다. 예를 들어 조명 장치는 개별 조명의 독립적인 제어를 노출할 수 있고 전원 스트립은 개별 소켓의 제어를 노출할 수 있습니다.
속성
마지막 수준에는 노드에 있는 상태인 속성이 있습니다(예: 수준 제어 클러스터의 현재 수준 속성). 속성은 uint8, 문자열, 배열과 같은 다양한 데이터 유형으로 정의될 수 있습니다.
명령어
클러스터에는 속성 외에도 실행할 수 있는 작업인 명령어도 있습니다. Matter의 DM에서 리모트 프로시저 콜과 같습니다. 명령어는 동사와 유사합니다(예: 도어락 클러스터의 현관문 잠그기). 명령어는 응답과 결과를 생성할 수 있습니다. Matter에서는 이러한 응답도 명령어로 정의되어 반대 방향으로 진행됩니다.
이벤트
마지막으로 클러스터에는 과거 상태 전환의 기록으로 간주할 수 있는 이벤트가 있을 수도 있습니다. 속성은 현재 상태를 나타내지만 이벤트는 과거의 저널이며 단조 증가 카운터, 타임스탬프, 우선순위를 포함합니다. 이를 통해 상태 전환을 캡처하고 속성으로 쉽게 달성할 수 없는 데이터 모델링을 할 수 있습니다.
엔드포인트 0은 유틸리티 클러스터용으로 예약되어 있습니다. 유틸리티 클러스터는 검색, 주소 지정, 진단, 소프트웨어 업데이트와 같은 엔드포인트의 서비스 기능을 캡슐화하는 특정 클러스터입니다. 반면 애플리케이션 클러스터는 켜기/끄기 또는 온도 측정과 같은 기본 작업을 지원합니다.
기기 유형
기기 제조업체가 새 기기를 계획할 때 어떤 클러스터 조합을 포함해야 하나요?
Matter 사양에 따라 기기는 하나 이상의 기기 유형을 구현하거나 확장해야 합니다. 기기 유형은 조광등, 도어락, 동영상 플레이어와 같은 실제 기기의 최상위 속성을 정의하는 필수 및 선택적 클러스터 모음입니다.
기기 유형은 Matter 사양 기본 문서가 아니라 함께 제공되는 문서인 기기 라이브러리에 지정됩니다. 마찬가지로 모든 애플리케이션 클러스터는 애플리케이션 클러스터 라이브러리에 정의되어 있습니다. 이 세 가지 문서는 Connectivity Standards Alliance (Alliance) 회원 웹사이트에서 확인할 수 있습니다.
기기 유형을 구현하는 각 엔드포인트는 해당 기기 유형을 정의하는 필수 클러스터를 구현해야 합니다. 엔드포인트는 필수 클러스터 외에도 기기 유형의 선택적 클러스터 중 하나 이상 또는 기기 유형에 속하지 않는 클러스터까지 추가 클러스터를 구현할 수 있습니다.
클라이언트 및 서버
클러스터는 클라이언트 클러스터 또는 서버 클러스터일 수 있습니다. 서버는 상태가 있으며 속성, 이벤트, 명령어를 보유하지만 클라이언트는 상태가 없으며 원격 서버 클러스터와의 상호작용을 시작하여 다음을 실행합니다.
- 원격 속성에서 읽고 원격 속성에 씁니다.
- 원격 이벤트를 읽습니다.
- 원격 명령어의 호출
DM은 노드 내에서 계층적이지만 노드 간의 관계는 그렇지 않습니다. Matter의 노드에는 수직 컨트롤러/기기 또는 리더/포러워 관계가 없습니다. 반대로 관계는 수평적입니다. 모든 클러스터는 서버 또는 클라이언트일 수 있습니다. 따라서 노드는 다양한 클러스터 및 기능과 관련하여 서버 이자 클라이언트가 될 수 있습니다.
예를 들어 노드 A와 노드 B라는 두 개의 테이블 램프가 있을 수 있습니다. 두 노드 모두 On/Off Light 기기 유형을 구현합니다. 이 기기 유형에는 각 실제 조명 출력을 제어하는 켜기/끄기 서버 클러스터가 포함됩니다.
하지만 일반적인 테이블 램프와 마찬가지로 Google의 실제 기기에는 로컬 켜기/끄기 스위치용 켜기/끄기 전등 스위치 기기 유형도 포함됩니다. 이 기기 유형은 서버 클러스터를 제어할 수 있도록 On/Off 클라이언트 클러스터를 구현해야 합니다.
이 샘플에서 노드 A의 켜기/끄기 클라이언트 클러스터는 노드 A와 노드 B의 켜기/끄기 서버 클러스터의 속성을 변경하는 반면 노드 B의 클라이언트 클러스터는 노드 B 자체의 서버 클러스터만 변경합니다.
다음 섹션에서는 클라이언트와 서버 클러스터가 상호작용하는 방식인 상호작용 모델을 자세히 설명합니다.
설명자 클러스터
이름에서 알 수 있듯이 설명자 클러스터 서버는 검사 정보(introspection)를 제공합니다. 엔드포인트를 설명하여 다음을 열거합니다.
- 서버 클러스터
- 클라이언트 클러스터
- 기기 유형
- 부품이라고 하는 추가 엔드포인트
모든 기기 유형에는 설명자 클러스터의 구현이 필요합니다. 루트 기기 유형은 엔드포인트 0에 정의됩니다. 설명자 클러스터를 읽으면 클라이언트는 사용 가능한 엔드포인트의 전체 트리를 탐색하고 관련 작업을 실행할 수 있습니다.
커미셔너 또는 휴대전화나 허브와 같은 제어 기기는 설명자 클러스터에 있는 정보를 사용하여 기기 (조명, 스위치, 펌프, 온도 조절기)와 기기의 특정 인스턴스에서 구현된 특정 기능을 모델링하고 사용자에게 올바른 UI를 표시할 수 있습니다.
서버 클러스터
ServerList
속성에는 엔드포인트의 클러스터 서버가 나열됩니다.
클라이언트 클러스터
ClientList
속성에는 엔드포인트의 클러스터 클라이언트가 나열됩니다.
기기 유형 목록
DeviceTypeList
속성은 엔드포인트에서 지원하는 기기 유형 목록과 각 버전입니다. 기기 유형이 하나 이상 포함되어야 합니다.
부품 목록
PartsList
에는 이 기기 유형을 구현하는 데 사용되는 엔드포인트 목록이 포함됩니다.
엔드포인트 0 (루트 노드)의 PartsList
에는 기기의 모든 엔드포인트 (엔드포인트 0 제외)가 포함됩니다.
다른 엔드포인트의 PartsList
는 일반적으로 비어 있습니다. 예를 들어 온도 센서는 온도 측정 서버 클러스터만 필요로 합니다.
다른 기기 유형은 두 개 이상의 Device Type 인스턴스의 트리 구조로 구성될 수 있습니다. 예를 들어 동영상 플레이어 기기 유형은 TV, 동영상 플레이어, 스피커, 서로 다른 콘텐츠 앱 기기 유형으로 구성될 수 있으며, 각 유형은 서로 다른 엔드포인트에 있을 수 있습니다.
-
Matter 사양은 기기에 여러 노드가 있을 수 있다고 결정합니다. 예를 들어 스마트폰에는 여러 앱이 있을 수 있으며 각 앱은 서로 다른 노드입니다. 이 프라이머에서는 모든 기기에 단일 노드가 포함됩니다. 대부분의 실제 기기는 이 패턴을 따를 것으로 예상됩니다. ↩