MQTT
MQTT(Message Queueing Telemetry Transport)는 머신 대 머신 통신에 사용되는 표준 기반 메시징 프로토콜 또는 규칙 세트이다.
스마트 센서, 웨어러블 및 기타 IoT 디바이스는 일반적으로 리소스 제약이 있는 네트워크를 통해 제한된 대역폭으로 데이터를 전송하고 수신해야 한다. MQTT는 IoT의 데이터 전송에 사용되며, 구현이 쉽고 IoT 데이터를 효율적으로 전달할 수 있다. MQTT는 디바이스에서 클라우드로, 클라우드에서 디바이스로의 messaging을 지원한다.
즉, MQTT는 TCP/IP 프로토콜 위에서 동작하면서 굉장히 가볍고, 많은 통신 제약들을 해결해준다.
MQTT의 특징
1. 브로커를 통한 통신
MQTT protocol은 메시지를 발행(publishing)하고, 관심있는 주제를 구독(subscribe)하는 것을 기본 원칙으로 한다.
- MQTT의 publish - subscribe messaging 패턴은 Publisher와 Subscriber은 모두 Broker에 대한 클라이언트로만 작동한다.
- 개설된 Topic에 메시지를 발행하면 해당 Topic을 구독하는 클라이언트들에게 메시지를 발행할 수 있다.
- 덕분에 일대일, 혹은 일대다 통신이 모두 가능하다.
❓ Topic이란?
Pub와 Sub는 토픽을 기준으로 작동한다.
메시지를 publish - subscribe하는 행위는 채널단위로 일어나며, 이를 MQTT에서는 토픽(Topic)이라 부르는 것이다.
토픽은 슬래시(/)를 이용해 계층적으로 구성할 수 있어 센서 기기들을 효율적으로 관리할 수 있다.
✨ 와일드 카드 → +, *
예를 들어 Subscriber가 위의 사진에서 /sensors/NOD_NAME/temperature/CPU에 대해 구독하도록 하였다면, 그 Subscriber는 해당 토픽에 관한 내용만 받아들일 수 있다.
그러나 /sensors/NODE_NAME/temperature/* 으로 와일드 카드 *을 사용하여 구독한다면
HARDDISK, CPU, MEMORY 정보를 모두 받을 수 있다.
즉, * 와일드 카드는 같은 부모 노드를 가진 형제 노드 전부를 동시에 구독할 수 있게 해준다.
하지만 자식 노드가 없는 단말노드에만 해당한다.
만약 자식 노드가 있다면, + 와일드 카드를 사용하여야 한다.
예를 들어, NODE_NAMME에 해당하는 부분이 다음과 같은 구조라고 가정하자.
sensors/node1/temperature/...
senosor/node2/temperature/...
이 경우, node1과 node2 둘다 받을 때에는 단말노드가 아니므로 +를 사용한다.
sensors/+/temperature/CPU와 같은 형식으로 Topic을 지정하면
node1의 CPU 온도와 node2의 CPU 온도를 둘다 받을 수 있다.
실생활의 예를 들어보면 신문 구독을 예시로 들수 있다.
- Subscribe - 신문 구독
- Topic - 조선일보, 한겨레 신문 등등
- Publish - 기사 발행
- Broker - 신문 배달원
이때 위의 예시에서 나는 신문을 발행할 수 없지만, MQTT에서는 내가 Publisher가 될 수 있다.
2. 연결지향적(Connection Oriented)
- MQTT 브로커와 연결을 요청하는 클라이언트는 TCP/IP 소켓 연결을 한 후 명시적으로 연결을 끊거나 네트워크 사정에 의해 연결이 끊어질 때까지 상태를 유지한다.
- Live라는 하트비트와 Topic에 발행되는 메시지를 통해 연결을 유지하고 메시지 송수신을 한다.
- 연결이 끊어지면 재접속이 가능하다.
3. QoS(Quality of Service)
MQTT는 3단계의 Quality of Service를 제공한다.
이 필드는 TCP/IP 데이터 전송의 처리에 영향을 주지 않으며, MQTT 송신자와 수신자 간에만 사용된다.
메시지의 글자수 제한이 없기 때문에 긴 메시지나 JSON 포맷 또는 파일 전송이 가능하다.
- QoS 0(At most Once)
- 메시지 최대 1회 전송
- Topic을 통해 메시지를 전송할 뿐 전달여부를 확인하지 않는다.
- Fire and Forget 타입
- QoS 1(At least Once)
- 메시지 최소 1회 전송
- 구독하는 클라이언트가 메시지를 받았는지 불확실하면 정해진 횟수만큼 재전송한다.
- 메시지의 핸드셰이킹 과정을 엄밀하게 추적하지 않기 때문에 중복 전송될 수 있다.
- 확인 응답을 거치는 전달
- QoS 2(Exactly Once)
- 구독하는 클라이언트가 요구된 메시지를 정확히 1번 수신할 수 있도록 보장한다.
- 메시지의 핸드셰이킹 과정을 추적한다.
- 높은 품질을 보장하지만 성능의 희생이 따른다.
- 보장된 전달
0에 가까워질수록 메시지 처리에 대한 부하가 줄어들고, 메시지 손실의 위험이 높아진다.
반대로 2에 가까워질수록 메시지 손실은 줄어들지만 메시지 처리 부하가 급격히 늘어난다.
단, 0~1정도의 QoS를 사용하며 메시지 손실의 위험은 상위 애플리케이션 차원에서 관리하는 방법이 널리 사용되고 있다.
4. 메시지 유형
- 연결하기 : 서버와의 연결 수립을 기다린 다음 노드 간 링크를 만든다.
- 연결 끊기 : MQTT 클라이언트가 해야 할 일을 기다리고 인터넷 프로토콜 스위트 세션의 연결이 끊어지길 기다린다.
- 발행하기 : MQTT 클라이언트에 요청이 전달된 직후 애플리케이션 스레드에 즉시 반환한다.
- 각각의 메시지의 event에 따라 MQTT 브로커가 Notification을 주어 대응할 수 있도록 한다.
5. 다양한 개발언어의 클라이언트 지원
C/C++/Java/Node.js/Python/Anduino 등 여러 종류로 브로커와 라이브러리가 존재한다.
MQTT의 장점
1. 가볍고 효율적임
MQTT를 IoT 디바이스에 구현할 때는 최소한의 리소스가 필요하다. 따라서 작은 마이크로컨트롤러에도 사용될 수 있다. MQTT 메시지 헤더도 작기 때문에 네트워크 대역폭을 최적화할 수 있다.
2. 확장성
MQTT 구현에는 최소량의 코드가 필요하며 작업 시 아주 작은 전력만 소비된다.
이 프로토콜은 또한 많은 수의 IoT 디바이스와의 통신을 지원하기 위한 기본적인 기능을 갖추고 있다.
따라서 MQTT 프로토콜을 구현하여 수백만 개의 디바이스에 연결할 수 있다.
3. 신뢰성
많은 IoT 디바이스가 대역폭은 낮고 지연 시간은 긴 신뢰할 수 없는 셀룰러 네트워크를 통해 연결된다.
MQTT에는 IoT 디바이스에서 클라우드에 다시 연결하는 데 소요되는 시간을 줄여주는 기능이 기본적으로 탑재되어 있다.
또한 최대 QoS를 정의하여 IoT 사용 사례에 필요한 신뢰성을 보장해준다.
4. 보안
개발자는 MQTT를 사용하면 메시지를 손쉽게 암호화하고 QAuth, TLS1.3, 고객 관리형 인증서 및 기타 최신 인증 프로토콜을 사용하여 디바이스와 사용자를 인증할 수 있다.
MQTT 동작원리
1. 클라이언트가 토픽을 구독하거나 발행할 수 있는 네트워크에 연결한다.
2. MQTT 클라이언트가 토픽을 게시하면 MQTT 브로커와의 연결을 설정한다.
3. 연결되면 클라이언트에서 메시지를 게시하거나 특정 메시지를 구독하거나 둘 다 수행할 수 있다.
4. MQTT 브로커는 메시지를 수신한 후 메시지에 관심이 있는 구독자에게 메시지를 전달한다.
아래에 실생활에서의 예시를 들어 동작원리를 설명해두었다.
MQTT Topic
Topic은 MQTT 브로커가 MQTT 클라이언트를 위한 메시지를 필터링할 때 사용하는 키워드이다. Topic은 파일 또는 폴더 디렉터리와 유사한 계층 구조로 정렬된다. 예를 들어 여러 층으로 된 주택에서 작동하는 스마트 홈 시스템을 구상하면 각 층에는 서로 다른 스마트 디바이스가 있다. 이 경우 MQTT 브로커는 주제를 다음과 같이 정렬할 수 있다.
ourhome/groundfloor/livingroom/light
ourhome/firstfloor/kitchen/temperature
MQTT Publish
MQTT 클라이언트는 주제 및 데이터가 바이트 형식으로 포함된 메시지를 publish 한다. 클라이언트는 텍스트 데이터, 바이너리 데이터, XML 또는 JSON 파일과 같은 데이터 형식을 결정한다. 예를 들어 스마트 홈 시스템의 조명은 livingroom/light 주제에 on이라는 메시지를 게시할 수 있다.
MQTT Subscribe
MQTT 클라이언트는 MQTT 브로커에 SUBSCRIBE 메시지를 보내 관심 주제에 대한 메시지를 수신한다. 이 메시지에는 구독의 고유 식별자와 목록이 포함된다. 예를 들어 휴대폰의 스마트 홈 앱을 사용하여 집안에 켜져 있는 조명의 수를 표시하려면 light 주제를 구독하고 모든 on 메시지의 카운터를 늘린다.
MQTT의 안전성
MQTT 통신은 기본적으로 TCP/IP를 기반으로 하지만 SSL 프로토콜을 사용하여 IoT 디바이스에서 전송되는 민감한 데이터를 보호할 수 있다.
SSL 인증서와 암호를 사용하여 클라이언트와 브로커 간의 ID, 인증 및 권한 부여를 구현할 수 있다.
MQTT 브로커는 일반적으로 암호와 각 클라이언트에 할당되는 고유 클라이언트 식별자를 사용하여 클라이언트를 인증한다. 대부분의 구현에서 클라이언트는 인증서 또는 DNS 조회를 통해 서버를 인증하며 MQTT와 함께 암호화 프로토콜을 구현할 수 있다.
참조
https://aws.amazon.com/ko/what-is/mqtt/
https://underflow101.tistory.com/22
https://dejavuhyo.github.io/posts/mqtt-concept/
https://dalkomit.tistory.com/90
https://webnautes.tistory.com/1644
https://khj93.tistory.com/entry/MQTT-MQTT%EC%9D%98-%EA%B0%9C%EB%85%90
'공부 기록 > 통신' 카테고리의 다른 글
[MQTT/JavaScript] JavaScript에서 MQTT 수신하기 (2) | 2024.09.13 |
---|