ESP8266 간 MQTT 통신 | ESP8266-to-ESP8266 MQTT Communication

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

두 ESP8266 간의 양방향 통신을 MQTT를 사용하여 활성화하는 방법.

예시 시나리오: MQTT를 통해 ESP8266 #1에 연결된 버튼 또는 스위치를 사용하여 ESP8266 #2에 연결된 LED를 제어합니다.

communication between two esp8266 via MQTT

준비물

2×ESP8266 NodeMCU Amazon
2×Micro USB Cable Amazon
1×(Optional) ESP8266 Screw Terminal Adapter Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

ESP8266과 MQTT에 대하여

여기에 ESP8266을 MQTT와 함께 사용하는 방법에 대한 자세한 튜토리얼이 있습니다:

ESP8266 - MQTT

두 ESP8266 간의 MQTT를 통한 통신

두 개의 ESP8266 보드는 MQTT 서버를 사용하여 서로 통신할 수 있습니다. MQTT 서버에 의존하지 않고 두 ESP8266 간의 직접 통신을 선호하는 경우 [ESP8266에서 ESP8266로의 TCP 클라이언트/서버 통신]에 대한 자습서를 확인해 주세요(BASE_URL/tutorials/esp8266/communication-between-two-esp8266).

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

  • 두 ESP8266 모두 MQTT 브로커에 연결합니다.
  • ESP8266 #2ESP8266 #1에 데이터를 보내게 하려면:
    • ESP8266 #1은 esp8266-1/data와 같은 토픽을 구독합니다.
    • ESP8266 #2ESP8266 #1이 구독한 토픽에 게시함으로써 ESP8266 #1에 데이터를 전송할 수 있습니다.
  • 마찬가지로, ESP8266 #1ESP8266 #2에 데이터를 보낼 수 있게 하려면:
    • ESP8266 #2은 esp8266-2/data와 같은 토픽을 구독합니다.
    • ESP8266 #1ESP8266 #2가 구독한 토픽에 게시함으로써 ESP8266 #2에 데이터를 보낼 수 있습니다.

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

예시 사용 사례

다음 응용 프로그램을 실현합시다: ESP8266 #1에 연결된 버튼/스위치가 MQTT를 통해 ESP8266 #2에 연결된 LED를 제어합니다.

communication between two esp8266

위에서 언급한 것처럼, 우리가 사용할 수 있는 몇 가지 애플리케이션 프로토콜이 있습니다. 이 예에서, 단순화하기 위해, 우리 스스로 프로토콜을 정의할 것입니다 (자체 정의된 프로토콜).

작동 원리

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

  • ESP8266 #1ESP8266 #2가 MQTT 브로커(MQTT 서버)에 연결됩니다.
  • ESP8266 #1에 대하여:
    • 스위치의 상태가 바뀔 때마다 ESP8266 #1은 특정 토픽에 MQTT 메시지를 발행합니다.
    • 버튼/스위치가 켜질 때, MQTT 메시지 페이로드는 1로 설정됩니다.
    • 버튼/스위치가 꺼질 때, MQTT 메시지 페이로드는 0으로 설정됩니다.
  • ESP8266 #2에 대하여:
    • ESP8266 #2는 같은 토픽을 구독합니다.
    • 만약 ESP8266 #2가 페이로드가 1인 MQTT 메시지를 받으면, LED를 활성화합니다.
    • 만약 ESP8266 #2가 페이로드가 0인 MQTT 메시지를 받으면, LED를 비활성화합니다.

    배선도

    ESP8266 #1 - ESP8266과 버튼 간의 배선도

    ESP8266 NodeMCU Button Wiring Diagram

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

    ESP8266의 핀 배치ESP8266 및 다른 구성 요소에 전원을 공급하는 방법에 대해 더 많이 보십시오.

    ESP8266 #2 - ESP8266과 LED 사이의 배선도

    ESP8266 NodeMCU LED Wiring Diagram

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

두 ESP8266 간의 MQTT를 통한 통신

ESP8266 코드 #1

/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-to-esp8266-mqtt-communication */ // ESP8266 #1: 버튼/스위치에 연결됨, MQTT 발행자로 작동 #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN D7 // 버튼에 연결된 ESP8266의 핀 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[] = "esp8266-001"; // 원하는대로 변경하세요 const char MQTT_USERNAME[] = ""; // 필요하다면 변경하세요, 필요하지 않다면 비워두세요 const char MQTT_PASSWORD[] = ""; // 필요하다면 변경하세요, 필요하지 않다면 비워두세요 // ESP8266이 발행/구독해야 하는 MQTT 토픽 const char MQTT_TOPIC[] = "esp8266/command"; // 원하는대로 변경하세요 WiFiClient network; MQTTClient mqtt = MQTTClient(256); ezButton button(BUTTON_PIN); // 핀 7에 연결된 ezButton 생성 void setup() { Serial.begin(9600); button.setDebounceTime(100); // 디바운스 시간을 100 밀리초로 설정 Serial.println("ESP8266 #1: 버튼/스위치에 연결됨, MQTT 발행자로 작동"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Wi-Fi 연결 중"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); 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("ESP8266 - MQTT 브로커에 연결 중"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT 브로커 연결 시간 초과!"); return; } Serial.println("ESP8266 - MQTT 브로커에 연결됨!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("ESP8266 - MQTT에 보냄:"); Serial.print("- 토픽: "); Serial.println(MQTT_TOPIC); Serial.print("- 페이로드:"); Serial.println(messageBuffer); }

ESP8266 코드 #2

/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-to-esp8266-mqtt-communication */ // ESP8266 #2: LED에 연결되어 MQTT 구독자로 작동 #include <ESP8266WiFi.h> #include <MQTTClient.h> #define LED_PIN D6 // LED에 연결된 ESP8266의 핀 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[] = "esp8266-002"; // 원하는 대로 변경하세요 const char MQTT_USERNAME[] = ""; // 필요하다면 변경하세요, 필요 없으면 빈칸 const char MQTT_PASSWORD[] = ""; // 필요하다면 변경하세요, 필요 없으면 빈칸 // ESP8266이 게시/구독해야하는 MQTT 주제 const char MQTT_TOPIC[] = "esp8266/command"; // 원하는 대로 변경하세요 WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP8266 #2: LED에 연결되어 MQTT 구독자로 작동"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Wi-Fi에 연결 중"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); } void connectToMQTT() { // MQTT 브로커에 연결 mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // 들어오는 메시지를 처리할 핸들러 만들기 mqtt.onMessage(messageReceived); Serial.print("ESP8266 - MQTT 브로커에 연결 중"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT 브로커 연결 시간 초과!"); return; } // 토픽을 구독하고, 들어오는 메시지는 messageReceived() 함수로 처리됩니다 if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("ESP8266 - 토픽 구독 성공: "); else Serial.print("ESP8266 - 토픽 구독 실패: "); Serial.println(MQTT_TOPIC); Serial.println("ESP8266 - MQTT 브로커에 연결됨!"); } void messageReceived(String &topic, String &payload) { Serial.println("ESP8266 - MQTT에서 받음:"); Serial.println("- topic: " + topic); Serial.print("- payload: "); 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); } }

사용 방법

ESP8266을 Arduino IDE에서 시작하려면 다음 단계를 따르십시오:

  • ESP8266을 처음 사용하는 경우, Arduino IDE에서 ESP8266 환경 설정 방법 튜토리얼을 확인하세요.
  • 다이어그램에 표시된 대로 구성요소를 연결하세요.
  • USB 케이블을 사용하여 컴퓨터에 ESP8266 보드를 연결하세요.
  • 컴퓨터에서 Arduino IDE를 엽니다.
  • 올바른 ESP8266 보드를 선택하세요(예: NodeMCU 1.0 (ESP-12E Module)) 및 해당 COM 포트.
  • ESP8266 #1에 버튼/스위치를 연결하세요.
  • ESP8266 #2에 LED를 연결하세요.
  • Arduino IDE(아두이노 IDE #1이라고 함)를 엽니다.
  • PC에서 Arduino IDE 아이콘을 클릭하는 것으로 또 다른 Arduino IDE 창(아두이노 IDE #2라고 함)을 엽니다(중요!(**)).
  • Arduino IDE 왼쪽 탐색 바에서 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다.
  • 검색 상자에 MQTT를 입력한 다음, Joel Gaehwiler의 MQTT 라이브러리를 찾습니다.
  • Install 버튼을 클릭하여 MQTT 라이브러리를 설치하세요.
ESP8266 NodeMCU MQTT library

검색 상자에 ezButton을 입력한 다음, ESP8266GetStarted에서 제작된 버튼 라이브러리를 찾으세요.

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

ESP8266 NodeMCU button library
  • ESP8266 #1을 PC에 USB 케이블로 연결하고 Arduino IDE #1에서 ESP8266 #1의 COM 포트를 선택합니다.
  • ESP8266 #2를 PC에 USB 케이블로 연결하고 Arduino IDE #2에서 ESP8266 #2의 COM 포트를 선택합니다.
  • ESP8266 #1 코드를 복사하여 Arduino IDE #1에 붙여넣고 저장합니다(이름은 ESP8266-1).
  • ESP8266 #2 코드를 복사하여 Arduino IDE #2에 붙여넣고 저장합니다(이름은 ESP8266-2).
  • 두 코드 모두에서 WiFi 정보(SSID 및 비밀번호)를 귀하의 것으로 바꿉니다.
  • 두 코드 모두에서 MQTT 브로커 주소를 변경합니다(도메인 이름 또는 IP 주소).
  • ESP8266 #1 코드를 ESP8266 #1에 업로드합니다.
  • ESP8266 #2 코드를 ESP8266 #2에 업로드합니다.
  • Arduino IDE #1에서 시리얼 모니터를 엽니다.
  • Arduino IDE #2에서 시리얼 모니터를 엽니다.
  • ESP8266 #1의 버튼을 누르고 있습니다 → ESP8266 #2의 LED 상태를 확인하세요(켜짐).
  • ESP8266 #1의 버튼을 놓습니다 → ESP8266 #2의 LED 상태를 확인하세요(꺼짐).
  • 버튼을 여러 번 누르고, 누르고 있었다가 놓습니다.
  • 두 시리얼 모니터의 출력을 확인하세요.
    • ESP8266 #1의 시리얼 모니터
    COM6
    Send
    ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - MQTT broker Connected! - The button is pressed, send command: 1 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:1 - The button is released, send command: 0 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ESP8266 #2의 시리얼 모니터

    COM6
    Send
    ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: esp8266/command ESP8266 - MQTT broker Connected! ESP8266 - received from MQTT: - topic: esp8266/command - payload: 1 - Received command: 1 => Turned LED on ESP8266 - received from MQTT: - topic: esp8266/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!