

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 디바이스에서 섀도우 사용
<a name="device-shadow-comms-device"></a>

이 섹션에서는 디바이스가 디바이스 섀도우 서비스와 통신하는 데 선호되는 방법인 MQTT 메시지를 사용한 섀도우와의 AWS IoT 디바이스 통신에 대해 설명합니다.

섀도우 통신은 MQTT의 게시/구독 통신 모델을 사용하여 요청/응답 모델을 에뮬레이트합니다. 모든 섀도우 작업은 요청 주제, 성공한 응답 주제(`accepted`) 및 오류 응답 주제(`rejected`)로 구성됩니다.

앱 및 서비스에서 디바이스가 연결되어 있는지 여부를 확인할 수 있도록 하려면 [디바이스 연결 상태 감지](device-shadow-comms-app.md#thing-connection) 단원을 참조하세요.

**중요**  
MQTT는 게시/구독 통신 모델을 사용하기 때문에 요청 주제를 게시하기 *전*에 응답 주제를 구독해야 합니다. 그렇지 않으면 게시한 요청에 대한 응답을 받지 못합니다.  
[AWS IoT Device SDK](iot-sdks.md)를 사용하여 디바이스 섀도우 서비스 API를 호출하면 이 작업이 자동으로 처리됩니다.

이 섹션의 예에서는 이 표에 설명된 대로 *ShadowTopicPrefix*가 명명된 섀도우 또는 명명되지 않은 섀도우를 참조할 수 있는 주제의 축약 형식을 사용합니다.

섀도우는 명명되거나 명명되지 않을(클래식) 수 있습니다. 각 섀도우에 사용되는 주제는 주제 접두사만 다릅니다. 이 표에서는 각 섀도우 유형에서 사용하는 주제 접두사를 보여줍니다.


| *ShadowTopicPrefix* 값 | 섀도우 유형 | 
| --- | --- | 
| \$1aws/things/thingName/shadow | 명명되지 않은(클래식) 섀도우 | 
| \$1aws/things/thingName/shadow/name/shadowName | 명명된 섀도우 | 

**중요**  
앱 또는 서비스의 섀도우 사용이 일관되고 디바이스의 해당 구현에 의해 지원되는지 확인합니다. 예를 들어 섀도우가 생성, 업데이트 및 삭제되는 방법을 고려합니다. 또한 디바이스와, 섀도우를 통해 해당 디바이스에 액세스하는 앱 또는 서비스에서 업데이트가 처리되는 방식을 고려합니다. 디바이스의 상태가 업데이트되고 보고되는 방식과 앱 및 서비스가 디바이스 및 섀도우와 상호 작용하는 방식에 대한 설계가 명확해야 합니다.

전체 주제를 생성하려면 참조할 섀도우 유형에 대해 `ShadowTopicPrefix`를 선택하고 `thingName` 및 `shadowName`(해당하는 경우)을 해당 값으로 바꾸고 다음 표에 표시된 대로 주제 스텁을 추가합니다. 주제는 대/소문자를 구분합니다.

섀도우에 대해 예약된 주제에 대한 자세한 내용은 [섀도우 주제](reserved-topics.md#reserved-topics-shadow) 단원을 참조하세요.

## 에 처음 연결할 때 디바이스 초기화 AWS IoT
<a name="device-shadow-comms-device-first-connect"></a>

디바이스가에 등록한 후에는 지원하는 섀도우에 대해 이러한 MQTT 메시지를 구독 AWS IoT해야 합니다.


| Topic | 의미 | 이 주제를 수신할 때 디바이스가 수행해야 하는 작업 | 
| --- | --- | --- | 
|  `ShadowTopicPrefix/delete/accepted`  |  `delete` 요청이 수락되고 섀도우가 AWS IoT 삭제되었습니다.  |  삭제된 섀도우를 수용하는 데 필요한 작업(예: 업데이트 게시 중지)  | 
|  `ShadowTopicPrefix/delete/rejected`  |  에서 `delete` 요청을 거부 AWS IoT 했으며 섀도우가 삭제되지 않았습니다. 메시지 본문에 오류 정보가 포함되어 있습니다.  |  메시지 본문의 오류 메시지에 대한 응답  | 
|  `ShadowTopicPrefix/get/accepted`  |  에서 `get` 요청을 수락 AWS IoT했으며 메시지 본문에 현재 섀도우 문서가 포함되어 있습니다.  |  메시지 본문에서 상태 문서를 처리하는 데 필요한 작업  | 
|  `ShadowTopicPrefix/get/rejected`  |  에서 `get` 요청을 거부 AWS IoT했으며 메시지 본문에 오류 정보가 포함되어 있습니다.  |  메시지 본문의 오류 메시지에 대한 응답  | 
|  `ShadowTopicPrefix/update/accepted`  |  에서 `update` 요청을 수락 AWS IoT했으며 메시지 본문에 현재 섀도우 문서가 포함되어 있습니다.  |  메시지 본문의 업데이트된 데이터가 디바이스 상태와 일치하는지 확인  | 
|  `ShadowTopicPrefix/update/rejected`  |  에서 `update` 요청을 거부 AWS IoT했으며 메시지 본문에 오류 정보가 포함되어 있습니다.  |  메시지 본문의 오류 메시지에 대한 응답  | 
|  `ShadowTopicPrefix/update/delta`  |  에 대한 요청에 의해 섀도우 문서가 업데이트되었으며 메시지 본문 AWS IoT에 요청된 변경 사항이 포함되어 있습니다.  |  메시지 본문의 원하는 상태와 일치하도록 디바이스의 상태 업데이트  | 
|  `ShadowTopicPrefix/update/documents`  |  섀도우 업데이트가 최근에 완료되었으며 메시지 본문에 현재 섀도우 문서가 포함되어 있습니다.  |  메시지 본문의 업데이트된 상태가 디바이스의 상태와 일치하는지 확인  | 

각 섀도우에 대해 위 표의 메시지를 구독한 후 디바이스는 각 섀도우에 `/get` 주제를 게시하여 지원하는 섀도우가 이미 생성되었는지 테스트해야 합니다. `/get/accepted` 메시지가 수신되면 메시지 본문에 섀도우 문서가 포함되며, 디바이스에서 이 문서를 사용하여 해당 상태를 초기화할 수 있습니다. `/get/rejected` 메시지가 수신되면 현재 디바이스 상태와 함께 `/update` 메시지를 게시하여 섀도우를 생성해야 합니다.

예를 들어, 클래식 섀도우나 명명된 섀도우가 없는 사물 `My_IoT_Thing`이 있다고 가정합니다. 이제 예약된 주제 `$aws/things/My_IoT_Thing/shadow/get`에 대한 `/get` 요청을 게시하면 사물에 섀도우가 없기 때문에 `$aws/things/My_IoT_Thing/shadow/get/rejected` 주제에 대한 오류가 반환됩니다. 이 오류를 해결하려면 먼저 다음 페이로드와 같은 현재 디바이스 상태를 포함하는 `$aws/things/My_IoT_Thing/shadow/update` 주제를 사용하여 `/update` 메시지를 게시합니다.

```
{
	"state": {
		"reported": {
			"welcome": "aws-iot",
			"color": "yellow"
		}
	}
}
```

이제 사물에 대한 클래식 섀도우가 생성되고 메시지가 `$aws/things/My_IoT_Thing/shadow/update/accepted` 주제에 게시됩니다. 주제 `$aws/things/My_IoT_Thing/shadow/get`에 게시하는 경우 디바이스 상태와 함께 `$aws/things/My_IoT_Thing/shadow/get/accepted` 주제에 대한 응답이 반환됩니다.

명명된 섀도우의 경우 get 요청을 사용하기 전에 먼저 명명된 섀도우를 생성하거나 섀도우 이름이 포함된 업데이트를 게시해야 합니다. 예를 들어 명명된 섀도우 `namedShadow1`을 생성하려면 먼저 디바이스 상태 정보를 주제 `$aws/things/My_IoT_Thing/shadow/name/namedShadow1/update`에 게시합니다. 상태 정보를 검색하려면 명명된 섀도우 `$aws/things/My_IoT_Thing/shadow/name/namedShadow1/get`에 대한 `/get` 요청을 사용합니다.

## 디바이스가 연결되어 있는 동안 메시지 처리 AWS IoT
<a name="device-shadow-comms-device-while-connected"></a>

디바이스가 연결되어 있는 동안 **/update/delta** 메시지를 수신할 AWS IoT수 있으며 다음을 통해 디바이스 상태를 섀도우의 변경 사항과 일치해야 합니다.

1. 수신된 모든 **/update/delta** 메시지를 읽고 일치하도록 디바이스 상태를 동기화합니다.

1. 디바이스의 상태가 변경될 때마다 디바이스의 현재 상태가 포함된 `reported` 메시지 본문과 함께 **/update** 메시지 게시.

디바이스가 연결되어 있는 동안 표시된 경우 이러한 메시지를 게시해야 합니다.


| 표시 | Topic | Payload | 
| --- | --- | --- | 
|  디바이스의 상태가 변경되었습니다.  |  `ShadowTopicPrefix/update`  |  `reported` 속성이 있는 섀도우 문서  | 
| 디바이스가 섀도우와 동기화되지 않았을 수 있습니다. |  `ShadowTopicPrefix/get`  | (비어 있음) | 
|  디바이스에 대한 작업은 디바이스가 제거되거나 교체되는 경우와 같이 디바이스에서 더 이상 섀도우를 지원하지 않음을 나타냅니다.  |  `ShadowTopicPrefix/delete`  | (비어 있음) | 

## 디바이스가에 다시 연결될 때 메시지 처리 AWS IoT
<a name="device-shadow-comms-device-reconnect"></a>

하나 이상의 섀도우가 있는 디바이스가 연결되면 다음을 통해 지원하는 모든 섀도우의 상태와 동기화 AWS IoT해야 합니다.

1. 수신된 모든 **/update/delta** 메시지를 읽고 일치하도록 디바이스 상태를 동기화합니다.

1. 디바이스의 현재 상태가 포함된 `reported` 메시지 본문과 함께 **/update** 메시지 게시.