12. MQTT - sunbang123/Smart_device GitHub Wiki

MQTT๋ž€?

  • Message Queuing Telemetry Transport์˜ ์•ฝ์ž, ๊ฒฝ๋Ÿ‰์˜ publish/subscribe ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ.

MQTT ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ๋ฐฉ์‹

MQTT์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ / ํด๋ผ์ด์–ธํŠธ, ๋ธŒ๋กœ์ปค, ํ† ํ”ฝ(topic)

  • ํด๋ผ์ด์–ธํŠธ : MQTT ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋˜๋Š” ๋””๋ฐ”์ด์Šค ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ. ๋ธŒ๋กœ์ปค์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰(publish)ํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋…(subscribe)ํ•  ์ˆ˜ ์žˆ์Œ.
  • ๋ธŒ๋กœ์ปค : ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์„ ์ค‘๊ฐœํ•˜๋Š” ์ค‘์•™ ์„œ๋ฒ„ ์—ญํ• .
  • ํ† ํ”ฝ : ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ฃผ์ œ๋ฅผ ๋‚˜ํƒ€๋ƒ„.

์‹ค์Šต : MQTT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DHT11 ์„ผ์„œ๋กœ๋ถ€ํ„ฐ ์˜จ๋„์™€ ์Šต๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์ถœ๋ ฅ

์‹ค์Šต ๊ตฌ์„ฑ๋„

  • DHT11 - ESP32 <- WiFi -> Internet <-> MQTT ๋ธŒ๋กœ์ปค <- Internet ->MQTT Client(PC)

์‹ค์Šต ์ˆœ์„œ

  1. http://www.mqtt-dashboard.com/ ์ ‘์†, ๋กœ๊ทธ์ธ
  2. https://www.hivemq.com/demos/websocket-client/ SETTING
  1. EspMQTTClient ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
  1. ์ฝ”๋“œ ์ž‘์„ฑ, ESP32 ์—ฐ๊ฒฐ -> ์—…๋กœ๋“œ

  2. Serial Monitor์™€ MQTT์—์„œ ์˜จ์Šต๋„ ํ™•์ธ


๋ฒˆ์™ธ

์Šค๋งˆํŠธํฐ ์•ฑ MQTT Brocker App์—์„œ ์˜จ์Šต๋„ ํ™•์ธ.

  1. new connection
  1. new topic
  1. connect

์ฝ”๋“œ

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

  • ํด๋ผ์ด์–ธํŠธ์˜ ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€๋Š” ๊ฐœ๋ฐœ ์ค‘์— ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋™์ž‘์„ ์ถ”์ ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์คŒ.
  • ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ถœ๋ ฅํ•˜๊ฒŒ ๋จ.
  • ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Œ.

client.enableLastWillMessage("TestClient/lastwill", "I am going offline");

  • LastWillMessage๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋Š์–ด์งˆ ๊ฒฝ์šฐ ๋ธŒ๋กœ์ปค ๋˜๋Š” ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†ก๋˜๋Š” ๋ฉ”์‹œ์ง€.
  • ์—ฌ๊ธฐ์„œ "TestClient/lastwill"์€ ์˜์ง€ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•  ์ฃผ์ œ(topic), "I am going offline"๋Š” ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ.
  • ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„ ๊ฒฝ์šฐ์— ์ž๋™์œผ๋กœ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ฒŒ ๋จ.
  • ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ณ  ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋‚˜ ์‹œ์Šคํ…œ์— ์•Œ๋ฆฌ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

MQTT ๋ธŒ๋กœ์ปค ์„ค์ • ๊ธฐ๋ณธ๊ฐ’

EspMQTTClient client(
  "[wifi ์ด๋ฆ„]", // SSID
  "[wifi ๋น„๋ฐ€๋ฒˆํ˜ธ]", // PW
//๋ฐ”๊พธ์ง€ ๋ง๊ฒƒ!!
  "broker.mqtt-dashboard.com", // MQTT Broker ์„œ๋ฒ„ IP
  "MQTT_TestClient", // ํด๋ผ์ด์–ธํŠธ ์ด๋ฆ„
  1883 // MQTT ํฌํŠธ๋ฒˆํ˜ธ
);

์œ„ ์‹ค์Šต ์ฝ”๋“œ์—์„œ๋Š” client ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  MQTT ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜๊ณ  ์žˆ์Œ.

  • MQTT ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฐ’ : WiFi ID, WiFi PW, MQTT Broker ์ฃผ์†Œ, Client ID, Port ๋ฒˆํ˜ธ.

ํด๋ผ์ด์–ธํŠธ ID์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋Š” MQTT ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์‹๋ณ„์ž์™€ ํฌํŠธ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋ƒ„.

  • ์ฝ”๋“œ์—์„œ ์ฃผ์–ด์ง„ ๊ฐ’์ธ "MQTT_TestClient"์™€ 1883์€ MQTT ๋ธŒ๋กœ์ปค์˜ ์„ค์ •๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋จ.

์‹ค์Šต์„ ํ†ตํ•ด ๋Š๋‚€์ 

๋ฐฐ์šด ์ :

  • MQTT ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…: MQTT๋Š” ํด๋ผ์ด์–ธํŠธ-๋ธŒ๋กœ์ปค ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰(publish)ํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋…(subscribe)ํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ.
  • MQTT์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ: MQTT ํด๋ผ์ด์–ธํŠธ, MQTT ๋ธŒ๋กœ์ปค, ํ† ํ”ฝ(topic)์€ MQTT ํ”„๋กœํ† ์ฝœ์—์„œ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ๊ตฌ๋…ํ•˜๋ฉฐ, ๋ธŒ๋กœ์ปค๋Š” ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์„ ์ค‘๊ฐœํ•จ. ํ† ํ”ฝ์€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ฃผ์ œ๋ฅผ ๋‚˜ํƒ€๋ƒ„.
  • MQTT ๋ธŒ๋กœ์ปค ์„ค์ •: MQTT ๋ธŒ๋กœ์ปค๋Š” MQTT ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ๊ฒŒ์‹œํ•˜๋Š” ์ค‘์•™ ์„œ๋ฒ„๋กœ ์—ญํ• ์„ ํ•จ. ์‹ค์Šต์—์„œ ์‚ฌ์šฉํ•œ "broker.mqtt-dashboard.com"์€ MQTT ๋ธŒ๋กœ์ปค์˜ IP ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋ƒ„.

์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ์ :

  • EspMQTTClient ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: ์‹ค์Šต์—์„œ ์‚ฌ์šฉ๋œ EspMQTTClient๋Š” ESP32 ๊ธฐ๋ฐ˜์˜ MQTT ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ESP32๋ฅผ MQTT ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ์Œ.
  • DHT11 ์„ผ์„œ: DHT11์€ ์˜จ๋„์™€ ์Šต๋„๋ฅผ ์ธก์ •ํ•˜๋Š” ๋””์ง€ํ„ธ ์„ผ์„œ๋กœ ์‚ฌ์šฉ๋จ. DHT11 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ผ์„œ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Œ.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ