ESP32로 MQTT 연결하기: Arduino 예제와 핵심 설정
ESP32와 Arduino IDE를 이용해 MQTT 브로커에 연결하고 토픽을 송수신하는 단계별 예제와 설정 설명, 문제 해결 및 보안 고려사항 요약
목차
소개
이 글은 ESP32에서 MQTT를 처음 접하는 개발자를 위해 작성되었다. esp32 mqtt 예제와 함께 esp32 arduino mqtt 연결 과정, esp32 mqtt 설정에 필요한 요소를 하나씩 설명한다. 개념부터 코드, 문제 해결까지 실무에서 바로 활용 가능한 내용을 담았다.
필요한 구성 요소
- ESP32 개발 보드
- Arduino IDE (또는 PlatformIO)
- PubSubClient 라이브러리 또는 적절한 MQTT 클라이언트
- MQTT 브로커(로컬 Mosquitto 또는 클라우드 브로커)
MQTT 기본 개념
MQTT는 경량의 발행/구독(pub/sub) 메시지 프로토콜이다. 디바이스는 브로커에 연결해 토픽을 구독하거나 메시지를 발행한다. QoS와 연결 유지(keep alive), 세션(clean session) 같은 설정이 동작에 영향을 준다.
Arduino IDE 설정
라이브러리 설치
PubSubClient 라이브러리 설치가 가장 일반적이다. Arduino 라이브러리 매니저에서 "PubSubClient"를 검색해 설치한다. ESP32 보드 매니저도 추가해야 한다.
브로커 선택
개발 초기에는 로컬 Mosquitto가 편하다. 외부 접근이 필요하면 Cloud MQTT, HiveMQ, AWS IoT 같은 서비스 사용을 고려한다. 인증과 TLS 설정 유무에 따라 코드와 성능이 달라진다.
코드 예제: 기본 연결 및 퍼블리시/서브스크라이브
아래 예제는 WiFi 연결 후 MQTT 브로커에 접속해 주기적으로 메시지를 발행하고, 특정 토픽을 구독해 수신 메시지를 처리한다. esp32 arduino mqtt 연결 흐름을 그대로 보여준다.
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const char* mqtt_server = "192.168.1.100"; // 브로커 주소
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
int counter = 0;
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (unsigned int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
client.subscribe("esp32/test");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
++counter;
String payload = "hello " + String(counter);
client.publish("esp32/hello", payload.c_str());
}
}
코드 설명
- WiFi 연결: WiFi.begin으로 네트워크에 연결한다.
- PubSubClient 설정: client.setServer로 브로커 주소를 지정한다.
- 콜백 함수: 구독한 토픽의 메시지를 수신해 처리한다.
- 재연결 로직: 연결이 끊기면 재시도하도록 구현한다.
연결 확인과 디버깅
Serial 모니터에서 로그를 확인한다. 연결 실패 시 client.state() 값을 참고하면 원인을 추적하는 데 도움이 된다. 일반적인 문제는 다음과 같다.
- WiFi 정보 오류: SSID/비밀번호 확인
- 브로커 접근 차단: 방화벽 또는 포트(기본 1883) 확인
- 인증 문제: 사용자명/비밀번호 또는 TLS 설정 누락
- 클라이언트 ID 중복: 고유한 clientId 사용 권장
보안 및 성능 고려사항
- TLS 사용: 민감한 데이터 전송 시 TLS 적용으로 보안 강화
- 인증: 브로커 사용자명/비밀번호 또는 토큰 사용
- QoS 설정: 네트워크 신뢰성에 따라 QoS 0~2 선택
- 재연결 전략: 지수 백오프 등으로 과도한 재시도 방지
문제 해결 체크리스트
- 브로커가 동작하는지 로컬/원격에서 확인
- 포트 포워딩이나 방화벽 설정 점검
- 다른 MQTT 클라이언트(예: MQTT.fx)로 접속 테스트
- Serial 로그에서 에러 코드 확인
마무리
여기까지 esp32 mqtt 예제와 esp32 arduino mqtt 연결 절차, esp32 mqtt 설정 관련 핵심을 다뤘다. 처음에는 간단한 비보안 브로커로 시작한 뒤, 필요에 따라 인증과 TLS를 추가하는 방법이 현실적이다. 코드 예제를 기반으로 환경에 맞게 브로커 주소와 인증 정보를 설정하면 빠르게 메시지 송수신 환경을 만들 수 있다.