ESP8266 간 MQTT 통신 | ESP8266-to-ESP8266 MQTT Communication
이 튜토리얼에서는 다음을 다룰 예정입니다:
두 ESP8266 간의 양방향 통신을 MQTT를 사용하여 활성화하는 방법.
예시 시나리오: MQTT를 통해 ESP8266 #1에 연결된 버튼 또는 스위치를 사용하여 ESP8266 #2에 연결된 LED를 제어합니다.
2 | × | ESP8266 NodeMCU | Amazon | |
2 | × | Micro USB Cable | Amazon | |
1 | × | (Optional) Screw Terminal Expansion Board for ESP8266 | 쿠팡 | Amazon | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
여기에 ESP8266을 MQTT와 함께 사용하는 방법에 대한 자세한 튜토리얼이 있습니다:
ESP8266 - MQTT
두 개의 ESP8266 보드는 MQTT 서버를 사용하여 서로 통신할 수 있습니다. MQTT 서버에 의존하지 않고 두 ESP8266 간의 직접 통신을 선호하는 경우 [ESP8266에서 ESP8266로의 TCP 클라이언트/서버 통신]에 대한 자습서를 확인해 주세요(BASE_URL/tutorials/esp8266/communication-between-two-esp8266).
ESP8266 #1과 ESP8266 #2가 MQTT 브로커를 통해 데이터를 교환할 때:
두 ESP8266 모두 MQTT 브로커에 연결합니다.
ESP8266 #2가 ESP8266 #1에 데이터를 보내게 하려면:
마찬가지로, ESP8266 #1이 ESP8266 #2에 데이터를 보낼 수 있게 하려면:
이 접근법을 따르면, 두 ESP8266이 데이터를 양방향으로 교환할 수 있습니다.
다음 응용 프로그램을 실현합시다: ESP8266 #1에 연결된 버튼/스위치가 MQTT를 통해 ESP8266 #2에 연결된 LED를 제어합니다.
위에서 언급한 것처럼, 우리가 사용할 수 있는 몇 가지 애플리케이션 프로토콜이 있습니다. 이 예에서, 단순화하기 위해, 우리 스스로 프로토콜을 정의할 것입니다 (자체 정의된 프로토콜).
간단한 프로토콜을 정의해봅시다:
ESP8266 #1과 ESP8266 #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과 버튼 간의 배선도
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
ESP8266의 핀 배치 및 ESP8266 및 다른 구성 요소에 전원을 공급하는 방법에 대해 더 많이 보십시오.
ESP8266 #2 - ESP8266과 LED 사이의 배선도
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
#include <ESP8266WiFi.h>
#include <MQTTClient.h>
#include <ezButton.h>
#define BUTTON_PIN D7
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[] = "esp8266-001";
const char MQTT_USERNAME[] = "";
const char MQTT_PASSWORD[] = "";
const char MQTT_TOPIC[] = "esp8266/command";
WiFiClient network;
MQTTClient mqtt = MQTTClient(256);
ezButton button(BUTTON_PIN);
void setup() {
Serial.begin(9600);
button.setDebounceTime(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();
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("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);
}
#include <ESP8266WiFi.h>
#include <MQTTClient.h>
#define LED_PIN D6
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[] = "esp8266-002";
const char MQTT_USERNAME[] = "";
const char MQTT_PASSWORD[] = "";
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.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;
}
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);
} else if (command == '0') {
Serial.print("- 받은 명령: ");
Serial.print(command);
Serial.println(" => LED 꺼짐");
digitalWrite(LED_PIN, LOW);
} else {
Serial.print("- 지원되지 않는 명령 받음: ");
Serial.println(command);
}
}
ESP8266을 Arduino IDE에서 시작하려면 다음 단계를 따르십시오:
다이어그램에 표시된 대로 구성요소를 연결하세요.
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 라이브러리를 설치하세요.
검색 상자에 ezButton을 입력한 다음, ESP8266GetStarted에서 제작된 버튼 라이브러리를 찾으세요.
ezButton 라이브러리를 설치하려면 Install 버튼을 클릭하세요.
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: 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
ESP8266 #2의 시리얼 모니터
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