본문 바로가기
-----ETC-----/C++ 임베디드 시스템 프로그래밍 시리즈

[C++ 임베디드 시스템 프로그래밍] Day 21: MQTT 프로토콜

by cogito21_cpp 2024. 8. 1.
반응형

MQTT 프로토콜의 개요

MQTT(Message Queuing Telemetry Transport)는 경량의 메시지 프로토콜로, 제한된 대역폭과 자원을 가진 네트워크 환경에서 효율적인 통신을 위해 설계되었습니다. MQTT는 주로 IoT(사물인터넷) 장치 간의 통신에 사용됩니다. 오늘은 MQTT 프로토콜을 사용하여 메시지를 송수신하는 방법을 학습하겠습니다.

1. MQTT 프로토콜의 기본 개념

MQTT는 퍼블리셔(Publisher)와 서브스크라이버(Subscriber) 모델을 기반으로 합니다. 퍼블리셔는 메시지를 특정 토픽(Topic)에 발행하고, 서브스크라이버는 해당 토픽을 구독하여 메시지를 수신합니다. MQTT 브로커(Broker)는 퍼블리셔와 서브스크라이버 간의 메시지를 중개합니다.

 

MQTT의 주요 구성 요소

  • 퍼블리셔(Publisher): 메시지를 발행하는 클라이언트
  • 서브스크라이버(Subscriber): 메시지를 구독하는 클라이언트
  • 브로커(Broker): 메시지를 중개하는 서버
  • 토픽(Topic): 메시지가 발행되고 구독되는 주제

2. MQTT 브로커 설정

MQTT 브로커로는 Mosquitto, HiveMQ, AWS IoT 등 다양한 옵션이 있습니다. 여기서는 Mosquitto MQTT 브로커를 사용하여 설정해보겠습니다.

Mosquitto 브로커 설치 (로컬 환경)

  1. Mosquitto 설치:
    • Windows, macOS, Linux에서 Mosquitto를 설치할 수 있습니다. Mosquitto 공식 사이트에서 설치 방법을 확인하세요.
  2. Mosquitto 브로커 실행:
    • Mosquitto 설치 후, 터미널 또는 명령 프롬프트에서 mosquitto 명령어를 입력하여 브로커를 실행합니다.

3. MQTT 라이브러리 설치

Arduino에서는 PubSubClient 라이브러리를 사용하여 MQTT 통신을 구현할 수 있습니다.

  1. Arduino IDE 라이브러리 매니저 열기:
    • Sketch -> Include Library -> Manage Libraries...
  2. 라이브러리 검색 및 설치:
    • PubSubClient를 검색하고, PubSubClient 라이브러리를 설치합니다.

4. MQTT 사용 예제

다음 예제에서는 ESP8266을 사용하여 MQTT 브로커에 연결하고, 메시지를 송수신하는 방법을 보여줍니다.

 

하드웨어 연결

ESP8266 보드는 일반적으로 USB를 통해 컴퓨터에 직접 연결됩니다.

 

예제: MQTT 퍼블리셔 코드

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* mqtt_server = "broker_address"; // 브로커 주소 (로컬 또는 클라우드)

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
    Serial.begin(115200);
    setup_wifi();
    client.setServer(mqtt_server, 1883);
}

void setup_wifi() {
    delay(10);
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}

void reconnect() {
    while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        if (client.connect("ESP8266Client")) {
            Serial.println("connected");
            client.publish("outTopic", "hello world");
        } else {
            Serial.print("failed, rc=");
            Serial.print(client.state());
            Serial.println(" try again in 5 seconds");
            delay(5000);
        }
    }
}

void loop() {
    if (!client.connected()) {
        reconnect();
    }
    client.loop();
}

 

위 코드에서는 ESP8266이 Wi-Fi 네트워크에 연결되고, MQTT 브로커에 연결하여 "outTopic"이라는 토픽에 "hello world" 메시지를 발행합니다.

 

예제: MQTT 서브스크라이버 코드

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* mqtt_server = "broker_address"; // 브로커 주소 (로컬 또는 클라우드)

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
    Serial.begin(115200);
    setup_wifi();
    client.setServer(mqtt_server, 1883);
    client.setCallback(callback);
}

void setup_wifi() {
    delay(10);
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
    }
    Serial.println();
}

void reconnect() {
    while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        if (client.connect("ESP8266Client")) {
            Serial.println("connected");
            client.subscribe("inTopic");
        } else {
            Serial.print("failed, rc=");
            Serial.print(client.state());
            Serial.println(" try again in 5 seconds");
            delay(5000);
        }
    }
}

void loop() {
    if (!client.connected()) {
        reconnect();
    }
    client.loop();
}

 

위 코드에서는 ESP8266이 Wi-Fi 네트워크에 연결되고, MQTT 브로커에 연결하여 "inTopic"이라는 토픽을 구독합니다. 수신된 메시지는 시리얼 모니터에 출력됩니다.

 

5. 퍼블리셔와 서브스크라이버 테스트

퍼블리셔와 서브스크라이버 코드를 각각 두 개의 ESP8266 보드에 업로드하여 테스트할 수 있습니다. 퍼블리셔가 메시지를 발행하면, 서브스크라이버는 해당 메시지를 수신하여 시리얼 모니터에 출력합니다.

마무리

오늘은 MQTT 프로토콜을 사용하여 메시지를 송수신하는 방법을 학습했습니다. ESP8266 모듈을 사용하여 MQTT 브로커에 연결하고, 퍼블리셔와 서브스크라이버를 구현하여 메시지를 송수신하는 예제를 통해 MQTT 통신의 기본 개념과 활용 방법을 익혔습니다. 다음 날에는 스마트 홈 시스템 구축 프로젝트를 시작하겠습니다.

질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.

Day 22 예고

다음 날은 "프로젝트: 스마트 홈 시스템 구축 (1)"에 대해 다룰 것입니다. 스마트 홈 시스템을 구축하는 첫 번째 단계로, 시스템 설계와 기본적인 구성 요소를 학습하고, 실습 예제를 통해 이해를 돕겠습니다.

반응형