이 튜토리얼에서는 MQTT 프로토콜을 사용하여 Arduino로 MQTT 브로커에 데이터를 송수신하는 방법을 배울 것입니다. 구체적으로, 다음을 배울 것입니다:
1 | × | Arduino UNO R4 WiFi | Amazon | |
1 | × | USB Cable Type-C | 쿠팡 | Amazon | |
1 | × | (Optional) 9V Power Adapter for Arduino | Amazon | |
1 | × | (Recommended) Screw Terminal Block Shield for Arduino UNO R4 | 쿠팡 | Amazon | |
1 | × | (Recommended) Breadboard Shield For Arduino UNO R4 | 쿠팡 | Amazon | |
1 | × | (Recommended) Enclosure For Arduino UNO R4 | Amazon | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
MQTT 프로토콜에 이미 익숙하다고 가정합니다. 만약 그렇지 않다면, 인터넷에서 연구를 진행해 주세요. 이 튜토리얼은 MQTT 프로토콜을 사용하여 데이터를 송수신하기 위해 아두이노를 프로그래밍하는 데에 초점을 맞춥니다.
아래는 Arduino와 MQTT의 사용 사례입니다:
Arduino는 온라인 MQTT 브로커에 연결합니다. 예: 온라인 Mosquitto 브로커, AWS IoT...
Arduino는 PC에 설치된 MQTT 브로커에 연결합니다. 예: Mosquitto 브로커, HiveMQ 브로커
Arduino는 라즈베리 파이에 설치된 MQTT 브로커에 연결합니다. 예: Mosquitto 브로커
Arduino는 클라우드에 설치된 MQTT 브로커에 연결합니다. 예: AWS EC2 상의 Mosquitto 또는 HiveMQ 브로커
이 튜토리얼에서는 아두이노가 온라인 Mosquitto 브로커에 연결할 수 있는지 빠르게 확인하는 것부터 시작할 것입니다. 아두이노는 인터넷을 통해 이 브로커에 발행하고 구독할 것입니다.
다음으로, 우리 PC에 Mosquitto 브로커를 설치하려고 합니다. 그 후, Arduino를 PC에 설치된 MQTT 브로커에 연결하여, 이 로컬 브로커를 통해 데이터를 계속 게시하고 구독하게 됩니다.
이 튜토리얼을 완료하면 다음 튜토리얼에서 Arduino와 MQTT에 대해 더 학습하여 탐색할 수 있습니다:
이 부분에서는 Arduino를 Mosquitto에 의해 생성된 온라인 MQTT 브로커인 test.mosquitto.org에 연결하는 방법을 배우게 됩니다. 이 브로커는 테스트 목적으로만 사용되어야 함을 유의해 주세요.
아래 아두이노 코드는 다음을 수행합니다:
#include <WiFiS3.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-arduino-001";
const char MQTT_USERNAME[] = "";
const char MQTT_PASSWORD[] = "";
const char PUBLISH_TOPIC[] = "YOUR-NAME-arduino-001/loopback";
const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-arduino-001/loopback";
const int PUBLISH_INTERVAL = 5000;
WiFiClient network;
MQTTClient mqtt = MQTTClient(256);
unsigned long lastPublishTime = 0;
void setup() {
Serial.begin(9600);
int status = WL_IDLE_STATUS;
while (status != WL_CONNECTED) {
Serial.print("Arduino - SSID에 연결을 시도 중: ");
Serial.println(WIFI_SSID);
status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
delay(10000);
}
Serial.print("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("Arduino - MQTT 브로커에 연결 중");
while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
Serial.print(".");
delay(100);
}
Serial.println();
if (!mqtt.connected()) {
Serial.println("Arduino - MQTT 브로커 연결 시간 초과!");
return;
}
if (mqtt.subscribe(SUBSCRIBE_TOPIC))
Serial.print("Arduino - 주제 구독: ");
else
Serial.print("Arduino - 주제 구독 실패: ");
Serial.println(SUBSCRIBE_TOPIC);
Serial.println("Arduino - 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("Arduino - MQTT에 전송됨:");
Serial.print("- 주제: ");
Serial.println(PUBLISH_TOPIC);
Serial.print("- 페이로드:");
Serial.println(messageBuffer);
}
void messageHandler(String &topic, String &payload) {
Serial.println("Arduino - MQTT에서 받음:");
Serial.println("- 주제: " + topic);
Serial.println("- 페이로드:");
Serial.println(payload);
}
PC에서 아두이노 IDE를 엽니다
아두이노 IDE의 왼쪽 탐색 바에 있는 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다
검색 상자에 MQTT를 입력한 후, Joel Gaehwiler의 MQTT 라이브러리를 찾습니다.
Install 버튼을 클릭하여 MQTT 라이브러리를 설치합니다.
검색 상자에 ArduinoJson을 입력한 다음, Benoit Blanchon의 ArduinoJson 라이브러리를 찾으세요.
Install 버튼을 클릭하여 ArduinoJson 라이브러리를 설치하세요.
위의 코드를 복사하고 Arduino IDE로 열기
코드 내의 WiFi 정보(SSID와 비밀번호)를 자신의 것으로 교체하기.
코드에서 'YOUR-NAME' 이라는 단어를 세 번 볼 수 있습니다. 이 단어를 귀하의 이름이나 무작위 문자(알파벳 문자만, 공백 없음)로 교체하세요. 이 작업이 필요한 이유는 변경을 하지 않으면, MQTT 클라이언트 ID와 토픽이 모두 같기 때문에 동시에 이 코드를 실행하는 여러 사람들이 있을 경우 충돌이 발생할 수 있기 때문입니다.
Arduino IDE에서 Upload 버튼을 클릭하여 Arduino에 코드를 업로드하기
시리얼 모니터 열기
시리얼 모니터에서 결과를 확인하기.
IP Address: 192.168.0.2
Arduino - Connecting to MQTT broker
Arduino - Subscribed to the topic: YOUR-NAME-arduino-001/loopback
Arduino - MQTT broker Connected!
Arduino - sent to MQTT:
- topic: YOUR-NAME-arduino-001/loopback
- payload:{"timestamp":11757,"data":255}
Arduino - received from MQTT:
- topic: YOUR-NAME-arduino-001/loopback
- payload:
{"timestamp":11757,"data":255}
Arduino - sent to MQTT:
- topic: YOUR-NAME-arduino-001/loopback
- payload:{"timestamp":16896,"data":259}
Arduino - received from MQTT:
- topic: YOUR-NAME-arduino-001/loopback
- payload:
{"timestamp":16896,"data":259}
보시다시피, 아두이노는 MQTT 브로커에 메시지를 게시한 다음 동일한 메시지를 다시 받습니다. 그 이유는 위의 코드가 데이터를 게시하는 동일한 주제를 구독하기 때문입니다. 아두이노가 게시한 메시지를 받고 싶지 않다면, 단순히 구독하는 주제를 게시하는 주제와 다르게 설정하세요.
이제 이러한 단계를 따라 MQTT 브로커가 제대로 작동하는지 확인해 보겠습니다:
listener 1883
allow_anonymous true
PC에서 관리자 권한으로 명령 프롬프트를 실행하세요. 이것을 Broker Window라고 칭합시다. 튜토리얼이 끝날 때까지 그 창을 닫지 마세요.
아래의 명령어를 차례대로 실행하세요:
cd /d D:\Draft\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:\Draft\mosquitto
D:\Draft\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:\Draft\mosquitto
mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send
cd /d D:\Draft\mosquitto
mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/send -m "Hello, MQTT!"
당신은 보게 될 것입니다:
Microsoft Windows [Version 10.0.19045.3930]
(c) Microsoft Corporation. All rights reserved.
C:\WINDOWS\system32>cd /d D:\Draft\mosquitto
D:\Draft\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/send -m "Hello, MQTT!"
D:\Draft\mosquitto>
다음과 같이 그 메시지가 구독자 창으로 전달됩니다:
Microsoft Windows [Version 10.0.19045.3930]
(c) Microsoft Corporation. All rights reserved.
C:\WINDOWS\system32>cd /d D:\Draft\mosquitto
D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send
Hello, MQTT!
이제 PC에 Mosquitto MQTT 브로커를 성공적으로 설치했습니다. 브로커 창, 구독자 창, 그리고 출판자 창 세 개의 창을 닫지 말아 주세요. 우리는 이들을 다음에 사용할 것입니다.
아래의 아두이노 코드는 다음을 수행합니다:
MQTT 브로커에 연결하다
토픽에 구독하다
주기적으로 다른 토픽에 메시지를 게시하다
#include <WiFiS3.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[] = "192.168.0.26";
const int MQTT_PORT = 1883;
const char MQTT_CLIENT_ID[] = "arduino-001";
const char MQTT_USERNAME[] = "";
const char MQTT_PASSWORD[] = "";
const char PUBLISH_TOPIC[] = "arduino-001/send";
const char SUBSCRIBE_TOPIC[] = "arduino-001/receive";
const int PUBLISH_INTERVAL = 5000;
WiFiClient network;
MQTTClient mqtt = MQTTClient(256);
unsigned long lastPublishTime = 0;
void setup() {
Serial.begin(9600);
int status = WL_IDLE_STATUS;
while (status != WL_CONNECTED) {
Serial.print("Arduino - Attempting to connect to SSID: ");
Serial.println(WIFI_SSID);
status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
delay(10000);
}
Serial.print("IP Address: ");
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("Arduino - Connecting to MQTT broker");
while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
Serial.print(".");
delay(100);
}
Serial.println();
if (!mqtt.connected()) {
Serial.println("Arduino - MQTT broker Timeout!");
return;
}
if (mqtt.subscribe(SUBSCRIBE_TOPIC))
Serial.print("Arduino - Subscribed to the topic: ");
else
Serial.print("Arduino - Failed to subscribe to the topic: ");
Serial.println(SUBSCRIBE_TOPIC);
Serial.println("Arduino - MQTT broker Connected!");
}
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("Arduino - sent to MQTT:");
Serial.print("- topic: ");
Serial.println(PUBLISH_TOPIC);
Serial.print("- payload:");
Serial.println(messageBuffer);
}
void messageHandler(String &topic, String &payload) {
Serial.println("Arduino - received from MQTT:");
Serial.println("- topic: " + topic);
Serial.println("- payload:");
Serial.println(payload);
}
위의 코드를 복사하고 Arduino IDE로 열기
코드에서 WiFi 정보(SSID 및 비밀번호)를 자신의 것으로 교체하세요.
코드에서 MQTT 브로커 주소(도메인 이름 또는 IP 주소)를 교체하세요.
Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino에 업로드하세요.
아두이노 코드는 MQTT 토픽 arduino-001/send에 데이터를 게시하고, PC의 구독자 창은 해당 토픽을 구독하여 데이터를 받습니다.
시리얼 모니터를 열어보세요, 아두이노가 주기적으로 주제에 메시지를 게시하는 것을 볼 수 있습니다.
IP Address: 192.168.0.2
Arduino - Connecting to MQTT broker
Arduino - Subscribed to the topic: arduino-001/receive
Arduino - MQTT broker Connected!
Arduino - sent to MQTT:
- topic: arduino-001/send
- payload:{"timestamp":10708,"data":311}
Arduino - sent to MQTT:
- topic: arduino-001/send
- payload:{"timestamp":15837,"data":298}
Arduino - sent to MQTT:
- topic: arduino-001/send
- payload:{"timestamp":20965,"data":291}
Arduino - sent to MQTT:
- topic: arduino-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:\Draft\mosquitto
D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send
Hello, MQTT!
{"timestamp":10708,"data":311}
{"timestamp":15837,"data":298}
{"timestamp":20965,"data":291}
{"timestamp":26094,"data":286}
아두이노는 arduino-001/receive라는 주제를 구독합니다. PC의 발행자 창에서 그 주제로 메시지를 발행하여 아두이노로 보냅니다.
다음 명령어를 발행자 창에서 실행함으로써 Arduino가 구독중인 토픽에 메시지를 발행하세요:
mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/receive -m "Hello, Arduino!"
아래와 같이 시리얼 모니터에서 아두이노가 이 메시지를 받은 것을 볼 수 있습니다:
Arduino - received from MQTT:
- topic: arduino-001/receive
- payload:
Hello, Arduino!
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.