이번 튜토리얼에서는 Arduino UNO R4를 사용하여 MQTT 프로토콜을 통해 MQTT 브로커로 데이터를 보내고 받는 방법을 배웁니다. 다음 사항을 다룰 것입니다:
1 | × | Arduino UNO R4 WiFi | Amazon | |
1 | × | USB Cable Type-C | 쿠팡 | 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 | |
1 | × | (Recommended) Power Splitter For Arduino UNO R4 | Amazon | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
Arduino UNO R4를 프로그래밍하여 MQTT 브로커(또는 MQTT 서버)를 통해 데이터를 송수신하는 방법을 배울 것입니다. MQTT 브로커는 다음과 같습니다.
인터넷에 있는 MQTT 브로커(예: Mosquitto 또는 AWS IoT).
컴퓨터에 설정된 MQTT 브로커(예: Mosquitto 또는 HiveMQ).
Raspberry Pi에서 실행 중인 MQTT 브로커(예: Mosquitto).
클라우드에 있는 MQTT 브로커(예: AWS EC2의 Mosquitto 또는 HiveMQ).
이 가이드에서는 Arduino UNO R4가 온라인 Mosquitto 브로커에 연결할 수 있는지부터 확인합니다. Arduino UNO R4는 인터넷을 통해 이 브로커로 메시지를 보내고 받을 것입니다.
다음으로, 컴퓨터에 Mosquitto 브로커를 설치할 것입니다. 그 후, Arduino UNO R4를 우리 컴퓨터의 MQTT 브로커에 연결할 것입니다. 이를 통해 이 로컬 브로커를 통해 데이터를 송수신할 것입니다.
이 섹션에서는 Mosquitto에서 제공하는 온라인 MQTT 서비스인 test.mosquitto.org에 Arduino UNO R4를 연결하는 방법을 이해할 것입니다. 이 서비스는 오직 테스트 용도로만 제공된다는 점을 기억하세요.
이 Arduino UNO R4 코드는 다음과 같은 작업을 수행합니다:
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[] = "test.mosquitto.org";
const int MQTT_PORT = 1883;
const char MQTT_CLIENT_ID[] = "YOUR-NAME-arduino-uno-r4";
const char MQTT_USERNAME[] = "";
const char MQTT_PASSWORD[] = "";
const char PUBLISH_TOPIC[] = "YOUR-NAME-arduino-uno-r4/loopback";
const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-arduino-uno-r4/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 UNO R4 - Attempting to connect to SSID: ");
Serial.println(WIFI_SSID);
status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
delay(5000);
}
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 UNO R4 - 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 UNO R4 - MQTT broker Timeout!");
return;
}
if (mqtt.subscribe(SUBSCRIBE_TOPIC))
Serial.print("Arduino UNO R4 - Subscribed to the topic: ");
else
Serial.print("Arduino UNO R4 - Failed to subscribe to the topic: ");
Serial.println(SUBSCRIBE_TOPIC);
Serial.println("Arduino UNO R4 - 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 UNO R4 - 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 UNO R4 - received from MQTT:");
Serial.println("- topic: " + topic);
Serial.println("- payload:");
Serial.println(payload);
}
다음 지침을 단계별로 따르세요:
USB 케이블을 사용하여 Arduino Uno R4 보드를 컴퓨터에 연결합니다.
컴퓨터에서 Arduino IDE를 실행합니다.
적절한 Arduino Uno R4 보드(예: Arduino Uno R4 WiFi)와 COM 포트를 선택합니다.
Arduino IDE 왼쪽에 있는 "라이브러리 매니저" 아이콘을 클릭하여 엽니다.
검색 상자에 MQTT를 입력하고 Joel Gaehwiler의 MQTT 라이브러리를 검색합니다.
Install 버튼을 클릭하여 MQTT 라이브러리를 추가합니다.
코드를 복사하여 Arduino IDE에서 엽니다.
코드에서 WiFi 세부 정보(SSID 및 비밀번호)를 본인의 것으로 변경하세요.
코드에서 'YOUR-NAME'을 세 번 찾게 됩니다. 이를 자신의 이름이나 문자(공백 없이)로 변경하세요. 이 변경은 동일 코드를 실행하는 여러 사용자로 인한 충돌을 방지하기 위해 중요합니다.
Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino UNO R4에 업로드하세요.
시리얼 모니터를 엽니다.
시리얼 모니터에서 결과를 확인하세요.
IP Address: 192.168.0.2
Arduino UNO R4 - Connecting to MQTT broker
Arduino UNO R4 - Subscribed to the topic: YOUR-NAME-arduino-uno-r4/loopback
Arduino UNO R4 - MQTT broker Connected!
Arduino UNO R4 - sent to MQTT:
- topic: YOUR-NAME-arduino-uno-r4/loopback
- payload:{"timestamp":11757,"data":255}
Arduino UNO R4 - received from MQTT:
- topic: YOUR-NAME-arduino-uno-r4/loopback
- payload:
{"timestamp":11757,"data":255}
Arduino UNO R4 - sent to MQTT:
- topic: YOUR-NAME-arduino-uno-r4/loopback
- payload:{"timestamp":16896,"data":259}
Arduino UNO R4 - received from MQTT:
- topic: YOUR-NAME-arduino-uno-r4/loopback
- payload:
{"timestamp":16896,"data":259}
Arduino UNO R4는 MQTT 브로커에게 메시지를 보낸 후 동일한 메시지를 다시 받습니다. 이는 메시지를 보낸 주제로부터 메시지를 수신하도록 설정되어 있기 때문입니다. Arduino UNO R4가 자신의 메시지를 수신하지 않도록 하려면 전송 및 수신에 다른 주제를 사용하면 됩니다.
이제 다음 단계들을 통해 MQTT 브로커가 제대로 작동하는지 확인해 봅시다:
listener 1883
allow_anonymous true
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.11
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
cd /d D:\Draft\mosquitto
mosquitto_sub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/send
cd /d D:\Draft\mosquitto
mosquitto_pub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/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.11 -p 1883 -t arduino-uno-r4/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.11 -p 1883 -t arduino-uno-r4/send
Hello, MQTT!
당신의 PC에 Mosquitto MQTT 브로커를 성공적으로 설치했습니다. 브로커 창, 구독자 창, 그리고 발행자 창 세 창을 닫지 마십시오. 우리는 다음에 그것들을 사용할 것입니다.
다음 코드는 Arduino UNO R4용이며 다음 작업을 수행합니다:
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.11";
const int MQTT_PORT = 1883;
const char MQTT_CLIENT_ID[] = "arduino-uno-r4";
const char MQTT_USERNAME[] = "";
const char MQTT_PASSWORD[] = "";
const char PUBLISH_TOPIC[] = "arduino-uno-r4/send";
const char SUBSCRIBE_TOPIC[] = "arduino-uno-r4/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 UNO R4 - 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 UNO R4 - 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 UNO R4 - MQTT broker Timeout!");
return;
}
if (mqtt.subscribe(SUBSCRIBE_TOPIC))
Serial.print("Arduino UNO R4 - Subscribed to the topic: ");
else
Serial.print("Arduino UNO R4 - Failed to subscribe to the topic: ");
Serial.println(SUBSCRIBE_TOPIC);
Serial.println("Arduino UNO R4 - 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 UNO R4 - 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 UNO R4 - received from MQTT:");
Serial.println("- topic: " + topic);
Serial.println("- payload:");
Serial.println(payload);
}
위의 코드를 복사하여 Arduino IDE에서 엽니다.
코드에서 WiFi 세부 정보(SSID 및 비밀번호)를 본인 것으로 변경합니다.
코드에서 MQTT 브로커 주소(도메인 이름 또는 IP 주소)를 변경합니다.
Arduino IDE에서 Upload 버튼을 클릭하여 Arduino UNO R4에 코드를 전송합니다.
Arduino UNO R4는 arduino-uno-r4/send라는 MQTT 토픽에 정보를 보냅니다. 컴퓨터에서는 Subscriber Window가 해당 토픽을 구독하여 데이터를 수신합니다.
IP Address: 192.168.0.2
Arduino UNO R4 - Connecting to MQTT broker
Arduino UNO R4 - Subscribed to the topic: arduino-uno-r4/receive
Arduino UNO R4 - MQTT broker Connected!
Arduino UNO R4 - sent to MQTT:
- topic: arduino-uno-r4/send
- payload:{"timestamp":10708,"data":311}
Arduino UNO R4 - sent to MQTT:
- topic: arduino-uno-r4/send
- payload:{"timestamp":15837,"data":298}
Arduino UNO R4 - sent to MQTT:
- topic: arduino-uno-r4/send
- payload:{"timestamp":20965,"data":291}
Arduino UNO R4 - sent to MQTT:
- topic: arduino-uno-r4/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.11 -p 1883 -t arduino-uno-r4/send
Hello, MQTT!
{"timestamp":10708,"data":311}
{"timestamp":15837,"data":298}
{"timestamp":20965,"data":291}
{"timestamp":26094,"data":286}
Arduino UNO R4는 arduino-uno-r4/receive 주제로부터 메시지를 수신하도록 설정되어 있습니다. PC의 Publisher 창에서 Arduino UNO R4와 통신하기 위해 이 주제로 메시지를 보냅니다.
mosquitto_pub -h 192.168.0.11 -p 1883 -t arduino-uno-r4/receive -m "Hello, Arduino UNO R4!"
Arduino UNO R4 - received from MQTT:
- topic: arduino-uno-r4/receive
- payload:
Hello, Arduino UNO R4!
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.