ESP32 IDF, MCU 기반 AWS IoT 디바이스 설정
1. 개요
본 포스팅에서는 ESP32 IDF(ESP-IDF) 환경에서 AWS IoT Device SDK for Embedded C를 활용하여 AWS IoT Core와 연동하는 방법을 설명합니다. ESP32와 같은 MCU 기반 IoT 디바이스를 AWS IoT에 연결하면, 클라우드를 통해 데이터를 수집 및 분석할 수 있으며, IoT 디바이스의 원격 관리도 가능해집니다.
이번 글에서는 다음과 같은 내용을 다룹니다.
- ESP32 개발 환경 설정 (ESP-IDF)
- AWS IoT Core 설정 및 디바이스 등록
- AWS IoT Device SDK for Embedded C 설정
- ESP32에서 온도 데이터 전송 및 AWS IoT Core 연동
- MQTT 프로토콜을 이용한 데이터 송수신
2. ESP32 개발 환경 설정 (ESP-IDF)
2.1 ESP-IDF 설치
ESP-IDF는 Espressif Systems에서 제공하는 공식 개발 프레임워크입니다. 먼저 ESP-IDF를 설치해야 합니다.
# Ubuntu 또는 macOS 환경에서 설치 방법
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh
설치가 완료되면 다음 명령어로 환경 변수를 적용합니다.
source ~/esp/esp-idf/export.sh
2.2 프로젝트 생성
ESP-IDF 기본 예제 프로젝트를 생성합니다.
cd ~/esp
idf.py create-project aws_iot_example
cd aws_iot_example
3. AWS IoT Core 설정 및 디바이스 등록
AWS IoT Core에서 ESP32 디바이스를 등록하고, 보안 인증서를 생성해야 합니다.
3.1 AWS IoT 콘솔에서 디바이스 등록
- AWS IoT 콘솔에 접속합니다.
- Manage → Things → Create Thing을 선택합니다.
- Thing의 이름을 esp32_device로 설정합니다.
- Device Shadow 활성화 여부를 선택합니다.
5 X.509 인증서 자동 생성을 선택하고, 인증서를 다운로드합니다.
다운로드해야 할 파일:
device_cert.pem.crt
private.pem.key
AmazonRootCA1.pem
이후, Policy에서 IoT Publish/Subscribe 권한을 설정하고, 인증서를 Thing과 연결합니다.
4. AWS IoT Device SDK for Embedded C 설정
4.1 SDK 다운로드
AWS IoT Device SDK for Embedded C를 다운로드하고 ESP32 프로젝트에 추가합니다.
cd ~/esp/aws_iot_example
git clone https://github.com/aws/aws-iot-device-sdk-embedded-C.git components/aws-iot
4.2 CMakeLists.txt 설정
CMakeLists.txt 파일을 열고 AWS IoT SDK를 추가합니다.
set(EXTRA_COMPONENT_DIRS "$ENV{IDF_PATH}/examples/common_components")
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(aws_iot_example)
4.3 Wi-Fi 및 AWS IoT 정보 설정
AWS IoT Core와 연결하기 위해 main/aws_iot_config.h 파일을 생성하고 설정을 추가합니다.
#ifndef AWS_IOT_CONFIG_H
#define AWS_IOT_CONFIG_H
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASS "your_wifi_password"
#define AWS_IOT_ENDPOINT "your-aws-iot-endpoint.amazonaws.com"
#define CLIENT_CERTIFICATE_PATH "/spiffs/device_cert.pem.crt"
#define CLIENT_PRIVATE_KEY_PATH "/spiffs/private.pem.key"
#define AWS_ROOT_CA_PATH "/spiffs/AmazonRootCA1.pem"
#endif
- ESP32에서 AWS IoT Core와 MQTT 통신 구현
- 1 Wi-Fi 연결 코드
ESP32가 AWS IoT에 연결하려면 먼저 Wi-Fi 네트워크에 연결해야 합니다.main/wifi.c
파일을 생성하고 다음 코드를 작성합니다.
#include "esp_wifi.h"
#include "esp_log.h"
static const char *TAG = "WIFI";
void wifi_init(void) {
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PASS,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "Wi-Fi 연결 완료");
}
5.2 AWS IoT MQTT 연결 코드
main/aws_mqtt.c 파일을 생성하고 MQTT 연결을 구현합니다.
#include "aws_iot_mqtt_client_interface.h"
static const char *TAG = "AWS_IOT";
void aws_iot_task(void *param) {
AWS_IoT_Client client;
IoT_Client_Init_Params mqttInitParams = iotClientInitParamsDefault;
mqttInitParams.enableAutoReconnect = false;
mqttInitParams.pHostURL = AWS_IOT_ENDPOINT;
mqttInitParams.port = 8883;
mqttInitParams.pRootCALocation = AWS_ROOT_CA_PATH;
mqttInitParams.pDeviceCertLocation = CLIENT_CERTIFICATE_PATH;
mqttInitParams.pDevicePrivateKeyLocation = CLIENT_PRIVATE_KEY_PATH;
if (aws_iot_mqtt_init(&client, &mqttInitParams) != SUCCESS) {
ESP_LOGE(TAG, "MQTT 초기화 실패");
return;
}
if (aws_iot_mqtt_connect(&client) != SUCCESS) {
ESP_LOGE(TAG, "AWS IoT 연결 실패");
return;
}
ESP_LOGI(TAG, "AWS IoT에 연결 성공");
vTaskDelete(NULL);
}
5.3 센서 데이터 전송
ESP32에 온도 센서를 연결하고 AWS IoT에 데이터를 전송하는 코드를 작성합니다.
void publish_temperature(AWS_IoT_Client *client) {
char payload[50];
float temperature = 25.3; // 센서에서 측정된 온도 값
snprintf(payload, sizeof(payload), "{\"temperature\": %.2f}", temperature);
IoT_Publish_Message_Params params;
params.qos = QOS0;
params.payload = payload;
params.payloadLen = strlen(payload);
aws_iot_mqtt_publish(client, "esp32/temperature", strlen("esp32/temperature"), ¶ms);
}
6. Python 서버에서 데이터 수신
AWS IoT Core로부터 데이터를 구독하여 출력하는 Python 스크립트를 작성합니다.
6.1 AWS IoT Core에서 MQTT 구독 설정
Python을 이용하여 AWS IoT 메시지를 수신하는 코드를 작성합니다.
import paho.mqtt.client as mqtt
BROKER = "your-aws-iot-endpoint.amazonaws.com"
TOPIC = "esp32/temperature"
def on_message(client, userdata, message):
print(f"수신된 데이터: {message.payload.decode()}")
client = mqtt.Client()
client.on_message = on_message
client.connect(BROKER, 8883)
client.subscribe(TOPIC)
client.loop_forever()
7. 결론
이 포스팅에서는 ESP32 IDF 환경에서 AWS IoT Device SDK for Embedded C를 활용하여 AWS IoT Core와 연동하는 방법을 다루었습니다. ESP32에서 온도 데이터를 수집하여 AWS IoT Core로 전송하고, 이를 Python 서버에서 수신하는 과정까지 구현하였습니다.
'AWS IoT' 카테고리의 다른 글
AWS IoT에서 MQTT를 이용한 데이터 송수신 구현 (온도 데이터 전송) (0) | 2025.04.05 |
---|---|
AWS IoT SDK를 이용한 ESP32 IDF 디바이스 프로그래밍 (0) | 2025.04.04 |
IoT 디바이스의 역할 및 요구사항 정의 (0) | 2025.04.02 |
AWS Lambda와 AWS DynamoDB를 활용한 데이터 저장 및 분석 (0) | 2025.04.01 |
AWS IoT Rule Engine을 활용한 데이터 처리 (0) | 2025.03.31 |