05.19(12주차) MQTT - rlarlqor0513/smart-device GitHub Wiki

MQTT

MQTT는 Message Queuing Telemetry Transport의 약자로, 경량 메시징 프로토콜입니다. 주로 IoT(사물 인터넷) 애플리케이션에서 사용되며, 가볍고 효율적인 데이터 통신을 위해 설계되었습니다.

MQTT는 발행/구독(Publish/Subscribe) 메시지 패턴을 기반으로 동작합니다. 발행자(Publisher)는 메시지를 특정 토픽(Topic)에 발행하고, 이를 관심 있는 구독자(Subscriber)가 구독하여 해당 토픽에서 메시지를 수신합니다. 이를 통해 메시지를 효율적으로 분배하고, 특정한 주제로 관련된 구독자들에게 메시지를 전달할 수 있습니다.

MQTT의 주요 특징과 개념:

  1. 경량성: MQTT는 TCP/IP 기반의 경량 프로토콜로, 작은 패킷 크기와 낮은 네트워크 대역폭을 요구합니다. 따라서 제한된 리소스를 가진 장치와 네트워크 환경에서 효율적으로 동작합니다.

  2. 발행/구독 모델: MQTT는 발행자와 구독자 사이의 메시지 교환을 처리하기 위해 발행/구독 모델을 사용합니다. 발행자는 메시지를 특정 토픽에 발행하고, 해당 토픽을 구독한 구독자들이 메시지를 수신합니다.

  3. 토픽(Topic): 메시지의 주제를 나타내는 문자열입니다. 토픽은 계층적인 구조를 가지며, 예를 들어 "home/living-room/temperature"과 같은 형태로 사용될 수 있습니다. 구독자는 관심 있는 토픽을 선택하여 해당 토픽에서 발행된 메시지를 수신할 수 있습니다.

  4. 브로커(Broker): MQTT 메시지를 중개하는 서버로, 발행자와 구독자 간의 통신을 조정합니다. 브로커는 메시지를 발행자에게 전달하고, 해당 토픽을 구독한 구독자들에게 메시지를 전송합니다.

  5. QoS(Quality of Service): MQTT는 세 가지 수준의 QoS를 제공합니다. QoS 0은 최대한 빠른 전달을 보장하지만, 메시지 손실이 발생할 수 있습니다. QoS 1은 메시지 전달을 보장하지만 중복 전송이 발생할 수 있습니다. QoS 2는 정확한 메시지 전달을 보장하며, 중복 전송이 없습니다.

MQTT는 IoT 애플리케이션에서 센서 데이터 수집, 원격 제어, 상태 모니터링 등 다양한 용도로 활용됩니다. 경량성과 효율성을 특징으로 하며, 이해하기 쉬운 프로토콜로 개발자들에게 널리 사용되고 있습니다.

MQTT 확인

https://www.hivemq.com/demos/websocket-client/ 접속

image

Host / Port / ClientID 확인

라이브러리 설치

image

코드 업로드

#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(
"yourWifi", // SSID
"yourPassword", // PW
"mqtt_server", // MQTT Broker 서버 IP
"clientId...", // 클라이언트 이름
0000 // MQTT 포트번호
);


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);

}

연결 시도

image

Connect 버튼을 누르면 빨간 신호가 녹색 신호로 바뀌며 연결이 됨.

결과값 확인

image

⚠️ **GitHub.com Fallback** ⚠️