AWS IoT

AWS IoT Shadow를 활용한 디바이스 상태 관리

임베디드 친구 2025. 4. 6. 09:50
728x90
반응형

AWS IoT Shadow를 활용한 디바이스 상태 관리

AWS IoT를 활용하면 IoT 디바이스와 클라우드 간의 원활한 통신을 구축할 수 있습니다. 특히 AWS IoT Shadow는 디바이스의 상태를 클라우드에 저장하고, 동기화할 수 있도록 지원하는 강력한 기능입니다. Shadow는 디바이스가 오프라인 상태일 때도 최신 상태 정보를 유지하며, 서버와 애플리케이션이 지속적으로 디바이스의 상태를 관리할 수 있도록 돕습니다.

이번 포스팅에서는 AWS IoT Shadow를 활용하여 ESP32 디바이스의 상태를 관리하는 방법을 다루고, AWS IoT Device SDK for Embedded CAWS IoT Core를 활용하여 ESP32에서 Shadow 기능을 구현하는 예제를 소개하겠습니다. 또한, Python 기반의 AWS IoT 서버 코드를 작성하여 디바이스의 상태를 확인하고 제어하는 방법도 설명합니다.


1. AWS IoT Shadow란?

AWS IoT Shadow는 JSON 문서 형식으로 디바이스의 상태를 저장하고 관리할 수 있도록 해주는 기능입니다. 주요 특징은 다음과 같습니다:

  • 디바이스 상태 저장: 클라우드에 디바이스의 최신 상태를 저장합니다.
  • 비연결 상태에서도 상태 유지: 디바이스가 오프라인 상태일 때도 최신 상태를 유지합니다.
  • 서버와 애플리케이션에서 디바이스 상태 제어 가능: 디바이스의 상태를 원격에서 변경할 수 있습니다.
  • 자동 동기화: 디바이스가 온라인 상태로 돌아오면 변경된 상태를 자동으로 반영합니다.

AWS IoT Shadow는 다음과 같은 JSON 문서 구조를 사용합니다:

{
  "state": {
    "desired": {
      "temperature": 25,
      "status": "on"
    },
    "reported": {
      "temperature": 22,
      "status": "on"
    }
  }
}
  • desired: 클라우드에서 설정하고자 하는 값
  • reported: 디바이스에서 현재 보고한 값
  • delta: desiredreported의 차이를 나타내며, 디바이스가 수행해야 할 변경 사항을 의미

2. AWS IoT Core에서 Shadow 설정하기

2.1 AWS IoT Thing 생성 및 Shadow 활성화

  1. AWS 콘솔에서 AWS IoT Core로 이동합니다.
  2. Manage → Things로 이동하여 새로운 Thing을 생성합니다.
  3. 생성한 Thing을 선택한 후 Shadow 탭에서 Shadow를 활성화합니다.
  4. Policy 설정: AWS IoT Shadow를 사용하려면 적절한 정책을 설정해야 합니다. 아래와 같이 JSON 정책을 추가합니다.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:UpdateThingShadow",
        "iot:GetThingShadow"
      ],
      "Resource": "arn:aws:iot:region:account-id:thing/MyESP32"
    }
  ]
}
  1. 생성된 인증서를 ESP32에 적용하여 MQTT를 통해 Shadow 기능을 사용할 수 있도록 합니다.

3. ESP32에서 AWS IoT Shadow 사용하기

ESP32는 AWS IoT Device SDK for Embedded C를 활용하여 Shadow를 관리할 수 있습니다. 아래는 기본적인 Shadow 업데이트 코드입니다.

3.1 ESP32 코드 (C 언어)

#include "aws_iot_shadow_interface.h"
#include "aws_iot_mqtt_client_interface.h"
#include <stdio.h>

#define AWS_IOT_MQTT_HOST "<AWS_ENDPOINT>"
#define AWS_IOT_MQTT_PORT 8883
#define THING_NAME "MyESP32"

void update_shadow(AWS_IoT_Client *client) {
    char shadow_update[256];
    snprintf(shadow_update, sizeof(shadow_update),
        "{\"state\":{\"reported\":{\"temperature\":22,\"status\":\"on\"}}}"
    );
    IoT_Publish_Message_Params params;
    params.qos = QOS0;
    params.payload = (void *)shadow_update;
    params.payloadLen = strlen(shadow_update);
    aws_iot_shadow_update(client, THING_NAME, shadow_update, NULL, NULL, 4, true);
}

void app_main() {
    AWS_IoT_Client client;
    aws_iot_mqtt_init(&client);
    aws_iot_mqtt_connect(&client);
    update_shadow(&client);
    aws_iot_mqtt_disconnect(&client);
}

위 코드에서 update_shadow 함수는 AWS IoT Shadow에 temperature 값을 업데이트하는 역할을 합니다.


4. Python을 이용한 AWS IoT Shadow 조회 및 제어

Shadow 상태를 조회하고 제어하는 Python 예제 코드를 작성해 보겠습니다.

4.1 AWS IoT Shadow 조회 (Python)

import boto3
import json

THING_NAME = "MyESP32"
iot_client = boto3.client('iot-data', region_name='us-east-1')

def get_shadow():
    response = iot_client.get_thing_shadow(thingName=THING_NAME)
    payload = json.loads(response['payload'].read())
    print(json.dumps(payload, indent=4))

get_shadow()

4.2 AWS IoT Shadow 업데이트 (Python)

import boto3
import json

THING_NAME = "MyESP32"
iot_client = boto3.client('iot-data', region_name='us-east-1')

def update_shadow(temperature, status):
    payload = {
        "state": {
            "desired": {
                "temperature": temperature,
                "status": status
            }
        }
    }
    iot_client.update_thing_shadow(
        thingName=THING_NAME,
        payload=json.dumps(payload)
    )
    print(f"Updated Shadow: {payload}")

update_shadow(25, "off")

위 Python 코드는 AWS IoT Core에서 Shadow 상태를 조회하고 업데이트하는 기능을 수행합니다.


5. 결론

AWS IoT Shadow는 IoT 디바이스의 상태를 효율적으로 관리할 수 있도록 해주는 중요한 기능입니다. ESP32에서 AWS IoT Device SDK를 이용하여 Shadow를 업데이트하고, Python을 이용해 Shadow 상태를 조회하고 제어하는 방법을 소개하였습니다. 이를 활용하면 다양한 IoT 애플리케이션에서 디바이스 상태를 관리할 수 있습니다.

이제 AWS IoT Shadow를 활용하여 보다 정교한 IoT 시스템을 구축해 보시길 바랍니다.

반응형