![](https://blog.kakaocdn.net/dn/cAmD5v/btsakgZQ07b/hxkWZtXzgOW8niPonxPTP1/img.png)
MQTT ๊ณต์ ๋ก๊ณ
MQTT๋?
MQTT(Message Queueing Telemetry Transport)
2016๋ ๊ตญ์ ํ์คํ ๋ (ISO ํ์ค ISO/IEC PRF 20922) ๋ฐํ-๊ตฌ๋ (Publish-Subscribe) ๊ธฐ๋ฐ์ ๋ฉ์์ง ์ก·์์ ํ๋กํ ์ฝ
- ์์ ์ฝ๋ ๊ณต๊ฐ์ด ํ์ํ๊ฑฐ๋ ๋คํธ์ํฌ ๋์ญํญ์ด ์ ํ๋๋ ์๊ฒฉ ํต์ ์ ์ํ์ฌ ๋ง๋ค์ด์ง ํ๋กํ ์ฝ
- ์ฆ, IoT์ ๊ฐ์ ์ ํ ๋ ํน์ ๋๊ท๋ชจ ํธ๋ํฝ ์ ์ก์ ์ํด ๋ง๋ค์ด์ง ํ๋กํ ์ฝ
- TCP/IP ํ๋กํ ์ฝ ์์์ ๋์ํ์ง๋ง ๋์์ ๊ต์ฅํ ๊ฐ๋ฒผ์ฐ๋ฉฐ, ๋ง์ ํต์ ์ ์ฝ๋ค์ ํด๊ฒฐํด์ค
- ๋จ, ๋ฉ์ธ์ง๊ฐ ๊ฐ๋ฒผ์ด ๋งํผ ๋ฉ์ธ์ง ์ ํ์ด๋ QoS(์๋น์ค ํ์ง)์๋ ์ ์ฝ์ด ์กด์ฌ
MQTT ํน์ง
1. ์ฐ๊ฒฐ์งํฅ์ (Connection Oriented)
- ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์ฌ์ ์ ๊ฐ๋ฅ
- Live ๋ผ๋ ํํธ๋นํธ์ Topic ์ ๋ฐํ๋๋ ๋ฉ์ธ์ง๋ฅผ ํตํด ์ฐ๊ฒฐ์ ์ ์งํ๊ณ ๋ฉ์ธ์ง ์ก์์ ์ ํ๊ฒ ๋จ
2. ๋ธ๋ก์ปค๋ฅผ ํตํ ํต์
- MQTT์ ๋ฐํ-๊ตฌ๋ ๋ฉ์์ง ํจํด์ ์ค๋ก์ง ๋ธ๋ก์ปค๋ฅผ ํตํด์๋ง ํต์ ํ ์ ์์ผ๋ฉฐ ๊ฐ์ค๋ Topic์ ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ๋ฉด ํด๋น Topic์ ๊ตฌ๋ ํ๋ ํด๋ผ์ด์ธํธ๋ค์๊ฒ ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ ์ ์์.
- 1:1, ๅค:ๅค ํต์ ๋ชจ๋ ๊ฐ๋ฅ
3. QoS (Quality of Service)
- 0 : ์ต๋ 1ํ ์ ์ก. Topic์ ํตํด ๋ฉ์ธ์ง๋ฅผ ์ ์กํ ๋ฟ ๋ณด์ฅ์ ํ์ง ์์. (๋ณด๋ธ ๋ค์ ์์ด๋ฒ๋ฆผ)
- 1 : ์ต์ 1ํ ์ ์ก. ๊ตฌ๋
ํ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์๋์ง ๋ถํ์คํ๋ฉด ์ ํด์ง ํ์๋งํผ ์ฌ์ ์ก.
- ๋ฉ์ธ์ง์ ํธ๋์ ฐ์ดํน ๊ณผ์ ์ ์๋ฐํ๊ฒ ์ถ์ ํ์ง๋ ์์ผ๋ฏ๋ก ์ค๋ณต์ ์ํ์ฑ ์กด์ฌ (ํ์ธ ์๋ต์ ๊ฑฐ์น๋ ์ ๋ฌ)
- 2 : ๊ตฌ๋
ํ๋ ํด๋ผ์ด์ธํธ๊ฐ ์๊ตฌ๋ ๋ฉ์ธ์ง๋ฅผ ์ ํํ ํ ๋ฒ ์์ ํ ์ ์๋๋ก ๋ณด์ฅ. ๋ฉ์์ง์ ํธ๋์
ฐ์ดํน ๊ณผ์ ์ ์ถ์ .
- ๋์ ํ์ง์ ๋ณด์ฅํ์ง๋ง ์ฑ๋ฅ์ ํฌ์์ด ๋ฐ๋ฅธ๋ค. ๋ณด์ฅ๋ ์ ๋ฌ
- ์ด ํ๋๋ ๊ธฐ๋ฐ์ด ๋๋ TCP/IP ๋ฐ์ดํฐ ์ ์ก์ ์ฒ๋ฆฌ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉฐ, MQTT ์ก์ ์์ ์์ ์ ๊ฐ์๋ง ์ฌ์ฉ๋จ
- ๋ฉ์ธ์ง๋ ๊ธ์ ์ ์ ํ์ด ์์ผ๋ฏ๋ก, ๊ธด ๋ฉ์ธ์ง๋ JSON ํฌ๋งท ๋๋ ํ์ผ๋ ์ ์ก์ด ๊ฐ๋ฅํจ.
→ 0~1 ์ ๋์ QoS ๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ฉ์ธ์ง ์์ค์ ์ํ์ ์์ ์ดํ๋ฆฌ์ผ์ด์ ์ฐจ์์์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ๋๋ฆฌ ์ฐ์
4. ๋ฉ์ธ์ง ์ ํ
์ฐ๊ฒฐํ๊ธฐ
: ์๋ฒ์์ ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฐ ๋ค์, ๋ ธ๋ ๊ฐ ๋งํฌ๋ฅผ ์์ฑํ๋ค.
์ฐ๊ฒฐ๋๊ธฐ
: MQTT ํด๋ผ์ด์ธํธ๊ฐ ํด์ผ ํ ์ผ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์ธํฐ๋ท ํ๋กํ ์ฝ ์ค์ํธ ์ธ์ ์ ์ฐ๊ฒฐ์ด ๋์ด์ง๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆผ
๋ฐํํ๊ธฐ
: MQTT ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์ ๋ฌ๋ ์งํ ์ดํ๋ฆฌ์ผ์ด์ ์ค๋ ๋์ ์ฆ์ ๋ฐํ
5. ๋ค์ํ ๊ฐ๋ฐ ์ธ์ด์ ๋ค์ํ ํด๋ผ์ด์ธํธ ์ง์
C/C++/Java/Node.js/Python/Arduino ๋ฑ ์ฌ๋ฌ ์ข ๋ฅ๋ก ๋ธ๋ก์ปค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กด์ฌ
MQTT ๋์ ๊ตฌ์กฐ
![](https://blog.kakaocdn.net/dn/bDTJI6/btsagOXNsVW/gXGLoz9vQKKmeBwVMHOSb0/img.png)
Topic Wildcard
- Single-Level Wildcard : +
- myhome / groundfloor / + / temperature ์ ํ์์ผ๋ก ์ฌ์ฉ - Multi-Level Wildcard : #
- myhome / groundfloor / # ์ ํ์์ผ๋ก ์ฌ์ฉ
ํ ํฝ ๊ตฌ์กฐ ๊ตฌ์ฑ ์ ์ฃผ์์
- ์ต์์ ํ ํฝ์ด [/] ๋ฌธ์๋ก ์์ํ์ง ์๋๋ก : [/home/sensor/humid] ์ด๋ ๊ฒ ์ฌ์ฉํ ์๋ ์์ง๋ง ์ต์์ ํ ํฝ์ด ์ด๋ฆ์ด ์๋ ํ ํฝ์ด ๋๋ฏ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๊ถ์ฅ
- ํ ํฝ ์ด๋ฆ์ ๊ณต๋ฐฑ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- ํ ํฝ ์ด๋ฆ์ ASCII ๋ฌธ์ ๋ง ์ฌ์ฉ. (์๋ฒ ๋๋ ์ฅ์น์์ ํธํ์ฑ์ ์ํด ์ฃผ์)
- [#] ์ ์ด์ฉํ์ฌ ํ ํฝ ์ ์ฒด๋ฅผ ๊ตฌ๋ ํ์ง ์๋๋ก. ์ค๋ฒํค๋๊ฐ ์ฌํ ๊ฒฝ์ฐ ๋ธ๋ก์ปค/ํด๋ผ์ด์ธํธ ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋ ์ ์์.
MQTT ๋ธ๋ก์ปค
MQTT ํ๋กํ ์ฝ ๋ถ์๊ณผ ํ ์คํธ ๊ธ ์ฐธ์กฐ
WebSocket VS. MQTT
WebSocket์ ์ฅ์
- ์น์์ผ์ HTML5 ์ ํจ๊ป Web ๊ธฐ๋ฐ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฃผ๋ชฉ์ ์ผ๋ก ๋์๊ธฐ ๋๋ฌธ์ ํ์ฌ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์น์์ผ์ ์ง์ํ๊ณ ์์.
- ์ต์ด ์ฐ๊ฒฐ์ HTTP/S๋ฅผ ์ฌ์ฉํ์ฌ ํต์ ํ๊ฒฝ ๋ฑ์ ์ํฅ ์์ด ์์ ์ ์ธ ์ฐ๊ฒฐ์ ์๋ฆฝํ ์ ์๋ค.
- Server-Client ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Connection์ ๋ํ ์ง์ ์ ๊ด๋ฆฌ ๊ฐ๋ฅ
MQTT์ ์ฅ์
- ๋ฐํ/๊ตฌ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด ๋ค๋๋ค ์ ์ก์ด ์ฉ์ด
- QoS(Quality of Service)๋ฅผ ํตํด ๋ฉ์์ง ์ ์ก์ ๋ณด์ฆ
- ๋ฉ์ธ์ง ์ ์ก ํ ์ ์กํ ๋ฉ์์ง๋ฅผ ๋ฐ๋ก ์ญ์ ํ์ง ์๊ณ ๋ฉ์์ง ์ ์ก์ด ์๋ฃ๋์๋ค๋ ํจํท์ ๊ธฐ๋ค๋ฆฌ๊ธฐ ๋๋ฌธ์(PUBACK) ์ ์ก์ ์คํจํ ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ์ ์ก ํ ์ ์์
- ์์ ํจํท ํฌ๊ธฐ๋ก ์ธํด ์ค๋ฒํค๋๊ฐ ์ ๊ณ ์ ์ ๋ ฅ ํ๊ฒฝ์์๋ ๋์์ด ๊ฐ๋ฅ
WebSocket vs MQTT ?
WebSocket์ ๋ ๋ฎ์ ๋ ๋ฒจ์ ํต์ ํ๋กํ ์ฝ์ด๋ฉฐ, MQTT๋ ๋ ๋์ ๋ ๋ฒจ์ ํต์ ๋ฐฉ๋ฒ๋ก ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ ๋น๊ตํ ์ ์๋ ๋์์ด๋ค.
→ ์น ๊ธฐ๋ฐ ํ๊ฒฝ์์ WebSocket ๋์ MQTT๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ํน๋ณํ ์ด์ ๊ฐ ์์ ๋๋ง ํ์ํ ๊ฒ์ด๋ฉฐ, ๊ทธ๊ฒ์ด ์๋๋ผ๋ฉด ๋๋ถ๋ถ์ WebSocket ํ๋๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊ฐ๋ฒผ์ธ ๊ฒ
MQTT ๋ ์ฌ๋ฌผ์ธํฐ๋ท(IoT)๋ฅผ ์ํ ํ๋กํ ์ฝ ... ์๋ฐฑ๋ง ๊ฐ์ IoT ์ฅ์น์ ์ฐ๊ฒฐํ๋๋ก ํ์ฅํ ์ ์์
MQTT ๋ ๋๋ฐ์ด์ค์ ๋ฆฌ์์ค๋ฅผ ์ ๊ฒ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์ด ์๊ณ , ๋จ๋ฐฉํฅ ํต์ ์ด ์๋๋ผ, device์ cloud ๊ฐ ์ก์์ ์ ํ๋ ์๋ฐฉํฅ ํต์ ์ ์ง์ํ๋ค.
→ HTTP ํต์ ์ ์์ฒญ-์๋ต ๊ธฐ๋ฐ์ด์ด์ ํด๋ผ์ด์ธํธ๊ฐ ๋จผ์ ์์ฒญ์ ๋ณด๋ด์ผ ์๋ฒ์ ํต์ ์ด ๊ฐ๋ฅํจ. ๋ฐ๋ฉด์ MQTT๋ ํด๋ผ์ด์ธํธ ํน์ ์๋ฒ ๋ ์ค ๋๊ตฌ๋ ํต์ ์ ์์ํ ์ ์์
๋ค์ํ ์ฌ์ฉ์ + ๋๋ฐ์ด์ค ํ๊ฒฝ์ ๊ณ ๋ คํ๋ฉด์ ์ฑ๋ฅ์ ๋ชฉํ๋ก ํ๋ ๊ฒฝ์ฐ.. MQTT์ Publish/Subscribe ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํด๋ณด๋ ๋ฏ ?
๋์ ์ฌ๋ก: Facebook Messenger
![](https://blog.kakaocdn.net/dn/cthQJY/btsaiaTnAQi/vBPZXqrRBos3SULZA5M840/img.png)
๋์ ์ฌ๋ก : ์ฐ์ํ ํ์ ๋ค
MQTT ์ ์ฉ์ ํตํ ์ค๊ณ์์คํ ๊ฐ์
![](https://blog.kakaocdn.net/dn/bysHXt/btsamW0Qp5d/qgfDs2Tg5EKzajTT9N9xT1/img.png)
์ฐ์ํ ํ์ ๋ค์ 'MQTT ์ ์ฉ์ ํตํ ์ค๊ณ์์คํ ๊ฐ์ ' ๊ธ์์ ์ ์ฉ ํจ๊ณผ ๋ถ๋ถ์ ์ดํด๋ณด๋ฉด ๊ฐ๊ฒฐ, ์ ํ์ฑ, API ์๋ฒ ๋ถํ ๋ฐ ํธ๋ํฝ ๋ฐฉ์ง ๋ฑ์ ์ํด ์์ผํต์ ๋์ MQTT ๋ฅผ ์ฑํํ๋ ๋ฏ ํ๋ค.
์น ๊ฐ๋ฐ์์๋ MQTT๊ฐ ๊ตณ์ด ํ์ํ์ง ์์ง๋ง ์๋น์ค ๊ฐ๋ฐ์์๋
'์น๊ณผ ์ฑ์์ ๋ชจ๋ ์๋น์ค ์ํค๊ณ ์ถ์ ๋ฐ.. ์๋น์ค ๊ท๋ชจ๊ฐ ํฐ ๊ฒฝ์ฐ' ์ฑํ์ ๋ง์ด ํ๋ ๋ฏ ํ๋ค.
'+ ์ฑํ
๊ฐ์ ์๋ฐฉํฅ ์ํต์ด ํ์ํ ์๋น์ค์ ๊ฒฝ์ฐ์
MES์๋ ์ด๊ฒ ํ์ํ ์ ๋๋ก ๋ฐ์ดํฐ๊ฐ ์์ด๋ ์ถ๊ธฐ๋ ํ์ง๋ง,
์กฐ๊ธ ๋ ์๋ฒ์ ๋ถํ์ ์์
์๊ฐ์ ์ค์ด๊ธฐ ์ํด MQTT๋ฅผ ๋์
ํ๋ ๊ฒ ๊ฐ๋ค๋ ์ฝ๊ฐ์ ์๊ฐ๊ณผ ํจ๊ป MQTT ์ ๋ฆฌ๊ธ์ ๋ง์น๋๋ก ํ๊ฒ ๋ค.