Broker 다운로드
MQTT를 실제로 이용해보기 위해선 MQTT 서버 역할을 하는 Broker가 필요하다.
물론 그 서버를 만드는 것도 하나의 방법이겠지만, 널리 사용되는 방법 중 하나인 상용 Broker를 이용해보자.
우리가 사용해볼 Broker는 mosquitto라는 MQTT Broker이다.
다운로드하는 방법은 아래와 같다.
Windows 기준
https://mosquitto.org/download/
Windows 운영체제에서는 위 링크를 타고 들어가서 Windows용 .exe 파일을 다운로드 받아 설치하면 된다.
MacOS 기준
MacOS 기준으로는 맥 터미널을 연 후, 다음과 같은 명령어를 입력하면 된다.
$ brew install mosquitto
물론 Homebrew for MacOS가 미리 다운로드 되어 있어야 하는데, 이 부분에 대해서는 추후 포스팅에서 따로 다루도록 하겠다.
환경 설정
우선 아두이노 IDE를 켜보도록 하자.
MQTT는 TCP/IP 프로토콜 위에서 동작하기 때문에 WiFi 모듈이나 WiFi 내장 보드가 반드시 필요하다.
(가장 흔한 보드인 NodeMCU 같은 것을 활용해도 된다.)
필자는 ESP32 보드 중 하나인 DOIT ESP32 DevKit V1 보드를 사용하였다.
우선 아두이노 IDE를 켜고 우측 상단 메뉴바에 있는 스케치 → 라이브러리 포함하기 → 라이브러리 관리... 메뉴를 클릭해보자.
다음과 같은 창이 나타나면 검색 창에 "PubSub"를 치고 기다리면 우리가 다운로드 받아야 하는 "PubSubClient" 라이브러리가 나온다.
"설치" 버튼을 눌러서 최신 버전을 다운로드 받아주면 된다.
이제 필요한 준비는 다 끝났다.
실제로 메시지를 주고 받아보도록 하자.
실 전
다음 소스 코드를 아두이노 IDE에 복사 붙여넣기 하자.
// MQTT Test
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <PubSubClient.h>
#define WFSSID "WiFiSSID"
#define PASSWORD "WiFiPASSWORD"
#define mqtt_server "test.mosquitto.org"
#define mqtt_topic "TEST/test"
const char* mqtt_message = "Hey, I'm from tistory!";
const char* j = 0;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int val = 0;
void setup() {
Serial.begin(115200);
//Serial.setDebugOutput(true);
Serial.println();
for(uint8_t t = 3; t > 0; t--) {
Serial.printf("[SETUP] BOOT WAIT %d...\n", t);
Serial.flush();
delay(1000);
}
WiFi.begin(WFSSID, PASSWORD);
Serial.print("Connecting to WiFi");
while(WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
client.loop();
if(!client.connected()) {
reconnect();
}
if(WiFi.status() != WL_CONNECTED) {
WiFi.begin(WFSSID, PASSWORD);
Serial.print("Reconnecting WiFi");
while(WiFi.status() != WL_CONNECTED) {
Serial.print(".");
}
Serial.println();
Serial.println("WiFi Reconnected");
}
for(int i = 0; i < 1000; i++) {
client.publish(mqtt_topic, "Hey, I'm from tistory!");
client.publish(mqtt_topic, j);
Serial.println("Sent message via MQTT! :)");
j++;
delay(3000);
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String msgText = "=> ";
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
msgText += (char)payload[i];
}
Serial.println();
}
void reconnect() {
while(!client.connected()) {
Serial.println("Attempting MQTT connection...");
if(client.connect("ESP32Client")) {
Serial.println("connected");
client.publish(mqtt_topic, "Hello, MQTT World! I'm Bear! :)");
delay(2000);
client.publish(mqtt_topic, "Hey, I'm Bear! :)");
client.subscribe(mqtt_topic);
Serial.println("DONE connecting!");
} else {
Serial.print("failed, rc = ");
Serial.print(client.state());
Serial.println(" automatically trying again in 1 second");
delay(1000);
}
}
}
복사 붙여넣기를 한 후,
Windows는 mosquitto_sub.exe를 켜서, MacOS는 맥 터미널에 다음과 같은 명령어를 입력하자.
$ mosquitto_sub -h test.mosquitto.org -p 1883 -t TEST/test -v
그러면 다음과 같은 메시지가 오는 것을 볼 수 있다.
문제가 조금 있다면,
생각보다 ESP32 보드에서 MQTT 서버와의 연결이 자주 끊긴다. 재접속도 자주 하고.
무엇보다 test.mosquitto.org 서버에서는 QoS를 0만 제공하기 때문에, 씹혀서 사라지는 메시지가 상당하다.
이 부분은 추후 자체 MQTT용 백엔드 서버를 만드는 것으로 성능 향상을 기대할 수 있을 것 같다.
'IT > 임베디드 IoT' 카테고리의 다른 글
[Buildroot] 임베디드 리눅스 구조의 이해 (11) | 2020.04.29 |
---|---|
[통신 이론] MQTT, MQTT Protocol (MQTT 프로토콜) 이란? - 1 (이론편) (3) | 2020.01.13 |