ESP32에서 ESP32로의 MQTT 통신 | ESP32-to-ESP32 MQTT Communication
이 튜토리얼에서는 다음 주제들을 다룰 예정입니다:
2 | × | ESP-WROOM-32 Dev Module | 쿠팡 | Amazon | |
2 | × | USB Cable Type-C | 쿠팡 | Amazon | |
1 | × | (Recommended) Screw Terminal Expansion Board for ESP32 | 쿠팡 | Amazon | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
여기서 ESP32를 MQTT와 함께 사용하는 방법에 대한 자세한 튜토리얼을 제공합니다:
ESP32 - MQTT
두 개의 ESP32 보드는 MQTT 서버를 통해 서로 통신할 수 있습니다. MQTT 서버를 사용하지 않고 직접 통신하길 원한다면, ESP32에서 ESP32로의 TCP 클라이언트/서버 통신에 관한 튜토리얼을 참조해 주세요.
ESP32 #1과 ESP32 #2가 MQTT 브로커를 통해 데이터를 교환할 때:
두 ESP32가 MQTT 브로커에 연결합니다.
ESP32 #2가 ESP32 #1에 데이터를 보낼 수 있게 하려면:
마찬가지로, ESP32 #1이 ESP32 #2에게 데이터를 보내려면:
이 방법을 따르면, 두 ESP32가 양방향으로 데이터를 교환할 수 있습니다.
다음 애플리케이션을 구현해봅시다: ESP32 #1에 연결된 버튼/스위치가 MQTT를 통해 ESP32 #2에 연결된 LED를 제어합니다.
위에서 언급했듯이, 사용할 수 있는 몇 가지 응용 프로토콜이 있습니다. 이 예에서 우리는 간단하게 만들기 위해 스스로 프로토콜을 정의할 것입니다(자체 정의 프로토콜).
간단한 프로토콜을 정의합시다:
ESP32 #1과 ESP32 #2 모두 MQTT 브로커( MQTT 서버)에 연결합니다.
ESP32 #1에 대하여:
스위치의 상태가 변경될 때마다 특정 토픽에 MQTT 메시지를 발행합니다.
버튼/스위치가 켜질 때, MQTT 메시지 페이로드는 1로 설정됩니다.
버튼/스위치가 꺼질 때, MQTT 메시지 페이로드는 0으로 설정됩니다.
ESP32 #2에 대하여:
같은 토픽을 구독합니다.
만약 ESP32 #2가 페이로드가 1인 MQTT 메시지를 받으면, LED를 켭니다.
만약 ESP32 #2가 페이로드가 0인 MQTT 메시지를 받으면, LED를 끕니다.
ESP32 #1 - ESP32와 버튼 사이의 배선도
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
ESP32 및 다른 구성 요소에 전원을 공급하는 방법에 대해 잘 알지 못하는 경우, 다음 튜토리얼에서 안내를 찾을 수 있습니다: ESP32 전원 공급 방법.
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
#include <WiFi.h>
#include <MQTTClient.h>
#include <ezButton.h>
#define BUTTON_PIN 21
const char WIFI_SSID[] = "YOUR_WIFI_SSID";
const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";
const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org";
const int MQTT_PORT = 1883;
const char MQTT_CLIENT_ID[] = "esp32-001";
const char MQTT_USERNAME[] = "";
const char MQTT_PASSWORD[] = "";
const char MQTT_TOPIC[] = "esp32/command";
WiFiClient network;
MQTTClient mqtt = MQTTClient(256);
ezButton button(BUTTON_PIN);
void setup() {
Serial.begin(9600);
button.setDebounceTime(100);
Serial.println("ESP32 #1: 버튼/스위치에 연결되어 MQTT 퍼블리셔로 동작");
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("ESP32 - Wi-Fi에 연결 중");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
connectToMQTT();
}
void loop() {
mqtt.loop();
button.loop();
if (button.isPressed()) {
Serial.println("- 버튼이 눌렸습니다, 명령 보내기: 1");
sendToMQTT('1');
}
if (button.isReleased()) {
Serial.println("- 버튼이 떼어졌습니다, 명령 보내기: 0");
sendToMQTT('0');
}
}
void connectToMQTT() {
mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network);
Serial.print("ESP32 - MQTT 브로커에 연결 중");
while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
Serial.print(".");
delay(100);
}
Serial.println();
if (!mqtt.connected()) {
Serial.println("ESP32 - MQTT 브로커 연결 시간 초과!");
return;
}
Serial.println("ESP32 - MQTT 브로커 연결됨!");
}
void sendToMQTT(char command) {
char messageBuffer[1];
messageBuffer[0] = command;
mqtt.publish(MQTT_TOPIC, messageBuffer);
Serial.println("ESP32 - MQTT로 보냄:");
Serial.print("- 토픽: ");
Serial.println(MQTT_TOPIC);
Serial.print("- 페이로드:");
Serial.println(messageBuffer);
}
#include <WiFi.h>
#include <MQTTClient.h>
#define LED_PIN 18
const char WIFI_SSID[] = "YOUR_WIFI_SSID";
const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";
const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org";
const int MQTT_PORT = 1883;
const char MQTT_CLIENT_ID[] = "esp32-002";
const char MQTT_USERNAME[] = "";
const char MQTT_PASSWORD[] = "";
const char MQTT_TOPIC[] = "esp32/command";
WiFiClient network;
MQTTClient mqtt = MQTTClient(256);
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
Serial.println("ESP32 #2: MQTT 구독자로 연결된 LED");
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("ESP32 - Wi-Fi에 연결 중");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
connectToMQTT();
}
void loop() {
mqtt.loop();
}
void connectToMQTT() {
mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network);
mqtt.onMessage(messageReceived);
Serial.print("ESP32 - MQTT 브로커에 연결 중");
while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
Serial.print(".");
delay(100);
}
Serial.println();
if (!mqtt.connected()) {
Serial.println("ESP32 - MQTT 브로커 연결 시간 초과!");
return;
}
if (mqtt.subscribe(MQTT_TOPIC))
Serial.print("ESP32 - 주제 구독 성공: ");
else
Serial.print("ESP32 - 주제 구독 실패: ");
Serial.println(MQTT_TOPIC);
Serial.println("ESP32 - MQTT 브로커 연결됨!");
}
void messageReceived(String &topic, String &payload) {
Serial.println("ESP32 - MQTT로부터 수신됨:");
Serial.println("- 주제: " + topic);
Serial.print("- 페이로드: ");
Serial.println(payload);
char command = payload[0];
if (command == '1') {
Serial.print("- 수신된 명령: ");
Serial.print(command);
Serial.println(" => LED 켜짐");
digitalWrite(LED_PIN, HIGH);
} else if (command == '0') {
Serial.print("- 수신된 명령: ");
Serial.print(command);
Serial.println(" => LED 꺼짐");
digitalWrite(LED_PIN, LOW);
} else {
Serial.print("- 지원되지 않는 명령 수신: ");
Serial.println(command);
}
}
ESP32를 처음 사용하는 경우, Arduino IDE에서 ESP32 환경 설정 방법을 보려면
여기를 참조하세요.
PC에서 Arduino IDE를 두 개 엽니다.
ESP32 #1에 버튼/스위치를 연결합니다.
ESP32 #2에 LED를 연결합니다.
Arduino IDE의 왼쪽 네비게이션 바에 있는 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다.
검색 상자에 MQTT를 입력한 다음, Joel Gaehwiler의 MQTT 라이브러리를 찾습니다.
MQTT 라이브러리를 설치하려면 Install 버튼을 클릭하세요.
검색 상자에 ezButton을 입력한 다음, ESP32GetStarted의 버튼 라이브러리를 찾으세요.
ezButton 라이브러리를 설치하려면 Install 버튼을 클릭하세요.
올바른 ESP32 보드 선택하기 (예: ESP32 Dev 모듈).
ESP32 #1을 USB 케이블을 통해 PC에 연결하고 Arduino IDE #1에서 ESP32 #1의 COM 포트를 선택하기
ESP32 #2를 USB 케이블을 통해 PC에 연결하고 Arduino IDE #2에서 ESP32 #2의 COM 포트를 선택하기
ESP32 #1 코드를 복사하여 Arduino IDE #1에 붙여넣고 저장하기 (이름: ESP32-1)
ESP32 #2 코드를 복사하여 Arduino IDE #2에 붙여넣고 저장하기 (이름: ESP32-2)
둘 다 코드에서 WiFi 정보(SSID 및 비밀번호)를 자신의 것으로 교체하기
둘 다 코드에서 MQTT 브로커 주소(도메인 이름 또는 IP 주소) 교체하기
ESP32 #1 코드를 ESP32 #1에 업로드하기
ESP32 #2 코드를 ESP32 #2에 업로드하기
Arduino IDE #1에서 시리얼 모니터 열기
Arduino IDE #2에서 시리얼 모니터 열기
ESP32 #1의 버튼을 누르고 있기 → ESP32 #2의 LED 상태 확인하기 (켜짐)
ESP32 #1의 버튼을 놓기 → ESP32 #2의 LED 상태 확인하기 (꺼짐)
버튼을 여러 번 누르고, 누르고 있었다가 놓기
두 Arduino IDE의 시리얼 모니터에서 출력 확인하기
ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER
ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID
ESP32 - Connecting to MQTT broker
ESP32 - MQTT broker Connected!
- The button is pressed, send command: 1
ESP32 - sent to MQTT:
- topic: esp32/command
- payload:1
- The button is released, send command: 0
ESP32 - sent to MQTT:
- topic: esp32/command
- payload:0
ESP32 #2의 시리얼 모니터
ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER
ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID
ESP32 - Connecting to MQTT broker
ESP32 - Subscribed to the topic: esp32/command
ESP32 - MQTT broker Connected!
ESP32 - received from MQTT:
- topic: esp32/command
- payload: 1
- Received command: 1 => Turned LED on
ESP32 - received from MQTT:
- topic: esp32/command
- payload: 0
- Received command: 0 => Turned LED off