본문 바로가기

IT/임베디드 IoT

[통신 이론] MQTT, MQTT Protocol (MQTT 프로토콜) 이란? - 2 (실전편)

반응형

Broker 다운로드

MQTT를 실제로 이용해보기 위해선 MQTT 서버 역할을 하는 Broker가 필요하다.

물론 그 서버를 만드는 것도 하나의 방법이겠지만, 널리 사용되는 방법 중 하나인 상용 Broker를 이용해보자.

 

우리가 사용해볼 Broker는 mosquitto라는 MQTT Broker이다.

 

모기는 mosquito로 t가 하나 더 많다

다운로드하는 방법은 아래와 같다.

 

Windows 기준

https://mosquitto.org/download/

반응형
 

Download

Source mosquitto-1.6.8.tar.gz (319kB) (GPG signature) Git source code repository (github.com) Older downloads are available at https://mosquitto.org/files/ Binary Installation The binary packages li

mosquitto.org

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용 백엔드 서버를 만드는 것으로 성능 향상을 기대할 수 있을 것 같다.

반응형