AWS IoT SDK를 이용한 ESP32 IDF 디바이스 프로그래밍
1. 개요
AWS IoT는 클라우드 기반의 IoT 솔루션을 제공하는 서비스로, 다양한 IoT 디바이스와 서버 간의 원활한 연결을 가능하게 합니다. 이번 포스팅에서는 ESP32 IDF(ESP-IDF)와 AWS IoT Device SDK for Embedded C를 활용하여 AWS IoT Core와 연결하는 방법을 설명하겠습니다.
본 가이드를 따르면 ESP32를 이용해 AWS IoT Core와 통신하고, 온도 데이터를 주기적으로 업로드하는 IoT 디바이스를 만들 수 있습니다.
2. AWS IoT Core 설정
AWS IoT와 ESP32 간의 통신을 위해 먼저 AWS IoT Core를 설정해야 합니다.
2.1 AWS IoT Thing 등록
- AWS IoT 콘솔에 접속합니다.
- Manage > Things로 이동하여 Create things를 클릭합니다.
- Single thing을 선택하고 Thing name을 입력합니다.
- Device Shadow 설정을 기본값으로 유지하고 Next를 클릭합니다.
- Auto-generate a new certificate를 선택하여 디바이스 인증서를 생성합니다.
- Attach policies 단계에서 권한을 부여할 정책을 선택합니다. 정책을 생성하려면 다음 내용을 포함한 정책을 추가합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish",
"iot:Subscribe",
"iot:Receive",
"iot:Connect"
],
"Resource": "*"
}
]
}
- Thing, 인증서, 정책이 정상적으로 생성되었는지 확인한 후 인증서를 다운로드합니다.
- Root CA 인증서를 다운로드하고 저장합니다.
2.2 MQTT 엔드포인트 확인
- AWS IoT 콘솔에서 Settings로 이동합니다.
- Device data endpoint 값을 확인하고 기록해 둡니다.
3. ESP32 AWS IoT 코드 구현
이제 ESP32에서 AWS IoT에 연결하는 코드를 작성해 보겠습니다.
3.1 프로젝트 구조
프로젝트 디렉토리는 아래와 같이 구성됩니다.
├── main
│ ├── main.c
│ ├── aws_iot_config.h
│ ├── mqtt_client.c
│ ├── mqtt_client.h
├── CMakeLists.txt
└── sdkconfig
3.2 aws_iot_config.h
파일 설정
AWS IoT Core와 연결하기 위해 aws_iot_config.h 파일을 생성하고 아래 내용을 입력합니다.
#ifndef AWS_IOT_CONFIG_H
#define AWS_IOT_CONFIG_H
#define AWS_IOT_MQTT_HOST "your-iot-endpoint.amazonaws.com"
#define AWS_IOT_MQTT_PORT 8883
#define AWS_IOT_MQTT_CLIENT_ID "ESP32_Device"
#define AWS_IOT_MY_THING_NAME "MyESP32Thing"
#define AWS_IOT_ROOT_CA_PATH "certs/AmazonRootCA1.pem"
#define AWS_IOT_CERTIFICATE_PATH "certs/device-cert.pem"
#define AWS_IOT_PRIVATE_KEY_PATH "certs/device-private.pem"
#endif
3.3 mqtt_client.c
구현
#include "mqtt_client.h"
#include "aws_iot_config.h"
#include <stdio.h>
static esp_mqtt_client_handle_t client;
void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {
esp_mqtt_event_handle_t event = event_data;
switch (event->event_id) {
case MQTT_EVENT_CONNECTED:
printf("MQTT Connected\n");
esp_mqtt_client_subscribe(client, "esp32/temperature", 1);
break;
case MQTT_EVENT_DISCONNECTED:
printf("MQTT Disconnected\n");
break;
case MQTT_EVENT_DATA:
printf("Received: %.*s\n", event->data_len, event->data);
break;
default:
break;
}
}
void mqtt_app_start(void) {
esp_mqtt_client_config_t mqtt_cfg = {
.uri = "mqtts://" AWS_IOT_MQTT_HOST,
.port = AWS_IOT_MQTT_PORT,
.client_id = AWS_IOT_MQTT_CLIENT_ID,
.cert_pem = AWS_IOT_ROOT_CA_PATH,
.client_cert_pem = AWS_IOT_CERTIFICATE_PATH,
.client_key_pem = AWS_IOT_PRIVATE_KEY_PATH
};
client = esp_mqtt_client_init(&mqtt_cfg);
esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
esp_mqtt_client_start(client);
}
4. Python을 이용한 AWS IoT 서버 구현
AWS IoT로부터 온도 데이터를 받아 처리하는 서버를 Python으로 작성합니다.
4.1 Python MQTT 클라이언트 설치
Python에서 MQTT를 사용하기 위해 paho-mqtt 라이브러리를 설치합니다.
pip install paho-mqtt
4.2 AWS IoT 서버 코드
아래는 AWS IoT에서 온도 데이터를 수신하여 로그를 출력하는 예제입니다.
import paho.mqtt.client as mqtt
BROKER = "your-iot-endpoint.amazonaws.com"
TOPIC = "esp32/temperature"
def on_connect(client, userdata, flags, rc):
print("Connected to AWS IoT")
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
temperature = float(msg.payload.decode())
print(f"Received Temperature Data: {temperature}°C")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.tls_set(ca_certs="certs/AmazonRootCA1.pem",
certfile="certs/device-cert.pem",
keyfile="certs/device-private.pem")
client.connect(BROKER, 8883, 60)
client.loop_forever()
5. 테스트 및 실행
5.1 ESP32 디바이스 실행
ESP32에서 다음 명령을 실행하여 프로그램을 빌드하고 플래시합니다.
idf.py build flash monitor
5.2 AWS IoT 서버 실행
AWS IoT 서버를 실행하려면 다음 명령어를 입력합니다.
python aws_iot_server.py
5.3 데이터 확인
ESP32에서 주기적으로 MQTT 메시지를 전송하면, AWS IoT 서버에서 이를 수신하고 로그를 출력하는 것을 확인할 수 있습니다.
7. 결론
이번 포스팅에서는 ESP32 IDF와 AWS IoT SDK for Embedded C를 활용하여 AWS IoT Core에 연결하는 방법을 설명했습니다. 또한 Python을 이용한 AWS IoT 서버 구현을 통해 수집된 데이터를 처리하는 과정을 살펴보았습니다.
'AWS IoT' 카테고리의 다른 글
AWS IoT Shadow를 활용한 디바이스 상태 관리 (0) | 2025.04.06 |
---|---|
AWS IoT에서 MQTT를 이용한 데이터 송수신 구현 (온도 데이터 전송) (0) | 2025.04.05 |
ESP32 IDF, MCU 기반 AWS IoT 디바이스 설정 (0) | 2025.04.03 |
IoT 디바이스의 역할 및 요구사항 정의 (0) | 2025.04.02 |
AWS Lambda와 AWS DynamoDB를 활용한 데이터 저장 및 분석 (0) | 2025.04.01 |