이 튜토리얼에서는 MQTT 프로토콜을 사용하여 MQTT 브로커와 데이터를 송수신하기 위해 ESP8266을 활용하는 방법을 탐구할 것입니다. 구체적으로 다음을 다룰 것입니다:
1 | × | ESP8266 NodeMCU | Amazon | |
1 | × | Micro USB Cable | Amazon | |
1 | × | (Optional) Screw Terminal Expansion Board for ESP8266 | 쿠팡 | Amazon | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
MQTT 프로토콜에 아직 익숙하지 않으시다면, 온라인에서 관련 정보를 찾아볼 수 있습니다. 이 튜토리얼은 MQTT를 통해 데이터를 송수신하기 위해 ESP8266을 사용하는 방법에 중점을 둡니다.
다음은 ESP8266을 MQTT와 함께 사용할 수 있는 몇 가지 방법입니다:
ESP8266을 Mosquitto나 AWS IoT와 같은 온라인 MQTT 브로커에 연결할 수 있습니다.
또는, ESP8266을 컴퓨터에 설치된 MQTT 브로커, 예를 들면 Mosquitto나 HiveMQ에 연결할 수 있습니다.
Raspberry Pi가 있다면, ESP8266을 그 위에서 실행되는 MQTT 브로커, 예를 들어 Mosquitto에 연결할 수 있습니다.
추가로, ESP8266을 클라우드 기반 MQTT 브로커, 예를 들어 AWS EC2 상의 Mosquitto나 HiveMQ에 연결할 수 있습니다.
이 튜토리얼에서는 ESP8266이 온라인 Mosquitto 브로커에 연결할 수 있는지 테스트하기로 시작하겠습니다. 인터넷을 통해 이 브로커를 통해 데이터를 보내고 받을 수 있는 ESP8266의 능력을 시연할 것입니다.
다음으로, 컴퓨터에 Mosquitto 브로커를 설정하는 방법을 안내해 드리겠습니다. 그런 다음 ESP8266이 이 로컬 브로커에 연결되어 데이터를 계속해서 보내고 받을 수 있게 됩니다.
이 튜토리얼을 완료하면 다음 추가 튜토리얼을 탐색하여 더 깊이 파고들 수 있습니다:
이 자료들은 관련 주제에 대한 추가적인 통찰을 제공할 것입니다.
이 부분에서는 Mosquitto에서 만든 온라인 MQTT 브로커인 test.mosquitto.org에 ESP8266을 연결하는 방법을 배우게 됩니다. 이 브로커는 테스트 목적으로만 사용해야 한다는 점을 유의해 주세요.
아래의 ESP8266 코드는 다음을 수행합니다:
#include <ESP8266WiFi.h>
#include <MQTTClient.h>
#include <ArduinoJson.h>
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[] = "YOUR-NAME-esp8266-001";
const char MQTT_USERNAME[] = "";
const char MQTT_PASSWORD[] = "";
const char PUBLISH_TOPIC[] = "YOUR-NAME-esp8266-001/loopback";
const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-esp8266-001/loopback";
const int PUBLISH_INTERVAL = 5000;
WiFiClient network;
MQTTClient mqtt = MQTTClient(256);
unsigned long lastPublishTime = 0;
void setup() {
Serial.begin(9600);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("ESP8266 - Wi-Fi에 연결 중");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Wi-Fi 네트워크에 연결됨, IP 주소: ");
Serial.println(WiFi.localIP());
connectToMQTT();
}
void loop() {
mqtt.loop();
if (millis() - lastPublishTime > PUBLISH_INTERVAL) {
sendToMQTT();
lastPublishTime = millis();
}
}
void connectToMQTT() {
mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network);
mqtt.onMessage(messageHandler);
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(SUBSCRIBE_TOPIC))
Serial.print("ESP8266 - 주제 구독 완료: ");
else
Serial.print("ESP8266 - 주제 구독 실패: ");
Serial.println(SUBSCRIBE_TOPIC);
Serial.println("ESP8266 - MQTT 브로커 연결 완료!");
}
void sendToMQTT() {
StaticJsonDocument<200> message;
message["timestamp"] = millis();
message["data"] = analogRead(0);
char messageBuffer[512];
serializeJson(message, messageBuffer);
mqtt.publish(PUBLISH_TOPIC, messageBuffer);
Serial.println("ESP8266 - MQTT에 보냄:");
Serial.print("- 주제: ");
Serial.println(PUBLISH_TOPIC);
Serial.print("- 페이로드:");
Serial.println(messageBuffer);
}
void messageHandler(String &topic, String &payload) {
Serial.println("ESP8266 - MQTT에서 수신함:");
Serial.println("- 주제: " + topic);
Serial.println("- 페이로드:");
Serial.println(payload);
}
Arduino IDE에서 ESP8266을 시작하는 방법은 다음 단계를 따르세요:
USB 케이블을 사용하여 ESP8266 보드를 컴퓨터에 연결하세요.
컴퓨터에서 Arduino IDE를 엽니다.
올바른 ESP8266 보드를 선택하세요, 예를 들면 (NodeMCU 1.0 (ESP-12E Module))과 해당 COM 포트를 선택합니다.
Arduino IDE의 왼쪽 탐색 바에 있는 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다.
검색 박스에 MQTT를 입력한 다음, Joel Gaehwiler의 MQTT 라이브러리를 찾습니다.
MQTT 라이브러리를 설치하려면 Install 버튼을 클릭하세요.
검색 창에 ArduinoJson을 입력한 후, Benoit Blanchon이 만든 ArduinoJson 라이브러리를 찾으세요.
Install 버튼을 클릭하여 ArduinoJson 라이브러리를 설치하세요.
위의 코드를 복사하여 Arduino IDE로 열기
코드에서 WiFi 정보(SSID와 비밀번호)를 당신의 것으로 교체하세요.
코드에서 'YOUR-NAME'이라는 단어를 세 번 볼 수 있습니다. 이 단어를 당신의 이름이나 임의의 문자(알파벳 문자만, 공백 없음)로 교체하세요. 이 변경을 하지 않으면 동시에 이 코드를 실행하는 여러 사람이 있을 수 있고, MQTT 클라이언트 ID와 주제가 모두 같기 때문에 충돌이 발생할 수 있습니다.
Arduino IDE에서 Upload 버튼을 클릭하여 ESP8266에 코드를 업로드하세요
시리얼 모니터 열기
시리얼 모니터에서 결과 확인하기
ESP8266 - Connecting to MQTT broker
ESP8266 - Subscribed to the topic: YOUR-NAME-esp8266-001/loopback
ESP8266 - MQTT broker Connected!
ESP8266 - sent to MQTT:
- topic: YOUR-NAME-esp8266-001/loopback
- payload:{"timestamp":11757,"data":255}
ESP8266 - received from MQTT:
- topic: YOUR-NAME-esp8266-001/loopback
- payload:
{"timestamp":11757,"data":255}
ESP8266 - sent to MQTT:
- topic: YOUR-NAME-esp8266-001/loopback
- payload:{"timestamp":16896,"data":259}
ESP8266 - received from MQTT:
- topic: YOUR-NAME-esp8266-001/loopback
- payload:
{"timestamp":16896,"data":259}
보시다시피, ESP8266은 MQTT 브로커에 메시지를 게시한 다음, 동일한 메시지를 다시 받습니다. 그 이유는 위의 코드가 데이터를 게시하는 동일한 주제를 구독하기 때문입니다. 만약 ESP8266이 게시한 메시지를 받지 않길 원한다면, 단순히 구독하는 주제를 게시하는 주제와 다르게 만들면 됩니다.
이제 다음 단계를 따라 MQTT 브로커가 제대로 작동하는지 확인해 봅시다:
Mosquitto가 설치된 디렉토리로 이동하세요. 예를 들어: D:\mqtt\mosquitto>
test.conf라는 이름의 새 파일을 만들고, 아래 내용을 복사하여 그 디렉토리에 저장하세요:
listener 1883
allow_anonymous true
PC에서 명령 프롬프트를 관리자로 실행하세요. 이것을 Broker Window라고 부릅시다. 튜토리얼이 끝날 때까지 이 창을 닫지 마세요.
아래의 명령어들을 차례대로 실행하세요:
cd /d D:\mqtt\mosquitto
mosquitto -v -c test.conf
당신은 보게 될 것입니다:
Microsoft Windows [Version 10.0.19045.3930]
(c) Microsoft Corporation. All rights reserved.
C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto
D:\mqtt\mosquitto>mosquitto -v -c test.conf
1710918939: mosquitto version 2.0.18 starting
1710918939: Config loaded from test.conf.
1710918939: Opening ipv6 listen socket on port 1883.
1710918939: Opening ipv4 listen socket on port 1883.
1710918939: mosquitto version 2.0.18 running
C:\WINDOWS\system32>ipconfig
Windows IP Configuration
Ethernet adapter:
Subnet Mask . . . . . . . . . . . : 255.0.0.0
IPv4 Address. . . . . . . . . . . : 192.168.0.26
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
나중에 사용할 IP 주소를 적어두세요. 위의 예시에서: 192.168.0.26
cd /d D:\mqtt\mosquitto
mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send
cd /d D:\mqtt\mosquitto
mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/send -m "Hello, MQTT!"
당신은 보게 될 것입니다:
Microsoft Windows [Version 10.0.19045.3930]
(c) Microsoft Corporation. All rights reserved.
C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto
D:\mqtt\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/send -m "Hello, MQTT!"
D:\mqtt\mosquitto>
다음과 같이 메시지가 구독자 창으로 전달됨을 볼 수 있습니다:
Microsoft Windows [Version 10.0.19045.3930]
(c) Microsoft Corporation. All rights reserved.
C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto
D:\mqtt\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send
Hello, MQTT!
이제 PC에 Mosquitto MQTT 브로커를 성공적으로 설치했습니다. 다음의 세 창을 닫지 말아 주세요: 브로커 창, 구독자 창, 그리고 발행자 창. 우리는 이들을 이어서 사용할 것입니다.
아래 ESP8266 코드는 다음과 같은 기능을 합니다:
MQTT 브로커에 연결하기
토픽 구독하기
다른 토픽에 주기적으로 메시지 발행하기
#include <ESP8266WiFi.h>
#include <MQTTClient.h>
#include <ArduinoJson.h>
#define CLIENT_ID "ESP8266-001"
const char WIFI_SSID[] = "YOUR_WIFI_SSID";
const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";
const char MQTT_BROKER_ADRRESS[] = "192.168.0.26";
const int MQTT_PORT = 1883;
const char MQTT_USERNAME[] = "";
const char MQTT_PASSWORD[] = "";
#define PUBLISH_TOPIC "esp8266-001/send"
#define SUBSCRIBE_TOPIC "esp8266-001/receive"
#define PUBLISH_INTERVAL 5000
WiFiClient network;
MQTTClient mqtt = MQTTClient(256);
unsigned long lastPublishTime = 0;
void setup() {
Serial.begin(9600);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.println("ESP8266 - Wi-Fi에 연결 중");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Wi-Fi 네트워크에 연결되었습니다. IP 주소: ");
Serial.println(WiFi.localIP());
connectToMQTT();
}
void loop() {
mqtt.loop();
if (millis() - lastPublishTime > PUBLISH_INTERVAL) {
sendToMQTT();
lastPublishTime = millis();
}
}
void connectToMQTT() {
mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network);
mqtt.onMessage(messageHandler);
Serial.print("ESP8266 - MQTT 브로커에 연결 중");
while (!mqtt.connect(CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
Serial.print(".");
delay(100);
}
Serial.println();
if (!mqtt.connected()) {
Serial.println("ESP8266 - MQTT 브로커 연결 시간 초과!");
return;
}
if (mqtt.subscribe(SUBSCRIBE_TOPIC))
Serial.print("ESP8266 - 토픽 구독 성공: ");
else
Serial.print("ESP8266 - 토픽 구독 실패: ");
Serial.println(SUBSCRIBE_TOPIC);
Serial.println("ESP8266 - MQTT 브로커 연결 됨!");
}
void sendToMQTT() {
StaticJsonDocument<200> message;
message["timestamp"] = millis();
message["data"] = analogRead(0);
char messageBuffer[512];
serializeJson(message, messageBuffer);
mqtt.publish(PUBLISH_TOPIC, messageBuffer);
Serial.println("ESP8266 - MQTT로 보냄:");
Serial.print("- 토픽: ");
Serial.println(PUBLISH_TOPIC);
Serial.print("- 페이로드:");
Serial.println(messageBuffer);
}
void messageHandler(String &topic, String &payload) {
Serial.println("ESP8266 - MQTT로부터 받음:");
Serial.println("- 토픽: " + topic);
Serial.println("- 페이로드:");
Serial.println(payload);
}
위의 코드를 복사하여 아두이노 IDE로 열기
코드 내의 WiFi 정보(SSID 및 비밀번호)를 자신의 것으로 교체하세요.
코드 내의 MQTT 브로커 주소(도메인 이름 또는 IP 주소)를 교체하세요.
아두이노 IDE에서 Upload 버튼을 클릭하여 코드를 ESP8266으로 업로드하세요.
ESP8266 코드는 MQTT 토픽 esp8266-001/send 에 데이터를 게시합니다, PC의 구독자 창이 해당 토픽을 구독하여 데이터를 수신합니다.
시리얼 모니터를 열면, ESP8266이 주기적으로 토픽에 메시지를 게시하는 것을 볼 수 있습니다.
ESP8266 - Connecting to MQTT broker
ESP8266 - Subscribed to the topic: esp8266-001/receive
ESP8266 - MQTT broker Connected!
ESP8266 - sent to MQTT:
- topic: esp8266-001/send
- payload:{"timestamp":10708,"data":311}
ESP8266 - sent to MQTT:
- topic: esp8266-001/send
- payload:{"timestamp":15837,"data":298}
ESP8266 - sent to MQTT:
- topic: esp8266-001/send
- payload:{"timestamp":20965,"data":291}
ESP8266 - sent to MQTT:
- topic: esp8266-001/send
- payload:{"timestamp":26094,"data":286}
Microsoft Windows [Version 10.0.19045.3930]
(c) Microsoft Corporation. All rights reserved.
C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto
D:\mqtt\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send
Hello, MQTT!
{"timestamp":10708,"data":311}
{"timestamp":15837,"data":298}
{"timestamp":20965,"data":291}
{"timestamp":26094,"data":286}
ESP8266은 esp8266-001/receive 토픽을 구독하고, PC의 발행자 창은 그 토픽에 메시지를 발행하여 ESP8266으로 전송합니다.
다음 명령을 실행하여 ESP8266이 구독한 주제에 메시지를 게시하세요. 발행자 창에서:
mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/receive -m "Hello, ESP8266!"
다음과 같이 ESP8266에서 이 메시지가 수신되었음을 시리얼 모니터에서 볼 수 있습니다:
ESP8266 - received from MQTT:
- topic: esp8266-001/receive
- payload:
Hello, ESP8266!
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.