MQTT란 무엇인가요?
MQTT (Message Queuing Telemetry Transport)는 가볍고 효율적인 메시지 전달 프로토콜입니다. 주로 IoT (Internet of Things) 환경에서 사용되며, 제한된 대역폭 및 불안정한 네트워크 환경에서도 안정적인 통신을 제공합니다. MQTT는 클라이언트-서버 모델을 사용하여 메시지를 발행하고 구독하는 방식으로 작동합니다.
MQTT의 주요 특징
- 경량성: MQTT는 헤더 오버헤드가 매우 작아 제한된 리소스 환경에서도 효율적으로 동작합니다.
- 게시/구독 모델 (Publish/Subscribe): 클라이언트는 메시지를 게시하고 다른 클라이언트는 필요한 주제를 구독하여 메시지를 받을 수 있습니다.
- 품질 수준 (QoS, Quality of Service): 메시지 전달 신뢰성을 보장하기 위해 세 가지 QoS 수준을 제공합니다.
- 유지 연결 (Keep Alive): 클라이언트와 브로커 간의 연결 상태를 유지합니다.
- 지속 세션: 클라이언트가 오프라인 상태에서도 메시지를 받을 수 있게 합니다.
MQTT의 사용 사례
- 스마트 홈: IoT 기기 간의 통신을 통해 조명, 온도 조절, 보안 시스템 등을 제어합니다.
- 산업 자동화: 공장 내 다양한 장비와 센서 간의 데이터를 수집하고 모니터링합니다.
- 원격 모니터링: 원격지에 있는 장치의 상태를 실시간으로 모니터링하고 제어합니다.
- 헬스케어: 웨어러블 디바이스를 통해 실시간으로 건강 데이터를 수집하고 분석합니다.
MQTT의 장점과 단점
장점
- 효율성: 저전력 및 저대역폭 환경에서 효율적으로 동작합니다.
- 확장성: 수많은 클라이언트를 쉽게 지원할 수 있습니다.
- 유연성: 다양한 장치와 플랫폼에서 사용 가능합니다.
단점
- 보안: 기본적인 MQTT는 보안 기능이 부족하여 추가적인 보안 계층이 필요합니다.
- 상태 유지: 브로커가 다운되면 연결된 모든 클라이언트가 영향을 받을 수 있습니다.
이렇게 MQTT는 다양한 환경에서 효율적인 메시지 통신을 가능하게 하는 프로토콜입니다. IoT 및 분산 시스템에서 특히 유용하게 사용되고 있습니다.
MQTT 원리에 대한 상세 설명
MQTT (Message Queuing Telemetry Transport)는 경량 메시지 프로토콜로, IoT 및 기타 제한된 네트워크 환경에서의 효율적인 통신을 위해 설계되었습니다. MQTT의 핵심 원리는 게시/구독 (Publish/Subscribe) 모델을 기반으로 하며, 이는 전통적인 클라이언트-서버 모델과는 다른 접근 방식을 취합니다.
1. MQTT의 기본 구성 요소
1.1 브로커 (Broker)
- 역할: 중앙 허브 역할을 하며 클라이언트가 발행한 메시지를 수신하고 이를 구독한 클라이언트에게 전달합니다.
- 기능:
- 메시지 라우팅
- 클라이언트 연결 관리
- 메시지 보관 (Retained Messages)
1.2 클라이언트 (Client)
- 역할: 메시지를 발행하거나 구독하는 장치 또는 애플리케이션입니다.
- 기능:
- 브로커와 연결 수립 및 유지
- 메시지 발행 (Publish)
- 메시지 구독 (Subscribe)
- 메시지 수신 (Receive)
2. MQTT 동작 과정
구분 | 내용 |
연결(Connect) |
|
발행(Publish) |
|
구독(Subscribe) |
|
메시지 전달(Message Delivery) |
|
연결 해제(Disconnect) |
|
3. MQTT의 QoS (Quality of Service)
QoS는 메시지 전달의 신뢰성을 보장하는 메커니즘으로, MQTT는 세 가지 QoS 수준을 제공합니다.
3.1 QoS 0: At most once (최소 1회)
- 메시지는 한 번만 전송되며, 전달 보장이 없습니다.
- 네트워크 장애가 발생할 경우 메시지가 손실될 수 있습니다.
3.2 QoS 1: At least once (최소 1회)
- 메시지는 최소 한 번 이상 전달됩니다.
- 클라이언트는 메시지를 수신하면 브로커에 확인 응답을 보냅니다.
- 중복 메시지가 발생할 수 있습니다.
3.3 QoS 2: Exactly once (정확히 1회)
- 메시지는 정확히 한 번 전달됩니다.
- 가장 높은 수준의 전달 보장을 제공합니다.
- 브로커와 클라이언트 간에 4단계의 핸드셰이크 과정이 필요합니다.
4. 유지 연결 (Keep Alive)
- 클라이언트는 브로커와 주기적으로 Ping 메시지를 주고받아 연결 상태를 유지합니다.
- 브로커는 설정된 시간 동안 클라이언트로부터 Ping 메시지를 받지 못하면 클라이언트의 연결이 끊어진 것으로 간주합니다.
5. 지속 세션 (Persistent Session)
- 클라이언트가 오프라인 상태에서도 구독 정보를 유지하고, 재연결 시 구독한 주제의 메시지를 받을 수 있도록 합니다.
- 브로커는 클라이언트의 세션 상태를 보관합니다.
6. 메시지 보관 (Retained Messages)
- 클라이언트가 발행한 메시지를 브로커가 보관하여 새로운 구독자에게 즉시 전달할 수 있습니다.
- 마지막 메시지가 브로커에 보관되어 주제에 대한 새로운 구독자가 있을 때 즉시 전달됩니다.
7. MQTT의 보안
MQTT는 기본적으로 보안 기능이 없지만, TLS (Transport Layer Security) 및 사용자 인증을 통해 보안을 강화할 수 있습니다.
- TLS: 브로커와 클라이언트 간의 데이터 암호화
- 사용자 인증: 사용자 이름과 비밀번호를 사용한 인증
MQTT에서 Topic에 대해 알아보기
MQTT에서 주제(Topic)는 메시지를 분류하고 라우팅하기 위해 사용되는 문자열입니다. 주제는 메시지를 발행하는 클라이언트와 메시지를 구독하는 클라이언트를 연결하는 중요한 역할을 합니다.
1. Topic의 구조
MQTT 주제는 계층적 구조를 가지며 슬래시 ('/')를 사용하여 레벨을 구분합니다. 예를 들어:
- home/livingroom/temperature
- home/kitchen/humidity
이와 같은 구조는 주제를 논리적으로 구분하고, 특정 구독을 통해 필요한 메시지만 필터링하는 데 도움이 됩니다.
2. 주제의 특징
2.1 계층적 구조
- 주제는 여러 레벨로 나뉘며, 각 레벨은 슬래시 ('/')로 구분됩니다.
- 예: home/livingroom/light에서 home, livingroom, light는 각각 다른 레벨입니다.
2.2 주제 이름은 대소문자를 구분
- home/temperature와 Home/Temperature는 서로 다른 주제로 인식됩니다.
2.3 와일드카드
와일드카드를 사용하여 여러 주제를 한 번에 구독할 수 있습니다.
2.3.1 멀티 레벨 와일드카드 (#)
- #는 주제 트리의 여러 레벨을 대체합니다.
- 예: home/#는 home으로 시작하는 모든 주제를 구독합니다. (home/livingroom/temperature, home/kitchen/humidity 등)
2.3.2 싱글 레벨 와일드카드 (+)
- +는 주제 트리의 한 레벨을 대체합니다.
- 예: home/+/temperature는 home 레벨 다음의 한 레벨을 포함하는 모든 주제를 구독합니다. (home/livingroom/temperature, home/kitchen/temperature 등)
3. 주제 구독과 메시지 발행
3.1 주제 구독 (Subscribe)
- 클라이언트는 브로커에 특정 주제를 구독하겠다고 요청합니다.
- 브로커는 해당 주제에 발행되는 모든 메시지를 구독한 클라이언트에게 전달합니다.
3.2 메시지 발행 (Publish)
- 클라이언트는 특정 주제로 메시지를 발행합니다.
- 브로커는 해당 주제를 구독한 모든 클라이언트에게 메시지를 전달합니다.
4. 주제의 사용 예시
4.1 스마트 홈
- home/livingroom/temperature: 거실의 온도 데이터를 나타냅니다.
- home/kitchen/humidity: 주방의 습도 데이터를 나타냅니다.
4.2 산업 자동화
- factory/machine1/status: 공장 내 기계 1의 상태를 나타냅니다.
- factory/machine2/temperature: 기계 2의 온도 데이터를 나타냅니다.
4.3 교통 관리
- city/bus/123/location: 버스 123의 위치 데이터를 나타냅니다.
- city/traffic/camera/5/image: 교통 카메라 5의 이미지를 나타냅니다.
5. 주제의 설계 원칙
5.1 명확하고 일관된 이름 사용
- 주제를 명확하고 일관되게 설계하여 다른 사용자가 쉽게 이해할 수 있도록 합니다.
- 예: sensors/temperature/outdoor와 같이 구체적인 이름 사용.
5.2 필요한 정보만 포함
- 주제 이름에 불필요한 정보를 포함하지 않도록 주의합니다.
- 예: user123/temperature 대신 user/123/temperature로 구조화.
5.3 와일드카드 사용의 신중함
- 와일드카드는 편리하지만, 잘못 사용하면 불필요한 데이터가 포함될 수 있습니다. 필요한 데이터만 정확히 구독하도록 합니다.
'잡학다식' 카테고리의 다른 글
HTTP와 TCP 소켓 통신의 차이점, 언제 무엇을 선택해야 할까? (0) | 2024.10.30 |
---|---|
호기심을 자극하는 차세대 에너지, 소형모듈원전(SMR) 알아보기 (4) | 2024.10.22 |
TypeScript로 더 빠르고 안전하게! 성능과 장점을 알아보자 (0) | 2024.09.08 |
CRM이란 무엇인가? 도입 이유와 비즈니스 성과를 극대화하는 방법 (0) | 2024.08.23 |
UUID와 ULID 차이점 알아보기 (0) | 2023.03.28 |