

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

# 디바이스 섀도우 서비스 통신 시뮬레이션
<a name="using-device-shadows"></a>

이 주제에서는 디바이스 섀도우 서비스가 중개자 역할을 하는 방법을 보여 주며 디바이스 및 앱에서 섀도우를 사용하여 디바이스 상태를 업데이트, 저장 및 검색할 수 있도록 합니다.

이 주제에 설명된 상호 작용을 시연하고 자세히 살펴보려면 AWS 계정 및를 실행할 수 있는 시스템이 필요합니다 AWS CLI. 이러한 계정과 시스템이 없으면 코드 예제에서 상호 작용을 볼 수 있습니다.

이 예제에서 AWS IoT 콘솔은 디바이스를 나타냅니다. 는 섀도우를 통해 디바이스에 액세스하는 앱 또는 서비스를 AWS CLI 나타냅니다. AWS CLI 인터페이스는 앱이 통신에 사용할 수 있는 API와 매우 유사합니다 AWS IoT. 이 예제의 디바이스는 스마트 전구이며 앱은 전구의 상태를 표시하고 전구의 상태를 변경할 수 있습니다.

## 시뮬레이션 설정
<a name="using-device-shadows-setup"></a>

이 절차에서는 디바이스를 시뮬레이션하는 [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home) 및 앱을 시뮬레이션하는 명령줄 창을 열어 시뮬레이션을 초기화합니다.

**시뮬레이션 환경을 설정하려면**

1. 이 주제의 예제를 직접 실행 AWS 계정 하려면이 필요합니다. 이 없는 경우에 설명된 대로 AWS 계정생성합니다[설정 AWS 계정](setting-up.md).

1. [AWS IoT 콘솔](https://console.aws.amazon.com/iot/home)을 열고 왼쪽 메뉴에서 **테스트**를 선택하여 **MQTT 클라이언트**를 엽니다.

1. 다른 창을 열고 AWS CLI 가 설치된 시스템에서 터미널 창을 엽니다.

두 개의 창이 열려 있어야 합니다. 하나는 **테스트** 페이지에 AWS IoT 콘솔이 있고 다른 하나는 명령줄 프롬프트가 있습니다.

## 디바이스 초기화
<a name="using-device-shadows-init-device"></a>

이 시뮬레이션에서는 *mySimulatedThing*이라는 이름의 사물 객체와 *simShadow1*이라는 해당 섀도우로 작업합니다.

**사물 객체 및 해당 IoT 정책 생성**  
사물을 생성하려면, **AWS IoT 콘솔**에서:

1. **관리(Manage)**를 선택한 후 **사물(Things)**을 선택합니다.

1. 사물이 나열되면 **생성** 버튼을 클릭합니다. 그렇지 않으면 **단일 사물 등록**을 클릭하여 단일 AWS IoT 사물을 생성합니다.

1. 이름 `mySimulatedThing`을 입력하고 다른 설정은 기본값으로 그대로 둔 채 **다음(Next)**을 클릭합니다.

1. 원 클릭 인증서 생성을 사용하여 AWS IoT에 대한 디바이스 연결을 인증할 인증서를 생성합니다. 인증서를 활성화하려면 **활성화(Activate)**를 클릭합니다.

1. MQTT 예약 주제를 게시 및 구독할 수 있는 권한을 디바이스에 부여하는 정책 `My_IoT_Policy`를 연결할 수 있습니다. AWS IoT 사물을 생성하는 방법과이 정책을 생성하는 방법에 대한 자세한 단계는 섹션을 참조하세요[사물 객체 만들기](create-iot-resources.md#create-aws-thing).

**사물 객체에 대한 명명된 섀도우 생성**  
아래에 설명된 대로 주제 `$aws/things/mySimulatedThing/shadow/name/simShadow1/update`에 업데이트 요청을 게시하여 사물에 대한 명명된 섀도우를 생성할 수 있습니다.

또는 명명된 섀도를 생성하려면:

1. **AWS IoT 콘솔**의 표시된 사물 목록에서 사물 객체를 선택한 다음 **섀도우(Shadows)**를 선택합니다.

1. **섀도우 추가(Add a shadow)**를 선택하고 이름 `simShadow1`을 입력한 다음 **생성(Create)**을 선택하여 명명된 섀도우를 추가합니다.

**예약된 MQTT 주제를 구독하고 주제에 게시**  
콘솔에서, 예약된 MQTT 섀도우 주제를 구독합니다. 이러한 주제는 `get`, `update` 및 `delete` 작업에 대한 응답으로, 디바이스에서 작업을 게시한 후 응답을 받을 수 있습니다.

****MQTT 클라이언트**에서 MQTT 주제를 구독하려면**

1. **MQTT 클라이언트(MQTT client)**에서 **주제 구독(Subscribe to a topic)**을 선택합니다.

1. 구독할 `get`, `update` 및 `delete` 주제를 입력합니다. 다음 목록에서 한 번에 하나의 주제를 복사하여 **주제 필터(Topic filter)** 필드에 붙여넣고 **구독(Subscribe)**을 클릭합니다. **구독(Subscriptions)** 아래에 주제가 표시되어야 합니다.
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/delete/accepted`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/delete/rejected`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta`
   + `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/documents`

   이 시점에서 시뮬레이션된 디바이스는 AWS IoT에서 게시하는 주제를 수신할 준비가 되었습니다.

****MQTT 클라이언트**에서 MQTT 주제에 게시하려면**  
디바이스가 자체적으로 초기화되고 응답 주제를 구독한 후에는 지원하는 섀도우를 쿼리해야 합니다. 이 시뮬레이션은 *mySimulatedThing*이라는 사물 객체를 지원하는 *simShadow1*이라는 이름의 섀도우 하나만 지원합니다.

****MQTT 클라이언트**에서 현재 섀도우 상태를 가져오려면**

1. **MQTT 클라이언트**에서 **주제에 게시(Publish to a topic)**를 선택합니다.

1. **게시(Publish)** 아래에서, 다음 주제를 입력하고 메시지 본문 창에서 가져올 주제의 입력 위치 아래에 있는 내용을 모두 삭제합니다. 그런 다음 **주제에 게시(Publish to topic)**를 선택하여 요청을 게시합니다. `$aws/things/mySimulatedThing/shadow/name/simShadow1/get`.

   명명된 섀도우 `simShadow1`을 생성하지 않은 경우, 섀도우가 생성되지 않았으므로 이 예제와 같이 `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected` 주제에 메시지가 수신되고 `code`는 `404`입니다. 이것을 다음에 생성하겠습니다.

   ```
   {
     "code": 404,
     "message": "No shadow exists with name: 'simShadow1'"
   }
   ```

**디바이스의 현재 상태로 섀도우를 생성하려면**

1. **MQTT 클라이언트**에서, **주제에 게시(Publish to a topic)**를 선택하여 다음 주제를 입력합니다.

   ```
   $aws/things/mySimulatedThing/shadow/name/simShadow1/update
   ```

1. 메시지 본문 창에서 주제의 입력 위치 아래에 다음 섀도우 문서를 입력하여 디바이스가 해당 ID와 현재 색상(RGB 값)을 보고하고 있음을 표시합니다. **게시(Publish)**를 선택하여 요청을 게시합니다.

   ```
   {
     "state": {
       "reported": {
         "ID": "SmartLamp21",
         "ColorRGB": [
           128,
           128,
           128
         ]
       }
     },
     "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6"
   }
   ```

다음 주제에서 메시지를 수신한 경우: 
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted`: 섀도우가 생성되고 메시지 본문에 현재 섀도우 문서가 포함되어 있음을 의미합니다.
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected`: 메시지 본문의 오류를 검토합니다.
+ `$aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted`: 섀도우가 이미 존재하며 메시지 본문에 다음 예와 같은 현재 섀도우 상태가 포함됩니다. 이를 통해 디바이스를 설정하거나 섀도우 상태와 일치하는지 확인할 수 있습니다.

  ```
  {
    "state": {
      "reported": {
        "ID": "SmartLamp21",
        "ColorRGB": [
          128,
          128,
          128
        ]
      }
    },
    "metadata": {
      "reported": {
        "ID": {
          "timestamp": 1591140517
        },
        "ColorRGB": [
          {
            "timestamp": 1591140517
          },
          {
            "timestamp": 1591140517
          },
          {
            "timestamp": 1591140517
          }
        ]
      }
    },
    "version": 3,
    "timestamp": 1591140517,
    "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6"
  }
  ```

## 앱에서 업데이트 전송하기
<a name="using-device-shadows-app-update"></a>

이 섹션에서는 AWS CLI 를 사용하여 앱이 섀도우와 상호 작용하는 방법을 보여줍니다.

**를 사용하여 섀도우의 현재 상태를 가져오려면 AWS CLI**  
명령줄에서 다음 명령을 입력합니다.

```
aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout
```

Windows 플랫폼에서는 `/dev/stdout` 대신 `con`을 사용할 수 있습니다.

```
aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 con
```

섀도우가 존재하고 현재 상태를 반영하기 위해 디바이스에 의해 초기화되었기 때문에 다음 섀도우 문서를 반환해야 합니다.

```
{
  "state": {
    "reported": {
      "ID": "SmartLamp21",
      "ColorRGB": [
        128,
        128,
        128
      ]
    }
  },
  "metadata": {
    "reported": {
      "ID": {
        "timestamp": 1591140517
      },
      "ColorRGB": [
        {
          "timestamp": 1591140517
        },
        {
          "timestamp": 1591140517
        },
        {
          "timestamp": 1591140517
        }
      ]
    }
  },
  "version": 3,
  "timestamp": 1591141111
}
```

앱은 이 응답을 사용하여 디바이스 상태의 표현을 초기화할 수 있습니다.

앱이 상태를 업데이트하면(예: 최종 사용자가 스마트 전구의 색상을 노란색으로 변경한 경우) 앱에서 **update-thing-shadow** 명령을 전송합니다. 이 명령은 `UpdateThingShadow` REST API에 해당합니다.

**앱에서 섀도우를 업데이트하려면**  
명령줄에서 다음 명령을 입력합니다.

------
#### [ AWS CLI v2.x ]

```
aws iot-data update-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 \
    --cli-binary-format raw-in-base64-out \
    --payload '{"state":{"desired":{"ColorRGB":[255,255,0]}},"clientToken":"21b21b21-bfd2-4279-8c65-e2f697ff4fab"}' /dev/stdout
```

------
#### [ AWS CLI v1.x ]

```
aws iot-data update-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 \
    --payload '{"state":{"desired":{"ColorRGB":[255,255,0]}},"clientToken":"21b21b21-bfd2-4279-8c65-e2f697ff4fab"}' /dev/stdout
```

------

성공한 경우 이 명령은 다음 섀도우 문서를 반환해야 합니다.

```
{
  "state": {
    "desired": {
      "ColorRGB": [
        255,
        255,
        0
      ]
    }
  },
  "metadata": {
    "desired": {
      "ColorRGB": [
        {
          "timestamp": 1591141596
        },
        {
          "timestamp": 1591141596
        },
        {
          "timestamp": 1591141596
        }
      ]
    }
  },
  "version": 4,
  "timestamp": 1591141596,
  "clientToken": "21b21b21-bfd2-4279-8c65-e2f697ff4fab"
}
```

## 디바이스의 업데이트에 응답
<a name="using-device-shadows-device-update"></a>

 AWS 콘솔에서 **MQTT 클라이언트**로 돌아가면 이전 섹션에서 실행된 업데이트 명령을 반영하기 위해가 AWS IoT 게시한 메시지가 표시됩니다.

****MQTT 클라이언트**에서 업데이트 메시지를 보려면**  
**MQTT 클라이언트**의 **구독(Subscriptions)** 열에서 **\$1aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta**를 선택합니다. 주제 이름이 잘리는 경우 커서를 그 위에 잠시 두면 전체 주제 이름이 표시됩니다. 이 주제의 주제 로그에 다음과 유사한 `/delta` 메시지가 표시되어야 합니다.

```
{
  "version": 4,
  "timestamp": 1591141596,
  "state": {
    "ColorRGB": [
      255,
      255,
      0
    ]
  },
  "metadata": {
    "ColorRGB": [
      {
        "timestamp": 1591141596
      },
      {
        "timestamp": 1591141596
      },
      {
        "timestamp": 1591141596
      }
    ]
  },
  "clientToken": "21b21b21-bfd2-4279-8c65-e2f697ff4fab"
}
```

디바이스에서 이 메시지의 콘텐츠를 처리하여 디바이스 상태를 메시지의 `desired` 상태와 일치하도록 설정합니다.

디바이스가 메시지의 상태와 일치하도록 `desired` 상태를 업데이트한 후에는 업데이트 메시지를 게시 AWS IoT 하여 새로 보고된 상태를 로 다시 보내야 합니다. 이 절차는 **MQTT 클라이언트**에서 시뮬레이션합니다.

**디바이스에서 섀도우를 업데이트하려면**

1. **MQTT 클라이언트**에서 **주제에 게시(Publish to a topic)**를 선택합니다.

1. 메시지 본문 창에서 메시지 본문 창 위의 주제 필드에 섀도우의 주제와 `/update` 작업: `$aws/things/mySimulatedThing/shadow/name/simShadow1/update`를 입력하고 메시지 본문에 디바이스의 현재 상태를 설명하는 다음과 같은 업데이트된 섀도우 문서를 입력합니다. **게시(Publish)**를 클릭하여 업데이트된 디바이스 상태를 게시합니다.

   ```
   {
     "state": {
       "reported": {
         "ColorRGB": [255,255,0]
         }
     },
     "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258"
   }
   ```

   에서 메시지를 성공적으로 수신한 경우이 예제와 같이 **MQTT 클라이언트**의 **\$1aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted** 메시지 로그에 현재 섀도우 상태가 포함된 새 응답이 AWS IoT표시됩니다.

   ```
   {
     "state": {
       "reported": {
         "ColorRGB": [
           255,
           255,
           0
         ]
       }
     },
     "metadata": {
       "reported": {
         "ColorRGB": [
           {
             "timestamp": 1591142747
           },
           {
             "timestamp": 1591142747
           },
           {
             "timestamp": 1591142747
           }
         ]
       }
     },
     "version": 5,
     "timestamp": 1591142747,
     "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258"
   }
   ```

또한 디바이스의 보고된 상태를 성공적으로 업데이트하면 AWS IoT 가 이전 절차에서 디바이스가 수행한 섀도우 업데이트로 인해 발생한이 메시지 본문과 같은 메시지의 섀도우 상태에 대한 포괄적인 설명을 `update/documents` 주제에 전송합니다.

```
{
  "previous": {
    "state": {
      "desired": {
        "ColorRGB": [
          255,
          255,
          0
        ]
      },
      "reported": {
        "ID": "SmartLamp21",
        "ColorRGB": [
          128,
          128,
          128
        ]
      }
    },
    "metadata": {
      "desired": {
        "ColorRGB": [
          {
            "timestamp": 1591141596
          },
          {
            "timestamp": 1591141596
          },
          {
            "timestamp": 1591141596
          }
        ]
      },
      "reported": {
        "ID": {
          "timestamp": 1591140517
        },
        "ColorRGB": [
          {
            "timestamp": 1591140517
          },
          {
            "timestamp": 1591140517
          },
          {
            "timestamp": 1591140517
          }
        ]
      }
    },
    "version": 4
  },
  "current": {
    "state": {
      "desired": {
        "ColorRGB": [
          255,
          255,
          0
        ]
      },
      "reported": {
        "ID": "SmartLamp21",
        "ColorRGB": [
          255,
          255,
          0
        ]
      }
    },
    "metadata": {
      "desired": {
        "ColorRGB": [
          {
            "timestamp": 1591141596
          },
          {
            "timestamp": 1591141596
          },
          {
            "timestamp": 1591141596
          }
        ]
      },
      "reported": {
        "ID": {
          "timestamp": 1591140517
        },
        "ColorRGB": [
          {
            "timestamp": 1591142747
          },
          {
            "timestamp": 1591142747
          },
          {
            "timestamp": 1591142747
          }
        ]
      }
    },
    "version": 5
  },
  "timestamp": 1591142747,
  "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258"
}
```

## 앱에서 업데이트 관찰
<a name="using-device-shadows-view-result"></a>

이제 앱이 디바이스에서 보고한 대로 섀도우에 현재 상태를 쿼리할 수 있습니다.

**를 사용하여 섀도우의 현재 상태를 가져오려면 AWS CLI**

1. 명령줄에서 다음 명령을 입력합니다.

   ```
   aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout
   ```

   Windows 플랫폼에서는 `/dev/stdout` 대신 `con`을 사용할 수 있습니다.

   ```
   aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 con
   ```

1. 현재 상태를 반영하기 위해 디바이스에 의해 섀도우가 방금 업데이트되었기 때문에 다음 섀도우 문서를 반환해야 합니다.

   ```
   {
     "state": {
       "desired": {
         "ColorRGB": [
           255,
           255,
           0
         ]
       },
       "reported": {
         "ID": "SmartLamp21",
         "ColorRGB": [
           255,
           255,
           0
         ]
       }
     },
     "metadata": {
       "desired": {
         "ColorRGB": [
           {
             "timestamp": 1591141596
           },
           {
             "timestamp": 1591141596
           },
           {
             "timestamp": 1591141596
           }
         ]
       },
       "reported": {
         "ID": {
           "timestamp": 1591140517
         },
         "ColorRGB": [
           {
             "timestamp": 1591142747
           },
           {
             "timestamp": 1591142747
           },
           {
             "timestamp": 1591142747
           }
         ]
       }
     },
     "version": 5,
     "timestamp": 1591143269
   }
   ```

## 시뮬레이션 이후의 작업
<a name="using-device-shadows-next-steps"></a>

 AWS CLI (앱을 나타냄)와 콘솔(디바이스를 나타냄) 사이의 상호 작용을 실험하여 IoT 솔루션을 모델링합니다.