Device Shadow Service

1. 개요

2. 디바이스 섀도우 서비스를 이용한 디바이스 상태 수집 및 제어


2.1 디바이스 섀도우 서비스


2.2 디바이스 섀도우 서비스 사용 시나리오


2.2.1 디바이스 상태가 변경되는 경우

  1. 전구가 온라인 상태가 되면 전구는 MQTT 메시지를 $aws/things/myLightBulb/shadow/update 주제로 전송하여 현재 상태를 다음 형식의 메시지로 디바이스 섀도우 서비스에 알립니다.

    {
        "state": {
            "reported": {
                "color": "red"
            }
        }
    } 
  2. 디바이스 섀도우 서비스가 다음 메시지를 $aws/things/myLightBulb/shadow/update/accepted 주제로 전송하여 응답합니다.

    {
      "messageNumber": 4,
      "payload": {
        "state": {
          "reported": {
            "color": "red"
          }
        },
        "metadata": {
          "reported": {
            "color": {
              "timestamp": 1469564492
            }
          }
        },
        "version": 1,
        "timestamp": 1469564492
      },
      "qos": 0,
      "timestamp": 1469564492848,
      "topic": "$aws/things/myLightBulb/shadow/update/accepted"
    }
  3. 디바이스 섀도우에 대한 업데이트가 성공적으로 완료되면, 디바이스 섀도우 서비스가 다음 메시지를 $aws/things/myLightBulb/shadow/update/documents 주제에 게시합니다.

    {
        "previous":null,
        "current":{
            "state":{
                "reported":{
                    "color":"red"
                }
             },
             "metadata":{
                "reported":{
                    "color":{
                        "timestamp":1483467764
                    }
                }
             },
             "version":1
         },
         "timestamp":1483467764
    }

2.2.2 애플리케이션이 디바이스의 상태 정보를 요청하는 경우

  1. 전구와 상호 작용하는 애플리케이션이 온라인 상태가 되고 전구의 현재 상태를 요청합니다.

  2. 디바이스 섀도우 서비스가 $aws/things/myLightBulb/shadow/get/accepted 주제에 요청된 섀도우를 게시하여 응답합니다.

    {
      "messageNumber": 1,
      "payload": {
        "state": {
          "reported": {
            "color": "red"
          }
        },
        "metadata": {
          "reported": {
            "color": {
              "timestamp": 1469564492
            }
          }
        },
        "version": 1,
        "timestamp": 1469564571
      },
      "qos": 0,
      "timestamp": 1469564571533,
      "topic": "$aws/things/myLightBulb/shadow/get/accepted"
    }

2.2.3 애플리케이션이 디바이스의 상태 변경을 요청하는 경우

  1. 사용자는 애플리케이션을 통해 디바이스의 전구 색상 변경(빨간색에서 녹색으로)을 요청합니다.

  2. 디바이스 섀도우 서비스가 다음 메시지를 $aws/things/myLightBulb/shadow/update/accepted 주제로 전송하여 응답합니다.

    {
      "messageNumber": 5,
      "payload": {
        "state": {
          "desired": {
            "color": "green"
          }
        },
        "metadata": {
          "desired": {
            "color": {
              "timestamp": 1469564658
            }
          }
        },
        "version": 2,
        "timestamp": 1469564658
      },
      "qos": 0,
      "timestamp": 1469564658286,
      "topic": "$aws/things/myLightBulb/shadow/update/accepted"
    }
  3. 섀도우 서비스가 업데이트를 수락한 후 그 업데이트된 섀도우에 포함된 원하는 상태 및 보고된 상태의 값이 서로 다른 경우 디바이스 섀도우 서비스가 $aws/things/myLightBulb/shadow/update/delta 주제로 다음 메시지를 게시합니다.

    {
      "messageNumber": 1,
      "payload": {
        "version": 2,
        "timestamp": 1469564658,
        "state": {
          "color": "green"
        },
        "metadata": {
          "color": {
            "timestamp": 1469564658
          }
        }
      },
      "qos": 0,
      "timestamp": 1469564658309,
      "topic": "$aws/things/myLightBulb/shadow/update/delta"
    }
  4. 새도우의 업데이트가 완료되면 디바이스 섀도우 서비스가 $aws/things/myLightBulb/shadow/update/documents 주제에 다음 메시지를 게시합니다.

    {
        "previous":{
          "state":{
            "reported":{
              "color":"red"
            }
          },
          "metadata":{
            "reported":{
              "color":{
                "timestamp":1483467764
              }
            }
          },
          "version":1
        },
        "current":{
          "state":{
            "desired":{
              "color":"green"
            },
            "reported":{
              "color":"red"
            }
          },
          "metadata":{
            "desired":{
              "color":{
                "timestamp":1483468612
              }
            },
            "reported":{
              "color":{
                "timestamp":1483467764
              }
            }
          },
          "version":2
        },
        "timestamp":1483468612
    }
  5. 전구가 $aws/things/myLightBulb/shadow/update/delta 주제로 구독하고 있으면, 전구는 메시지를 수신하고, 색상을 변경하고, 새 상태를 게시합니다.

  6. 디바이스 섀도우 서비스가 다음 주제로 메시지를 전송하여 응답합니다. $aws/things/myLightBulb/shadow/update/accepted 주제로 메시지를 전송합니다.

    {
      "messageNumber": 6,
      "payload": {
        "state": {
          "reported": {
            "color": "green"
          },
          "desired": null
        },
        "metadata": {
          "reported": {
            "color": {
              "timestamp": 1469564801
            }
          },
          "desired": {
            "timestamp": 1469564801
          }
        },
        "version": 3,
        "timestamp": 1469564801
      },
      "qos": 0,
      "timestamp": 1469564801673,
      "topic": "$aws/things/myLightBulb/shadow/update/accepted"
    }
  7. 디바이스 섀도우에 대한 업데이트가 성공적으로 완료되면, 디바이스 섀도우 서비스가 다음 메시지를 $aws/things/myLightBulb/shadow/update/documents 주제에 게시합니다.

    {
        "previous":{
        "state":{
          "reported":{
            "color":"red"
          }
        },
        "metadata":{
             "reported":{
                  "color":{
                      "timestamp":1483470355
                  }
              }
          },
          "version":3
        },
        "current":{
          "state":{
            "reported":{
              "color":"green"
            }
          },
          "metadata":{
            "reported":{
              "color":{
                "timestamp":1483470364
              }
            }
          },
          "version":4
        },
        "timestamp":1483470364
    }
  8. [실습] 이 시나리오를 시뮬레이션하기 위해서 AWS IoT MQTT Client를 사용하여 다음 절차를 수행합니다.

    1. 다음 세 개의 주제를 구독합니다.
      • $aws/things/myLightBulb/shadow/update/accepted
      • $aws/things/myLightBulb/shadow/update/documents
      • $aws/things/myLightBulb/shadow/update/delta
    2. $aws/things/myLightBulb/shadow/update 주제에 아래 메시지를 게시합니다.

      {
          "state": {
              "desired": {
                  "color": "green" 
              } 
          }
      } 
    3. 아래 세 주제와 관련된 메시지 수신을 확인합니다.

      • $aws/things/myLightBulb/shadow/update/accepted
      • $aws/things/myLightBulb/shadow/update/documents
      • $aws/things/myLightBulb/shadow/update/delta
    4. $aws/things/myLightBulb/shadow/update 주제에 다음 메시지를 게시하여 섀도우 상태를 업데이트합니다.

      {
          "state":{
              "reported":{
                  "color":"green"
              },
              "desired":null}
          }
      }
    5. 아래 두 주제와 관련된 메시지 수신을 확인합니다.

      • $aws/things/myLightBulb/shadow/update/accepted
      • $aws/things/myLightBulb/shadow/update/documents
      • 이 때, $aws/things/myLightBulb/shadow/update/documents 주제의 응답메시지에서 다음과 같은 내용이 포함되어 있는지 확인해봅니다.

        {
          ...
          "current": {
            "state": {
              "reported": {
                "color": "green"
              }
            },
            ...
         }
        • 이 메시지는 애플리케이션에 의해 요청 된 내용 (디바이스의 전구 색상 변경(빨간색에서 녹색으로)을 요청)이 반영되었음을 나타냅니다.

3. 아두이노와 연결된 디바이스 섀도우 서비스 실습

실습 준비

  1. AWS_IoT_DHT11을 다운로드하여 Arduino IDE에서 실행한다.
  2. arduino_secrets.h에서 다음 항목을 사용 환경에 맞도록 수정후, 빌드/업로드 한다.
  3. 아두이노 IDE의 시리얼 모니터를 열고, 접속이 제대로 이루어지는 지 확인해 본다.

3.1 디바이스 상태가 변경되는 경우

3.2 애플리케이션이 디바이스의 상태 변경을 요청 하는 경우

3.2 애플리케이션이 디바이스의 현재 상태 정보를 요청 하는 경우