ESP32에서 ESP32로의 MQTT 통신 | ESP32-to-ESP32 MQTT Communication

이 튜토리얼에서는 다음 주제들을 다룰 예정입니다:

communication between two esp32 via MQTT

준비물

2×ESP-WROOM-32 Dev Module 쿠팡 | Amazon
2×USB Cable Type-C 쿠팡 | Amazon
1×(Recommended) ESP32 Screw Terminal Adapter 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

ESP32와 MQTT에 대하여

여기서 ESP32를 MQTT와 함께 사용하는 방법에 대한 자세한 튜토리얼을 제공합니다:

ESP32 - MQTT

두 ESP32 간의 MQTT를 통한 통신

두 개의 ESP32 보드는 MQTT 서버를 통해 서로 통신할 수 있습니다. MQTT 서버를 사용하지 않고 직접 통신하길 원한다면, ESP32에서 ESP32로의 TCP 클라이언트/서버 통신에 관한 튜토리얼을 참조해 주세요.

ESP32 #1ESP32 #2가 MQTT 브로커를 통해 데이터를 교환할 때:

  • 두 ESP32가 MQTT 브로커에 연결합니다.
  • ESP32 #2ESP32 #1에 데이터를 보낼 수 있게 하려면:
    • ESP32 #1이 주제를 구독합니다. 예를 들어: esp32-1/data.
    • ESP32 #2ESP32 #1이 구독한 주제에 데이터를 게시함으로써 ESP32 #1에게 데이터를 보낼 수 있습니다.
  • 마찬가지로, ESP32 #1ESP32 #2에게 데이터를 보내려면:
    • ESP32 #2가 주제를 구독합니다. 예를 들면: esp32-2/data.
    • ESP32 #1ESP32 #2가 구독한 주제에 데이터를 게시함으로써 ESP32 #2에게 데이터를 보낼 수 있습니다.

    이 방법을 따르면, 두 ESP32가 양방향으로 데이터를 교환할 수 있습니다.

예시 사용 사례

다음 애플리케이션을 구현해봅시다: ESP32 #1에 연결된 버튼/스위치가 MQTT를 통해 ESP32 #2에 연결된 LED를 제어합니다.

communication between two esp32

위에서 언급했듯이, 사용할 수 있는 몇 가지 응용 프로토콜이 있습니다. 이 예에서 우리는 간단하게 만들기 위해 스스로 프로토콜을 정의할 것입니다(자체 정의 프로토콜).

작동 원리

간단한 프로토콜을 정의합시다:

  • ESP32 #1ESP32 #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와 버튼 사이의 배선도

    ESP32 Button Wiring Diagram

    이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

    ESP32 및 다른 구성 요소에 전원을 공급하는 방법에 대해 잘 알지 못하는 경우, 다음 튜토리얼에서 안내를 찾을 수 있습니다: ESP32 전원 공급 방법.

    • ESP32 #2 - ESP32와 LED 사이의 배선도
    ESP32 LED Wiring Diagram

    이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

두 ESP32 간 MQTT를 통한 통신

ESP32 코드 #1

/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-to-esp32-mqtt-communication */ // ESP32 #1: 버튼/스위치에 연결되어 MQTT 퍼블리셔로 동작 #include <WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN 21 // ESP32 핀 GPIO21이 버튼에 연결됨 const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // 여러분의 WIFI SSID로 변경하세요 const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // 여러분의 WIFI 비밀번호로 변경하세요 const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // MQTT 브로커의 주소로 변경하세요 //const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // MQTT 브로커의 IP 주소로 변경하세요 const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp32-001"; // 원하는대로 변경하세요 const char MQTT_USERNAME[] = ""; // 필요하다면 변경하세요, 필요 없으면 비워두세요 const char MQTT_PASSWORD[] = ""; // 필요하다면 변경하세요, 필요 없으면 비워두세요 // ESP32가 발행/구독해야 하는 MQTT 토픽 const char MQTT_TOPIC[] = "esp32/command"; // 원하는대로 변경하세요 WiFiClient network; MQTTClient mqtt = MQTTClient(256); ezButton button(BUTTON_PIN); // 7번 핀에 연결된 ezButton 생성 void setup() { Serial.begin(9600); button.setDebounceTime(100); // 디바운스 시간을 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(); // 반드시 loop() 함수를 먼저 호출해야 합니다. if (button.isPressed()) { Serial.println("- 버튼이 눌렸습니다, 명령 보내기: 1"); sendToMQTT('1'); } if (button.isReleased()) { Serial.println("- 버튼이 떼어졌습니다, 명령 보내기: 0"); sendToMQTT('0'); } } void connectToMQTT() { // MQTT 브로커에 연결 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); }

ESP32 코드 #2

/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/esp32-to-esp32-mqtt-communication */ // ESP32 #2: MQTT 구독자로 연결된 LED #include <WiFi.h> #include <MQTTClient.h> #define LED_PIN 18 // ESP32 핀 GPIO18이 LED에 연결됨 const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // 당신의 WIFI SSID로 변경하세요 const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // 당신의 WIFI 비밀번호로 변경하세요 const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // MQTT 브로커의 주소로 변경하세요 //const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // MQTT 브로커의 IP 주소로 변경하세요 const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp32-002"; // 원하는대로 변경하세요 const char MQTT_USERNAME[] = ""; // 필요한 경우 변경하세요, 필요 없으면 비워두세요 const char MQTT_PASSWORD[] = ""; // 필요한 경우 변경하세요, 필요 없으면 비워두세요 // ESP32가 게시/구독해야하는 MQTT 주제 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 브로커에 연결 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; } // 주제를 구독하고, 들어오는 메시지는 messageReceived() 함수에서 처리 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); // LED 켜기 } else if (command == '0') { Serial.print("- 수신된 명령: "); Serial.print(command); Serial.println(" => LED 꺼짐"); digitalWrite(LED_PIN, LOW); // LED 끄기 } 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 버튼을 클릭하세요.
ESP32 MQTT library

검색 상자에 ezButton을 입력한 다음, ESP32GetStarted의 버튼 라이브러리를 찾으세요.

ezButton 라이브러리를 설치하려면 Install 버튼을 클릭하세요.

ESP32 button library
  • 올바른 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의 시리얼 모니터
    COM6
    Send
    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
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ESP32 #2의 시리얼 모니터

    COM6
    Send
    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
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!