섀도우는 디바이스, 앱 및 기타 클라우드 서비스가 데이터를 공유할 수 있는 신뢰할 수 있는 데이터 스토어를 제공합니다.
AWS IoT에 연결되어 있는 동안 디바이스, 앱 및 기타 클라우드 서비스가 해당 섀도우를 통해 디바이스의 현재 상태에 액세스하고 제어할 수 있습니다.

섀도우를 사용하면 디바이스가 AWS IoT에 연결되어 있는지 여부에 관계없이 앱 및 기타 서비스에서 디바이스의 상태를 사용할 수 있습니다.
디바이스 섀도우 서비스는 중간 역할을 수행하여 디바이스와 애플리케이션이 디바이스의 현재 상태 정보를 검색하고 업데이트할 수 있게 합니다.
AWS IoT는(은) 디바이스 섀도우 작업을 위한 세 가지 메서드를 제공합니다.
프로토콜 지원

전구가 온라인 상태가 되면 전구는 MQTT 메시지를 $aws/things/myLightBulb/shadow/update 주제로 전송하여 현재 상태를 다음 형식의 메시지로 디바이스 섀도우 서비스에 알립니다.
{
"state": {
"reported": {
"color": "red"
}
}
} 빨간색으로 설정하였음을 나타냅니다.
디바이스 섀도우 서비스가 다음 메시지를 $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"
}디바이스 섀도우에 대한 업데이트가 성공적으로 완료되면, 디바이스 섀도우 서비스가 다음 메시지를 $aws/things/myLightBulb/shadow/update/documents 주제에 게시합니다.
{
"previous":null,
"current":{
"state":{
"reported":{
"color":"red"
}
},
"metadata":{
"reported":{
"color":{
"timestamp":1483467764
}
}
},
"version":1
},
"timestamp":1483467764
}[실습] 이 시나리오를 시뮬레이션하기 위해서 AWS IoT MQTT Client를 사용하여 다음 절차를 수행합니다.
$aws/things/myLightBulb/shadow/update 주제에 아래 메시지를 게시합니다.
{
"state": {
"reported": {
"color": "red"
}
}
} 아래 두 주제와 관련된 메시지 수신을 확인합니다.

전구와 상호 작용하는 애플리케이션이 온라인 상태가 되고 전구의 현재 상태를 요청합니다.
디바이스 섀도우 서비스가 $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"
}[실습] 이 시나리오를 시뮬레이션하기 위해서 AWS IoT MQTT Client를 사용하여 다음 절차를 수행합니다.

사용자는 애플리케이션을 통해 디바이스의 전구 색상 변경(빨간색에서 녹색으로)을 요청합니다.
이를 위해 애플리케이션이 $aws/things/myLightBulb/shadow/update 주제에 아래 메시지를 게시합니다.
{
"state": {
"desired": {
"color": "green"
}
}
} 디바이스 섀도우 서비스가 다음 메시지를 $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"
}섀도우 서비스가 업데이트를 수락한 후 그 업데이트된 섀도우에 포함된 원하는 상태 및 보고된 상태의 값이 서로 다른 경우 디바이스 섀도우 서비스가 $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"
}새도우의 업데이트가 완료되면 디바이스 섀도우 서비스가 $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
}전구가 $aws/things/myLightBulb/shadow/update/delta 주제로 구독하고 있으면, 전구는 메시지를 수신하고, 색상을 변경하고, 새 상태를 게시합니다.
디바이스 섀도우 서비스가 다음 주제로 메시지를 전송하여 응답합니다. $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"
}디바이스 섀도우에 대한 업데이트가 성공적으로 완료되면, 디바이스 섀도우 서비스가 다음 메시지를 $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
}[실습] 이 시나리오를 시뮬레이션하기 위해서 AWS IoT MQTT Client를 사용하여 다음 절차를 수행합니다.
$aws/things/myLightBulb/shadow/update 주제에 아래 메시지를 게시합니다.
{
"state": {
"desired": {
"color": "green"
}
}
} 아래 세 주제와 관련된 메시지 수신을 확인합니다.
$aws/things/myLightBulb/shadow/update 주제에 다음 메시지를 게시하여 섀도우 상태를 업데이트합니다.
{
"state":{
"reported":{
"color":"green"
},
"desired":null}
}
}아래 두 주제와 관련된 메시지 수신을 확인합니다.
이 때, $aws/things/myLightBulb/shadow/update/documents 주제의 응답메시지에서 다음과 같은 내용이 포함되어 있는지 확인해봅니다.
{
...
"current": {
"state": {
"reported": {
"color": "green"
}
},
...
}
AWS IoT MQTT Client를 통해 다음 주제를 구독하여, 현재 디바이스 상태 업데이트가 제대로 수신되는 지를 확인한다.

AWS IoT MQTT Client를 통해 다음 주제와 메시지를 지정하여 게시하여, 아두이노의 LED가 켜지는지 확인한다.
메시지
{
"state": {
"desired": {
"LED": "ON"
}
}
}결과 (시리얼 모니터창)

AWS_IoT_DHT11.ino
void loop() {
if (WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
if (!mqttClient.connected()) {
// MQTT client is disconnected, connect
connectMQTT();
}
// poll for new MQTT messages and send keep alives
mqttClient.poll();
// publish a message roughly every 5 seconds.
if (millis() - lastMillis > 5000) {
lastMillis = millis();
char payload[512];
getDeviceStatus(payload);
sendMessage(payload);
}
}
void connectMQTT() {
Serial.print("Attempting to MQTT broker: ");
Serial.print(broker);
Serial.println(" ");
while (!mqttClient.connect(broker, 8883)) {
// failed, retry
Serial.print(".");
delay(5000);
}
Serial.println();
Serial.println("You're connected to the MQTT broker");
Serial.println();
// subscribe to a topic
mqttClient.subscribe("$aws/things/MyMKRWiFi1010/shadow/update/delta");
}
AWS IoT MQTT Client를 통해 다음 주제와 메시지를 지정하여 게시하여, 디바이스의 현재 상태를 얻어온다.
메시지: ""
결과 확인 방법
AWS IoT MQTT Client를 통해 다음 주제를 구독하면, 수신되는 응답 상태 문서에서 디바이스의 현재 상태를 확인할 수 있다.
