11. Send the Data using MQTT - EnglishNo/ESP32 GitHub Wiki
๊ด๋ จ ์ฌ์ดํธ
https://www.hivemq.com/public-mqtt-broker/?fbclid=IwAR2N3SY5ROQ2qoeGP-53xDKeAdTBCNsYMPknYUOrCDk-ezLrknlVfWtOoCU
http://www.mqtt-dashboard.com/?fbclid=IwAR13RW2lICnirlhlRBXU8a60A2zIcMyoIErax9D0OAreogK8Ew2AI-At5NE
http://www.hivemq.com/demos/websocket-client/?fbclid=IwAR0BcrMLb13Doq5yrz-6aAo9PyMYH7btV8tD_bY11Olu12yRnScyu7G23xw (MQTT ๋ธ๋ก์ปค ์ฌ์ดํธ)
- ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ ๋ฎ์ ๋์ญํญ์ ์ํ ๋๋ฐ์ด์ค๋ค์ ์ต์ ํ๋ ๋ฉ์์ง ํ๋กํ ์ฝ
- MQTT ํน์ง)
- M2M(machine-to-machine), IoT(Internet of things)์์ ์ฌ์ฉํ๋ ค๊ณ ๋ง๋ ๊ฒ.
- ๋ฎ์ ์ ๋ ฅ, ๋ฎ์ ๋์ญํญ ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋จ.
- ์ ์ ๋ ฅ, ์ ๋ขฐํ ์ ์๋ ๋คํธ์ํฌ, No TCP/IP ๊ธฐ๋ฐ์์ ์ด์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ด, ์ํ๊ธฐ๊ธฐ์ ์ ์ด์ ์ผ์์ ๋ณด ์์ง์ ์ ๋ฆฌ.
- ๋ฉ์์ง ๋ฒ์ค ์์คํ .
- 3๋จ๊ณ์ QoS(Quality of service)๋ฅผ ์ ๊ณตํจ.
- 1๋จ๊ณ(0): ๋ฉ์์ง ํ๋ฒ๋ง ์ ๋ฌ, ์ ๋ฌ์ฌ๋ถ ํ์ธx (Fire and Forget ํ์ )
- 2๋จ๊ณ(1): ๋ฉ์์ง ํ๋ฒ ์ด์ ์ ๋ฌ, ๊ทผ๋ฐ ๋ฉ์์ง์ ํธ๋์ ฐ์ดํน ๊ณผ์ ์ ์๋ฐํ๊ฒ ์ถ์ x, ๊ทธ๋ฌ๋ฏ๋ก ์ค๋ณต ์ ์ก๋ ์๋ ์์.
- 3๋จ๊ณ(2): ๋ฉ์์ง ํ๋ฒ๋ง ์ ๋ฌ, ๋ฉ์์ง์ ํธ๋์ ฐ์ดํน ๊ณผ์ ์ถ์ , ๋์ ํ์ง์ ๋ณด์ฅํ์ง๋ง ์ฑ๋ฅ์ ํฌ์์ด ๋ฐ๋ฆ.
- MQTT ๊ตฌ์กฐ)
- publishing(๊ฒ์), subscribe(๊ตฌ๋ ) ํ๋ ๊ฒ์ ๊ธฐ๋ณธ ์์น์ผ๋ก ํจ.
- publisher, subscriber์ ๋ชจ๋ broker์ ๋ํ ํด๋ผ์ด์ธํธ๋ก ์๋, ์ฆ publisher๋ topic(ํ ํฝ)์ ๋ฐํํ๊ธฐ ์ํ ๋ชฉ์ (brokerํํ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ์.)์ผ๋ก, subscribe์ ํ ํฝ์ ๊ตฌ๋ ํ๊ธฐ ์ํ ๋ชฉ์ (brokerํํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๊ฒ๊ณผ ๋น์ทํ๋ค๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ์.)์ผ๋ก broker ์๋ฒ์ ์ฐ๊ฒฐ.
- topic์ ์ฌ๋์(/)๋ฅผ ์ด์ฉํด์ ๊ณ์ธต์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ด์ ๋๋์ ์ผ์ ๊ธฐ๊ธฐ๋ค์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์.(์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ฅ์๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ์.)
์์) - MQTT ๋ธ๋ก์ปค๋ ๋ฉ์์ง ๋ฒ์ค๋ฅผ ๋ง๋ค ์ ์๋๋ฐ, ๋ฉ์์ง๋ฅผ ํ๋ ค๋ณด๋ด๋ฉด ๋ฒ์ค์ ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ด ๋ฉ์์ง๋ฅผ ์ฝ์ด๊ฐ๋ ๋ฐฉ์์.(์ ํ๋ฆฌ์ผ์ด์ ๋ค์ Message Bus์ ์ฐ๊ฒฐํ๊ณ , ๊ด์ฌ์๋ topic์ ๋ฑ๋กํด์ ๋ฉ์์ง๋ฅผ ๊ตฌ๋ (subscribe)ํ๊ฑฐ๋ ๋ฐํ(publishing)ํจ.) ๋ฉ์์ง๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด์ "Topic"์ ์ด๋ฆ์ผ๋ก ํ๋ ๋ฉ์์ง ์ฑ๋์ ๋ง๋ฌ.
- ๊ด๋ จ ์ฉ์ด๋ค ์ ๋ฆฌ)
- broker(๋ธ๋ก์ปค): ์ฌ๋ฌ ํด๋ผ์ด์ธํธ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์กฐ์ ํ๋ ๋ฐฑ์๋ ์์คํ ์ผ๋ก, ๋ฉ์์ง ์์ ๋ฐ ํํฐ๋ง, ๊ฐ ๋ฉ์์ง๋ฅผ ๊ตฌ๋ ํ๋ ํด๋ผ์ด์ธํธ ์๋ณ, ๋ฉ์์ง ์ ์ก ๋ฑ๊ณผ ๊ฐ์ ์์ ์ ๋ด๋น.
- M2M: M2M์ โ๊ธฐ๊ณโ ์ค์ฌ์ ์ฐ๊ฒฐ. ์ฆ, ์ฌ๋ฌผ์ธํฐ๋ท(IoT)์ ๋ฐ๋์ด๋ฉฐ, ๊ธฐ๊ณ๊ฐ ์๋์ ์ผ๋ก ์ ๋ณด ์์ง, ๊ฐ๊ณตํ์ฌ ์ธ๊ฐ์๊ฒ ์ ๋ฌ.
- TCP: IP ํ๋กํ ์ฝ ์์์ ์ฐ๊ฒฐํ ์๋น์ค๋ฅผ ์ง์ํ๋ ์ ์ก๊ณ์ธต ํ๋กํ ์ฝ๋ก, ์ธํฐ๋ท ํ๊ฒฝ์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ.
- ์ฐ๊ฒฐํ ์๋น์ค ์ ๊ณต.
- ์ ์ด์ค(Full Duplex)๋ฐฉ์์ ์๋ฐฉํฅ ๊ฐ์ ํ์ ์ ์ ๊ณต.(๋ฐ์ดํฐ๋ฅผ ์๋ฐฉํฅ์ผ๋ก ๋์์ ์ก์์ ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ๋ก ์๊ฐํจ.)
- ์ ๋ขฐ์ฑ ์๋ ๋ฐ์ดํฐ ์ ์ก ๋ณด์ฅ.(๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์๋์ง ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ๋ฅผ ์ค์ํ๊ฒ ์๊ฐํ์ฌ ํ์คํ ์ฃผ๊ณ ๋ฐ๊ณ ์ถ์ ๋ ์ฌ์ฉ.)
- UDP(User Datagram Protocol): ์ธํฐ๋ท์์์ ์๋ก ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค๋ ์ ํธ๋ ๋ฐ๋๋ค๋ ์ ํธ ์ ์ฐจ๋ฅผ ๊ฑฐ์น์ง ์๊ณ , ๋ณด๋ด๋ ์ชฝ์์ ์ผ๋ฐฉ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ํต์ ํ๋กํ ์ฝ.(๋ณด๋ด๋ ์ชฝ์์ ๋ฐ๋ ์ชฝ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋์ง ํ์ธํ ์ ์๊ณ , ํ์ธํ ํ์๋ ์๋๋ก ๋ง๋ค์ด์ง ํ๋กํ ์ฝ.)
- TCP์ ๊ฐ์ด OSI ํ์ค๋ชจ๋ธ๊ณผ TCP/IP ๋ชจ๋ธ์ ์ ์ก๊ณ์ธต์์ ์ฌ์ฉ๋๋ ํ๋กํ ์ฝ.
- ์ ๋ขฐ์ฑ์ด ๋ณ๋ก์ธ ๋์ ์ ์์ฑ์ด ๋์.
- ์ ์ก๊ณ์ธต: ์ก์ ์์ ์์ ์๋ฅผ ์ฐ๊ฒฐํ๋ ํต์ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ IP์ ์ํด ์ ๋ฌ๋๋ ํจํท์ ์ค๋ฅ๋ฅผ ๊ฒ์ฌํ์ฌ ์ฌ์ ์ก ์๊ตฌ ์ ์ด ๋ฑ์ ๋ด๋นํ๋ ๊ณ์ธต.
- ํจํท: ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํ๊ธฐ ์ฝ๋๋ก ์๋ฅธ ๋ฐ์ดํฐ์ ์ ์ก๋จ์.
- "Arduino IDE"์์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค.
#include "EspMQTTClient.h" // MQTT ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ #include "DHT.h" // DTH.h ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ DHT dht(13, DHT11); // DHT ์ค์ dht(ํ, DHT ์ข ๋ฅ) EspMQTTClient client( "(์์ดํ์ด ์ด๋ฆ ์ ๋ ฅ)", // SSID(์์ดํ์ด ์ด๋ฆ) "(์์ดํ์ด ๋น๋ฐ๋ฒํธ ์ ๋ ฅ)", // PW (์์ดํ์ด ๋น๋ฐ๋ฒํธ) "(broker ์ฌ์ดํธ์ ๋ค์ด๊ฐ๋ฉด ์๋ Host ์ฐฝ ์ฃผ์ ์ ๋ ฅ)", // MQTT Broker ์๋ฒ IP (MQTT ๋ธ๋ก์ปค ์ฌ์ดํธ ์ฃผ์) "(์ํ๋ ClientID ์ ๋ ฅ)", // ํด๋ผ์ด์ธํธ ์ด๋ฆ(https://www.hivemq.com/demos/websocket-client/?fbclid=IwAR0BcrMLb13Doq5yrz-6aAo9PyMYH7btV8tD_bY11Olu12yRnScyu7G23xw ์ฌ๊ธฐ์ ๋ค์ด๊ฐ ๋ ๋์ค๋ "ClientID"๋ฅผ ๊ฐ๋ฆฌํด.) 1883 // MQTT ํฌํธ๋ฒํธ(1883๋ฅผ ์ ๋ ฅํด์ผ ๋๋ ๊ฒ ๊ฐ์.) ); char temp[10]; char humid[10]; float tem; float hum; void setup() { Serial.begin(9600); // ํจ์ ๊ดํธ ์์ ์ซ์๋ ์๋ฆฌ์ผ ํต์ ์๋๋ฅผ ์๋ฏธ, 9600(9600bps (๋นํธ/์ด))๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฐ dht.begin(); // ์ผ์์ ํต์ ํ๊ธฐ ์ ์ ์ ํ ๋๊ธฐ ์๊ฐ์ ์ค์ ํ๊ณ , ํต์ ํ๋กํ ์ฝ์ ์ด๊ธฐํํ๋ ํจ์, DHT11์์ ํต์ ์ด๊ธฐํํ๊ณ , ์ธก์ ์ ์์ํ๊ธฐ ์ํ ์์ ์ ์ํํ๋ ํจ์ client.enableDebuggingMessages(); // MQTT ํด๋ผ์ด์ธํธ๊ฐ ๋๋ฒ๊ทธ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ฒ ํด์ฃผ๋ ํจ์. client.enableLastWillMessage("smartDevice/info", "I am going offline"); // ํด๋น MQTT topic์ ํด๋ผ์ด์ธํธ๊ฐ ๋น์ ์์ ์ผ๋ก ์ฐ๊ฒฐ์ด ๋์ด์ง ๋ ๋ธ๋ก์ปค์๊ฒ ๋ณด๋ผ ๋ฉ์์ง๋ฅผ ์ ์ํ๋ ํจ์. } void onConnectionEstablished() { } void loop() { client.loop(); tem = dht.readTemperature(); // ์จ๋ ๊ฐ ์ ์ฅ hum = dht.readHumidity(); // ์ต๋ ๊ฐ ์ ์ฅ sprintf(temp, "%.1f", tem); // ์ค์ํ์ sprintf() ํจ์๋ฅผ ํตํด ์์์ ์๋ ๋๋ฒ์งธ๊น์ง์ ์ซ์(๊ทธ ์ดํ๋ ๋ฐ์ฌ๋ฆผ)์ ๋ฌธ์์ด ํ์์ผ๋ก ๋ฐ๊พธ๋ ํจ์. sprintf(humid, "%.1f", hum); Serial.print("Temperature : "); Serial.print(tem); Serial.println("*C"); Serial.print("Humidity : "); Serial.print(hum); Serial.println("%"); client.publish("smartDevice/DHT_temp", temp); // MQTT brokerํํ "smartDevice/DHT"์ด๋ผ๋ Topic์ ๋ฉ์์ง๋ฅผ publishํ ๋ ์ฌ์ฉ. client.publish("smartDevice/DHT_humid", humid); delay(15000); }
- ํด๋น ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ปดํ์ผํ๋ค.
- ๊ทธ๋ฆฌ๊ณ MQTT Websocket Client ์ฌ์ดํธ์์ ์ฐ๊ฒฐํ๋ค.
- ๋ง์ง๋ง์ผ๋ก ์๋ฆฌ์ผ ๋ชจ๋ํฐ์์ ๋ฐ์ดํฐ๊ฐ ๋ณด๋ด์ง ๊ฒ์ ํ์ธํ๊ณ , MQTT Websocket Client ์ฌ์ดํธ์ "Messages"์ฐฝ์์ ์ซ์๊ฐ ๋จ๋ฉด ์ฑ๊ณตํ ๊ฒ์ด๋ค.
- ์๋์ด๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ MQTT๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๋ฒ์ ์๊ฒ ๋์๋ค.(EspMQTTClient ๋ผ์ด๋ธ๋ฌ๋ฆฌ, EspMQTTClient client() ์ฌ์ฉ๋ฒ, client.publish() ๋ฑ)
- MQTT๊ฐ ์๋ํ๋ ์๋ฆฌ๋ฅผ ์๊ฒ ๋์๋ค.("publishing"์ผ๋ก "broker"ํํ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ , "subscribe"์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๊ฒ.)
- TCP, UDP์ ๋ํด ์๊ฒ ๋จ.
- EspMQTTClient client()์์ ํฌํธ๋ฒํธ๋ ์ฒ์์ MQTT Websocket Client ์ฌ์ดํธ์ ๋ค์ด๊ฐ๋ฉด ์ฒ์๋ถํฐ ๋์ค๋ Port์ฐฝ์ ์ซ์๊ฐ ์๋ "1883"๋ฅผ ์ ๋ ฅํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋จ.
- ์ฒ์์ EspMQTTClient client์์ ()์์์ ์ด๋ป๊ฒ ์์ฑํด์ผ ํ๋์ง ๋ชฐ๋์ผ๋, ๊ทธ์ ""์์ ์์ ํ๋ฉด ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
- ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ฑ GPT๋ ๋ค๋ฅธ ํ์์ ๋ณด๊ณ ์๋ฅผ ์ฐธ๊ณ ํ๋ ๋ฐ์๋ MQTT Websocket Client ์ฌ์ดํธ์ Messages ์ฐฝ์์ ๋ฉ์์ง๊ฐ ๋จ์ง ์์๋๋ฐ, ClientID์์ "DongWoo"๋ฅผ "Dong Woo"๋ผ๊ณ ๋์ด์ฐ๊ธฐ ํ๋๊น ๊ฐ์๊ธฐ ๋ฉ์์ง๊ฐ ๋จ์ง ์์ํจ...