AWS IoT에서 MQTT를 이용한 데이터 송수신 구현 (온도 데이터 전송)
개요
AWS IoT는 다양한 IoT 디바이스와 클라우드 간의 통신을 지원하며, MQTT(Message Queuing Telemetry Transport)를 통해 경량 메시지 교환을 수행할 수 있습니다. 이번 포스팅에서는 ESP32 디바이스가 MQTT를 이용하여 AWS IoT 서버로 온도 데이터를 전송하는 방법을 설명하고, AWS IoT Core에서 데이터를 수신하여 처리하는 서버 코드를 함께 작성해 보겠습니다.
ESP32 디바이스의 펌웨어는 ESP-IDF(ESP32 IoT Development Framework)와 AWS IoT Device SDK for Embedded C를 활용하여 개발하고, AWS IoT 서버는 Python을 이용해 데이터를 수신하는 예제를 작성하겠습니다.
1. AWS IoT 설정
1.1 AWS IoT Core에서 디바이스 등록
AWS IoT에서 ESP32 디바이스와 통신하려면 Thing을 등록하고 인증서를 발급해야 합니다.
- AWS IoT 콘솔 접속 → 관리(Manage) → Things
- 새로운 Thing 생성(Create a thing) 선택
- Thing 이름 입력 (예:
ESP32_TempSensor
) - 인증서 생성 및 다운로드
certificate.pem.crt
private.pem.key
AmazonRootCA1.pem
- 정책(Policy) 생성 및 연결
- MQTT 메시지를 게시(publish) 및 구독(subscribe)할 수 있도록 정책을 생성
정책(JSON 예제):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["iot:Publish", "iot:Subscribe", "iot:Connect"],
"Resource": "arn:aws:iot:us-east-1:123456789012:topic/esp32/temperature"
}
]
}
이제 ESP32 디바이스가 MQTT를 통해 AWS IoT Core와 통신할 수 있도록 준비되었습니다.
2. ESP32에서 AWS IoT MQTT 연결 및 데이터 전송
ESP32에서 AWS IoT로 온도 데이터를 전송하기 위해 ESP-IDF 환경과 AWS IoT Device SDK for Embedded C를 활용합니다.
2.1 ESP-IDF 프로젝트 설정
ESP-IDF를 사용하여 새로운 프로젝트를 생성합니다.
idf.py create-project aws_iot_mqtt
cd aws_iot_mqtt
ESP-IDF와 AWS IoT SDK 라이브러리를 설치한 후 필요한 설정을 추가합니다.
2.2 C 코드: AWS IoT MQTT 연결 및 데이터 전송
아래 코드는 ESP32가 DHT11 센서를 통해 온도를 읽고, MQTT를 사용하여 AWS IoT Core로 데이터를 전송하는 예제입니다.
#include <stdio.h>
#include "aws_iot_config.h"
#include "aws_iot_mqtt_client_interface.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "DHT.h"
#define AWS_IOT_ENDPOINT "YOUR_AWS_IOT_ENDPOINT"
#define CLIENT_ID "ESP32_TempSensor"
#define TOPIC "esp32/temperature"
void mqtt_publish_task(void *pvParameters) {
AWS_IoT_Client mqttClient;
IoT_Client_Init_Params mqttInitParams = iotClientInitParamsDefault;
IoT_Client_Connect_Params mqttConnectParams = iotClientConnectParamsDefault;
mqttInitParams.enableAutoReconnect = true;
mqttInitParams.pHostURL = AWS_IOT_ENDPOINT;
mqttInitParams.port = 8883;
IoT_Error_t rc = aws_iot_mqtt_init(&mqttClient, &mqttInitParams);
if (rc != SUCCESS) {
printf("MQTT 초기화 실패\n");
return;
}
mqttConnectParams.keepAliveIntervalInSec = 10;
mqttConnectParams.clientID = CLIENT_ID;
mqttConnectParams.isCleanSession = true;
if ((rc = aws_iot_mqtt_connect(&mqttClient, &mqttConnectParams)) != SUCCESS) {
printf("MQTT 연결 실패\n");
return;
}
while (1) {
float temperature = read_temperature();
char payload[50];
sprintf(payload, "{\"temperature\": %.2f}", temperature);
rc = aws_iot_mqtt_publish(&mqttClient, TOPIC, strlen(TOPIC), payload, strlen(payload), QOS0);
if (rc == SUCCESS) {
printf("온도 데이터 전송: %s\n", payload);
}
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
}
void app_main() {
xTaskCreate(&mqtt_publish_task, "mqtt_publish_task", 4096, NULL, 5, NULL);
}
ESP32가 MQTT를 통해 AWS IoT로 데이터를 전송하면, 서버에서 이를 수신하여 처리할 수 있습니다.
3. AWS IoT 서버에서 데이터 수신 및 처리
AWS IoT Core에서 ESP32가 보낸 MQTT 메시지를 Python을 이용하여 구독(subscribe)하고 처리할 수 있습니다.
3.1 Python 코드: MQTT 데이터 수신
Python의 paho-mqtt 라이브러리를 사용하여 AWS IoT Core에서 MQTT 메시지를 구독하는 예제입니다.
설치:
pip install paho-mqtt
코드:
import paho.mqtt.client as mqtt
import json
AWS_ENDPOINT = "YOUR_AWS_IOT_ENDPOINT"
TOPIC = "esp32/temperature"
# MQTT 메시지 수신 콜백 함수
def on_message(client, userdata, msg):
payload = json.loads(msg.payload.decode('utf-8'))
temperature = payload.get("temperature")
print(f"수신된 온도 데이터: {temperature}°C")
if temperature > 30:
print("경고: 온도가 30°C를 초과했습니다!")
client = mqtt.Client()
client.on_message = on_message
client.tls_set("AmazonRootCA1.pem", certfile="certificate.pem.crt", keyfile="private.pem.key")
client.connect(AWS_ENDPOINT, 8883, 60)
client.subscribe(TOPIC)
client.loop_forever()
위 코드를 실행하면 AWS IoT Core에서 ESP32가 보낸 데이터를 실시간으로 수신하고 처리할 수 있습니다.
결론
이번 포스팅에서는 ESP32가 MQTT를 이용해 AWS IoT로 온도 데이터를 전송하는 방법을 설명하고, Python을 이용해 AWS IoT 서버에서 데이터를 수신 및 처리하는 코드를 작성해 보았습니다.
이를 기반으로 보다 확장된 IoT 시스템을 구축하여 다양한 센서 데이터를 모니터링하고, 특정 임계값 이상 시 경고를 생성하는 등의 기능을 추가할 수 있습니다.
'AWS IoT' 카테고리의 다른 글
AWS IoT에서 OTA(Over-the-Air) 업데이트 적용 방법 (0) | 2025.04.07 |
---|---|
AWS IoT Shadow를 활용한 디바이스 상태 관리 (0) | 2025.04.06 |
AWS IoT SDK를 이용한 ESP32 IDF 디바이스 프로그래밍 (0) | 2025.04.04 |
ESP32 IDF, MCU 기반 AWS IoT 디바이스 설정 (0) | 2025.04.03 |
IoT 디바이스의 역할 및 요구사항 정의 (0) | 2025.04.02 |