AWS IoT

AWS IoT Device Shadow 활용: 온도 센싱 주기 및 시작/종료 관리

임베디드 친구 2025. 4. 8. 10:51
728x90
반응형

AWS IoT Device Shadow 활용: 온도 센싱 주기 및 시작/종료 관리

1. 개요

AWS IoT를 활용하면 IoT 디바이스를 클라우드에서 효율적으로 관리할 수 있습니다. 특히 AWS IoT Device Shadow는 디바이스의 상태를 저장하고 관리하는 기능을 제공하여, 디바이스가 오프라인 상태에서도 원하는 상태를 유지할 수 있도록 도와줍니다.

이번 포스팅에서는 AWS IoT Device Shadow를 활용하여 온도 센싱 주기를 조절하고, 온도 센싱의 시작 및 종료를 관리하는 방법을 설명하겠습니다. 이를 위해 ESP32 IDF와 AWS IoT Device SDK for Embedded C를 이용한 디바이스 코드Python을 이용한 AWS IoT 서버 코드를 구현해보겠습니다.


2. AWS IoT Device Shadow란?

AWS IoT Device Shadow는 IoT 디바이스의 상태를 JSON 문서 형태로 저장하는 가상 객체입니다. 이를 통해 디바이스의 최신 상태를 클라우드에서 조회 및 수정할 수 있습니다.

Device Shadow 주요 기능

  • 디바이스의 현재 상태(Current State)를 저장
  • 원하는 목표 상태(Desired State)를 설정 가능
  • 디바이스가 오프라인 상태일 때도 설정을 저장하고, 온라인 상태가 되면 동기화 가능
  • MQTT 및 HTTP API를 통해 관리 가능

Device Shadow의 JSON 문서는 다음과 같은 구조를 가집니다:

{
  "state": {
    "desired": {
      "sensor_interval": 10,
      "sensor_status": "on"
    },
    "reported": {
      "sensor_interval": 10,
      "sensor_status": "on"
    }
  }
}

위 JSON에서 desired 상태를 업데이트하면, 디바이스는 이를 읽어 reported 상태로 변경합니다.


3. AWS IoT 설정

AWS IoT Device Shadow를 사용하기 위해 AWS IoT Core에서 필요한 설정을 진행해야 합니다.

1) IoT Thing 등록 및 인증서 발급

  1. AWS 콘솔에서 AWS IoT Core로 이동
  2. Thing(디바이스) 생성
  3. 보안 인증서(Certificate) 생성 및 다운로드
  4. 정책(Policy) 생성 및 할당
  5. MQTT 테스트 클라이언트를 통해 Shadow 업데이트 테스트

2) AWS IoT Policy 설정

아래는 AWS IoT Policy 예제입니다. Shadow를 읽고 수정할 수 있도록 설정해야 합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:UpdateThingShadow",
        "iot:GetThingShadow"
      ],
      "Resource": "arn:aws:iot:region:account-id:thing/MyIoTDevice"
    }
  ]
}

4. ESP32에서 AWS IoT Device Shadow 활용하기

1) 환경 설정

AWS IoT Device SDK for Embedded C를 ESP32 환경에서 사용하려면 다음과 같은 작업이 필요합니다:

  • ESP-IDF 설치
  • AWS IoT 인증서 및 엔드포인트 설정
  • AWS IoT Device SDK for Embedded C 다운로드 및 설정

2) ESP32 코드 구현

아래 코드는 ESP32에서 AWS IoT Device Shadow를 이용해 온도 센싱 주기를 조절하고 시작/종료하는 예제입니다.

#include "aws_iot_shadow_interface.h"
#include "mqtt_client.h"
#include "esp_log.h"

#define AWS_IOT_MQTT_HOST "YOUR_AWS_IOT_ENDPOINT"
#define AWS_IOT_MQTT_PORT 8883
#define AWS_IOT_THING_NAME "MyIoTDevice"

static void shadow_update_callback(const char *payload) {
    cJSON *root = cJSON_Parse(payload);
    cJSON *state = cJSON_GetObjectItem(root, "state");
    cJSON *desired = cJSON_GetObjectItem(state, "desired");

    if (desired) {
        int interval = cJSON_GetObjectItem(desired, "sensor_interval")->valueint;
        const char *status = cJSON_GetObjectItem(desired, "sensor_status")->valuestring;
        ESP_LOGI("SHADOW", "Updated Sensor Interval: %d", interval);
        ESP_LOGI("SHADOW", "Updated Sensor Status: %s", status);
    }
    cJSON_Delete(root);
}

void app_main() {
    aws_iot_shadow_init(AWS_IOT_MQTT_HOST, AWS_IOT_MQTT_PORT, AWS_IOT_THING_NAME);
    aws_iot_shadow_set_callback(shadow_update_callback);
    aws_iot_shadow_start();
}

위 코드에서는 AWS IoT Device Shadow의 변경 사항을 수신하고 이를 로깅합니다.


5. AWS IoT 서버 코드 (Python)

AWS IoT 서버에서는 디바이스의 상태를 업데이트하고, 원하는 값을 설정하는 역할을 합니다. 이를 위해 AWS SDK for Python (boto3)를 활용합니다.

1) 설치 및 설정

pip install boto3

2) Python 코드 구현

아래는 AWS IoT Shadow를 업데이트하는 Python 코드입니다.

import boto3
import json

iot_client = boto3.client('iot-data', region_name='us-west-2')
THING_NAME = "MyIoTDevice"

def update_shadow(sensor_interval, sensor_status):
    payload = {
        "state": {
            "desired": {
                "sensor_interval": sensor_interval,
                "sensor_status": sensor_status
            }
        }
    }
    response = iot_client.update_thing_shadow(
        thingName=THING_NAME,
        payload=json.dumps(payload)
    )
    return response

if __name__ == "__main__":
    update_shadow(15, "off")

위 코드에서 update_shadow(15, "off")센서의 주기를 15초로 설정하고, 센서를 종료하는 요청을 AWS IoT Shadow에 반영합니다.


6. 결론

이 포스팅에서는 AWS IoT Device Shadow를 활용하여 ESP32 기반의 IoT 디바이스에서 온도 센싱 주기를 조절하고 시작/종료를 관리하는 방법을 설명했습니다. AWS IoT Core에서 Shadow를 설정하고, ESP32에서 이를 구독하여 변경 사항을 반영하며, AWS IoT 서버에서 이를 관리하는 과정을 코드와 함께 살펴보았습니다.

이를 응용하면 더 다양한 IoT 디바이스의 원격 제어 및 모니터링 시스템을 구축할 수 있습니다.

반응형