스마트 디바이스 실습 12주차

MQTT

한세대학교 컴퓨터공학과 22학번 김선영


MQTT란?

- Message Queuing Telemetry Transport의 약자, 경량의 publish/subscribe 메시징 프로토콜.

MQTT 프로토콜의 기본 개념과 동작 방식

- MQTT의 핵심 구성 요소 / 클라이언트, 브로커, 토픽(topic)

  1. 클라이언트 : MQTT 네트워크에 연결되는 디바이스 또는 응용 프로그램. 브로커에게 메시지를 발행(publish)하거나 구독(subscribe)할 수 있음.
  2. 브로커 : 클라이언트 간의 메시지 전달을 중개하는 중앙 서버 역할.
  3. 토픽 : 메시지를 구분하는 주제를 나타냄.

실습 : MQTT를 사용하여 DHT11 센서로부터 온도와 습도 데이터를 받아와 출력

실습 구성도
Responsive image

DHT11 - ESP32 <- WiFi -> Internet <-> MQTT 브로커 <- Internet ->MQTT Client(PC)

실습 과정

  1. http://www.mqtt-dashboard.com/ 접속, 로그인


  2. https://www.hivemq.com/demos/websocket-client/ SETTING
  3. [참고 이미지]

  4. EspMQTTClient 라이브러리 설치
  5. Responsive image

  6. 코드 작성, ESP32 연결 -> 업로드

5. Serial Monitor와 MQTT에서 온습도 확인 - Serial Monitor Responsive image - MQTT Responsive image

번외 : 스마트폰 앱 MQTT Brocker App에서 온습도 확인.

  1. new connection
  2. Responsive image

  3. new topic
  4. Responsive image

  5. connect
  6. Responsive image

코드

                            
    #include ≶WiFi.h> //WIFI 라이브러리
    #include ≶EspMQTTClient.h> // PubSubclient 라이브러리를 포함한 ESP32 MQTT Client 라이브러리
    #include ≶DHT.h> //DHT11 라이브러리
    #define DHTTYPE DHT11 // DHT 센서 타입 정의
    
    DHT dht(13, DHTTYPE); //DHT 설정 dht( 핀, DHT 종류)
    float temp1,humid1;
    char temp[10]; // temp, humid 를 문자열로 합쳐서 전송하기 위한 변수 정의
    char humid[10];
    
    EspMQTTClient client(
        "[wifi 이름]", // SSID
        "[wifi 비밀번호]", // PW
    //바꾸지 말것!!
        "broker.mqtt-dashboard.com", // MQTT Broker 서버 IP
        "MQTT_TestClient", // 클라이언트 이름
        1883 // MQTT 포트번호
    );
    //WiFiClient client;
    void setup()
    {
        Serial.begin(115200); //Initialize serial
        dht.begin();
        client.enableDebuggingMessages();
        client.enableLastWillMessage("TestClient/lastwill", "I am going offline");
    }
    void onConnectionEstablished(){
    }
    void loop() {
        client.loop();
        temp1 = dht.readTemperature(); // 온도를 읽어서 tem에 저장
        humid1 = dht.readHumidity(); // 습도를 읽어서 hum에 저장
        sprintf(temp, "%.2f" ,dht.readTemperature());
        sprintf(humid, "%.2f" ,dht.readHumidity());
        Serial.print(F("Humidity : "));
        Serial.println(humid1);
        Serial.print(F("Temperature : "));
        Serial.println(temp1);
        client.publish("mytopic/temp", temp);
        client.publish("mytopic/humid", humid);
        delay(5000);
    }
client.enableDebuggingMessages();
  1. 클라이언트의 디버깅 메시지를 활성화하는 데 사용.
  2. 일반적으로 디버깅 메시지는 개발 중에 소프트웨어의 동작을 추적하고 문제를 해결하는 데 도움을 줌.
  3. 이 함수를 호출하면 클라이언트는 디버깅 메시지를 생성하고 출력하게 됨.
  4. 이를 통해 클라이언트의 내부 동작 및 네트워크 통신과 관련된 문제를 식별할 수 있음.
client.enableLastWillMessage("TestClient/lastwill", "I am going offline");
  1. LastWillMessage는 클라이언트가 비정상적으로 연결이 끊어질 경우 브로커 또는 다른 클라이언트에게 전송되는 메시지.
  2. 여기서 "TestClient/lastwill"은 의지 메시지를 전송할 주제(topic), "I am going offline"는 메시지 내용.
  3. 이 함수를 호출하면 클라이언트가 연결이 끊어진 경우에 자동으로 해당 메시지를 전송하게 됨.
  4. 이를 통해 클라이언트의 연결 상태를 추적하고 연결이 끊어진 경우 다른 클라이언트나 시스템에 알리는 데 사용할 수 있음.

MQTT 브로커 설정 기본값

        
    EspMQTTClient client(
        "[wifi 이름]", // SSID
        "[wifi 비밀번호]", // PW
      //바꾸지 말것!!
        "broker.mqtt-dashboard.com", // MQTT Broker 서버 IP
        "MQTT_TestClient", // 클라이언트 이름
        1883 // MQTT 포트번호
    );
        
- 위 실습 코드에서는 client 객체를 생성하고 MQTT 브로커에 연결하기 위한 정보를 설정하고 있음.
  1. MQTT 브로커에 연결하기 위해 설정해야 하는 값 : WiFi ID, WiFi PW, MQTT Broker 주소, Client ID, Port 번호.
- 클라이언트 ID와 포트 번호는 MQTT 브로커에 연결하기 위한 식별자와 포트 정보를 나타냄.
  1. 코드에서 주어진 값인 "MQTT_TestClient"와 1883은 MQTT 브로커의 설정과 일치하는 경우가 많기 때문에 기본값으로 사용됨.

실습을 통해 느낀점

배운 점:

  1. MQTT 프로토콜의 기본 개념: MQTT는 클라이언트-브로커 모델을 기반으로 하며, 클라이언트는 메시지를 발행(publish)하거나 구독(subscribe)하여 메시지를 주고받음.
  2. MQTT의 핵심 구성 요소: MQTT 클라이언트, MQTT 브로커, 토픽(topic)은 MQTT 프로토콜에서 중요한 구성 요소. 클라이언트는 메시지를 발행하고 구독하며, 브로커는 클라이언트 간의 메시지 전달을 중개함. 토픽은 메시지를 구분하는 주제를 나타냄.
  3. MQTT 브로커 설정: MQTT 브로커는 MQTT 메시지를 수신하고 게시하는 중앙 서버로 역할을 함. 실습에서 사용한 "broker.mqtt-dashboard.com"은 MQTT 브로커의 IP 주소를 나타냄.

새롭게 알게된 점:

  1. EspMQTTClient 라이브러리: 실습에서 사용된 EspMQTTClient는 ESP32 기반의 MQTT 클라이언트를 구현하기 위한 라이브러리. 이 라이브러리를 사용하면 ESP32를 MQTT 브로커에 연결하고 데이터를 발행할 수 있음.
  2. DHT11 센서: DHT11은 온도와 습도를 측정하는 디지털 센서로 사용됨. DHT11 라이브러리를 사용하여 센서로부터 데이터를 읽어오는 방법을 배울 수 있음.

Previous   /   Next