Qt MQTT를 사용하면 MQ Telemetry Transport (MQTT) 프로토콜을 통해 통신 할 수있는 애플리케이션을 작성할 수 있다.
Qt MQTT는 The Qt Company의 상용 또는 GPL v3라이센스에 따라 사용할 수 있다. 자세한 내용은 아래 링크를 참조.
게시 및 구독(Publish and Subscribe)
MQTT는 게시 및 구독 패턴으로 작동하는 시스템 간 연결 프로토콜이다. MQTT 클라이언트는 MQTT를 사용하여 브로커라고 부르는 MQTT 서버에 대한 네트워크 연결을 작성하는 프로그램 또는 장치다. 연결이 성립되면 클라이언트는 브로커에 메시지를 보낼 수 있다. 다른 클라이언트는 클라이언트가 보낸 특정 Topic에 대한 알림을 구독 할 수 있다.
예를 들어, 클라이언트 2가 주제(Topic) A의 메시지를 구독하면 클라이언트 1이 해당 주제(Topic)에 대한 메시지를 보낼 때 알림을받는다. 클라이언트 3이 주제(Topic) A와 주제 B를 구독하면 두 토픽 모두에 대한 메시지를 받을 수 있다.
Qt MQTT는 브로커를 포함하지 않는 클라이언트 솔루션이다. 임베디드 장치를 위한 원격 측정 어플리케이션 개발에 특히 적합하지만 Qt MQTT에는 외부 종속성이 없는대신 Qt 플랫폼에서만 실행될 수 있다.
주제(Topics)
토픽은 계층 적 트리 구조로 저장된다. 표준에서는 트리 설계 방법을 지정하지 않으며 사전 정의 된 계층 구조 세트를 제공하지도 않는다. 프로젝트에 필요한대로 계층 구조를 자유롭게 디자인 할 수 있다.
다음은 Topic 계층 구조의 예이다. 여기서 active는 모든 활성 센서를 의미하지만 house과 garage는 개별 센서이다.
sensors/active
sensors/house/temperature
sensors/house/bedroom/light
sensors/house/livingroom/light
sensors/garage/temperature
sensors/garage/light
와일드카드를 사용하여 Topic 구독(Subscribing to Topics Using Wildcards)
클라이언트가 토픽을 구독하면 해시 표시(#) 및 더하기 부호(+)를 와일드 카드로 사용할 수 있다. 해시 표시는 클라이언트가 토픽 및 하위 토픽의 모든 메시지에 대한 알림을 수신하려고 할때 사용한다. 예를 들어, 클라이언트가 sensors/house/# 를 구독하면 house sensor의 모든 메시지를 수신한다.
더하기 부호는 일치하는 하위 토픽를 찾을 때 트리의 분기를 건너 뛸 수 있다. 예를 들어, 클라이언트가 sensors/+/temperature 를 구독하면 어떤 센서가 전송했는지에 관계없이 온도에 대한 메시지를받는다.
여러 개의 더하기 기호를 사용하여 여러 분기를 건너 뛸 수 있다. 예를 들어, house/+/+/temperature 는 house의 모든 방의 온도에 대한 메시지를 받는 데 사용될 수 있다.
Shared Subscriptions
공유되는 구독은 하나의 토픽 필터에 대한 구독자 풀을 설명한다. 모든 구독자가 메시지를받는 대신 한 명의 구독자만 메시지를받는다.
이를 통해 여러 클라이언트에서 로드 밸런싱 조정이 가능하다. 공유 구독의 형식은 다음과 같다.
$share/{sharename}/{topicfilter}
예를 들어, 클라이언트 1과 클라이언트 2가 sensors/house/temperature 에 대한 구독을 공유해야하는 경우 구독 할 토픽 필터는 다음과 같다.
$share/poolAB/sensors/house/temperature
서버가 메시지를 분배하는 순서는 정의되어 있지 않다.
토픽 별칭(Topic Aliases)
트리에서 토픽을 구조화하면 데이터 채널을 분리하고 정보의 논리적 순서를 제공하는 데 도움이 된다. 그러나 이로 인해 메시지를 발행하는 동안 매우 긴 토픽 이름이 사용되어 각 메시지의 크기가 증가 할 수 있다.
MQTT 5.0 프로토콜 버전은 이 문제를 피하기 위해 토픽 별칭을 도입했다. 토픽 문자열 대신 정수 값이 전송된다. 클라이언트와 서버간에 초기 매핑을 만들려면 토픽 문자열과 별칭이 모두 메시지의 일부여야 한다. 이후에는 토픽이 비어있는 ID 만 사용된다.
이 맵핑은 다른 토픽 문자열과 함께 토픽 별칭을 사용하여 언제든지 변경할 수 있지만 각 연결은 매핑을 수동으로 만들어야 한다.
Qt MQTT는 데이터 속도를 줄이는 데 도움이 되는 자동화 된 메커니즘을 제공한다. QMqttClient 가 연결을 수립한 후 서버에서 지원하는 토픽 별칭에 대한 정보가 저장된다. 이후에 사용 가능한 모든 별칭이 사용될 때까지 메시지가 게시 된 순서대로 토픽 별칭이 사용된다. 사용자는 항상 게시 중에 QMqttPublishProperties::setTopicAlias() 를 사용하여 매핑을 수정할 수 있다.
QMqttClient가 토픽을 구독 할 때 서버는 클라이언트가 설정 한 QMqttConnectionProperties::maximumTopicAlias() 값에 따라 토픽 별칭도 사용할 수 있다.
클라이언트는 토픽 별칭을 자동으로 맵핑하고 전체 토픽 문자열을 포함하여 메시지를 클라이언트에게 투명하게 전달한다.
품질(Quality of Service)
메시지에 대해 다음과 같은 서비스 품질 (QoS) 수준을 정의할 수 있다.
- 최대 한 번 (0)은 브로커/클라이언트가 확인 없이 메시지를 한 번 전달합니다. 메시지 손실이 발생할 수 있음을 의미합니다. 이 레벨은 예를 들어 주변 센서 데이터와 함께 사용될 수 있다. 센서의 개별 측정 값이 손실되더라도 곧바로 다음 측정 치가 게시되므로 문제가 없을 것이다.
- 적어도 한 번 (1)은 메시지가 도착하도록 보장되지만 중복이 발생할 수 있음을 의미한다.
- 정확히 한 번 (2)은 메시지가 정확히 한 번 도착한다는 것을 의미한다.