Qt MQTT 개요

Qt MQTT 를 사용하면 MQTT(원격 측정 전송) 프로토콜을 통해 통신할 수 있는 애플리케이션과 장치를 만들 수 있습니다. MQTT 프로토콜 사양을 완벽하게 준수합니다.

게시 및 구독

MQTT는 게시 및 구독 모델에서 작동하는 기계 간 연결 프로토콜입니다. MQTT 클라이언트는 브로커라고도 하는 MQTT를 사용하여 MQTT 서버에 대한 네트워크 연결을 생성하는 프로그램 또는 디바이스입니다. 연결이 생성되면 클라이언트는 브로커에 메시지를 보낼 수 있습니다. 다른 클라이언트는 클라이언트가 보낸 특정 주제에 대한 알림을 구독할 수 있습니다.

예를 들어, 클라이언트 2가 토픽 A에 대한 메시지를 구독하면 클라이언트 1이 해당 토픽에 대한 메시지를 보낼 때 알림을 받습니다. 클라이언트 3이 주제 A와 주제 B를 구독하는 경우 두 주제에 대한 메시지에 대한 알림을 받습니다.

Qt MQTT 는 브로커가 포함되지 않은 클라이언트 솔루션입니다. 특히 임베디드 디바이스용 원격 분석 애플리케이션을 개발하는 데 적합합니다. 그러나 Qt MQTT 에는 외부 종속성이 없으므로 구현된 클라이언트는 지원되는 모든 Qt 플랫폼에서 실행할 수 있습니다.

토픽

토픽은 계층적 트리 구조로 저장됩니다. 이 표준은 트리를 어떻게 설계해야 하는지 지정하지 않으며 미리 정의된 계층 구조 집합도 제공하지 않습니다. 프로젝트에 필요한 대로 계층 구조를 자유롭게 설계할 수 있습니다. 다음은 토픽 계층 구조의 예시이며, 여기서 active는 모든 활성 센서를 의미하고 집과 차고는 개별 센서를 의미합니다:

sensors/active
sensors/house/temperature
sensors/house/bedroom/light
sensors/house/livingroom/light
sensors/garage/temperature
sensors/garage/light

와일드카드를 사용하여 토픽 구독하기

클라이언트가 토픽을 구독할 때 해시 표시(#)와 더하기 기호(+)를 와일드카드로 사용할 수 있습니다. 해시 표시는 클라이언트가 한 토픽 및 해당 하위 토픽의 모든 메시지에 대한 알림을 받기를 원한다는 것을 나타냅니다. 예를 들어 클라이언트가 sensors/house/#을 구독하는 경우에는 센서에 대한 모든 메시지를 수신합니다.

더하기 기호는 일치하는 하위 토픽을 찾을 때 트리의 가지를 건너뛸 수 있음을 나타냅니다. 예를 들어 클라이언트가 센서를/+/온도를 구독하는 경우 어떤 센서에서 메시지를 보냈는지에 관계없이 온도에 대한 메시지를 수신합니다. 여러 개의 더하기 기호를 사용하여 여러 분기를 건너뛸 수 있습니다. 예를 들어, 집/+/+/온도를 사용하면 한 집에 있는 모든 아파트의 모든 방의 온도에 대한 메시지를 받을 수 있습니다.

공유 구독

공유 구독은 하나의 토픽 필터에 대한 구독자 풀을 설명합니다. 모든 가입자가 메시지를 받는 대신 한 명의 가입자만 메시지를 받습니다. 이렇게 하면 여러 클라이언트에서 부하를 분산할 수 있습니다. 공유 구독의 형식은 다음과 같습니다:

$share/{sharename}/{topicfilter}

예를 들어 클라이언트 1과 클라이언트 2가 센서/집/온도라는 토픽에 대한 구독을 공유해야 하는 경우, 구독할 토픽 필터는 다음과 같습니다:

$share/poolAB/sensors/house/temperature

서버에서 어떤 순서로 메시지를 배포할지는 정의되어 있지 않습니다. 이것은 서버별 옵션입니다.

서버가 공유 구독을 지원하는지 여부를 확인하려면 QMqttServerConnectionProperties::sharedSubscriptionSupported()도 참조하세요.

토픽 별칭

트리에서 토픽을 구조화하면 데이터 채널을 분리하고 정보의 논리적 순서를 제공하는 데 도움이 됩니다. 그러나 이로 인해 메시지를 게시하는 동안 매우 긴 토픽 이름이 사용되어 각 메시지의 크기가 커질 수 있습니다.

MQTT 5.0 프로토콜 버전에서는 이를 방지하기 위해 토픽 별 칭을 도입했습니다. 토픽 문자열 대신 정수 값이 전송됩니다. 클라이언트와 서버 간의 초기 매핑을 생성하려면 토픽 문자열과 별칭이 모두 메시지의 일부가 되어야 합니다. 그 이후에는 토픽이 비어 있는 ID만 사용됩니다.

이 매핑은 다른 토픽 문자열과 함께 토픽 별칭을 사용하여 언제든지 변경할 수 있습니다. 이 매핑은 서버에서 다른 클라이언트로의 연결과 같은 다른 연결에는 반드시 적용되지 않습니다. 각 연결은 이 매핑을 수동으로 만들어야 합니다.

Qt MQTT 는 데이터 속도를 줄이는 데 도움이 되는 자동화된 메커니즘을 제공합니다. QMqttClient 에서 연결을 만들면 서버에서 지원하는 토픽 별칭에 대한 정보가 저장됩니다. 그 후 사용 가능한 모든 별칭이 사용될 때까지 메시지가 게시되는 순서대로 토픽 별칭이 사용됩니다. 사용자는 게시 중에 QMqttPublishProperties::setTopicAlias()를 사용하여 언제든지 이 매핑을 수정할 수 있습니다.

QMqttClient 이 토픽을 구독하면 서버는 클라이언트가 설정한 QMqttConnectionProperties::maximumTopicAlias() 값에 따라 토픽 별칭도 사용할 수 있습니다. 클라이언트는 자동으로 토픽 별칭을 매핑하고 전체 토픽 문자열을 포함하여 사용자에게 메시지를 투명하게 전달합니다.

보안

클라이언트와 브로커 간의 연결은 사용자 이름과 비밀번호를 사용하는 내장된 인증 시스템으로 보호됩니다. 메시지는 전송 계층에서 SSL/TLS를 사용하여 암호화됩니다. 암호화된 MQTT 메시지의 표준화된 포트 번호는 8883입니다.

서비스 품질

메시지에 대한 다음과 같은 서비스 품질(QoS) 수준이 정의되어 있습니다:

  • 최대 한 번(0)은 운영 환경의 최선의 노력에 따라 메시지가 전달되므로 메시지 손실이 발생할 수 있음을 의미합니다. 예를 들어, 이 수준은 다음 판독값이 곧 게시되므로 개별 판독값이 손실되더라도 상관없는 주변 센서 데이터에 사용할 수 있습니다.
  • 적어도 한 번(1)은 메시지가 확실히 도착하지만 중복이 발생할 수 있음을 의미합니다.
  • 정확히 한 번(2)은 메시지가 정확히 한 번만 도착하도록 보장됨을 의미합니다. 이 수준은 예를 들어 중복되거나 분실된 메시지로 인해 잘못된 요금이 부과될 수 있는 청구 시스템에서 사용할 수 있습니다.

유언 메시지

유언이라고도 하는 유언 메시지는 클라이언트가 브로커 위치에 저장하는 메시지입니다. 클라이언트와 브로커 간의 연결이 예기치 않은 방식으로 끊어지는 경우 유언장 메시지는 유언장 토픽의 모든 가입자에게 전달됩니다.

유언장 메시지는 연결 단계에서 지정해야 합니다. 따라서 QMqttClient::connectToHost() 또는 QMqttClient::connectToHostEncrypted()를 호출하기 전에 반드시 설정해야 합니다. 유언 메시지에는 일반 메시지의 모든 속성뿐만 아니라 유언 토픽, QoS 수준, 유지 플래그 및 메시지 페이로드가 포함됩니다.

클라이언트가 QMqttClient::disconnectFromHost()를 호출하여 일반 방식으로 브로커와의 연결을 끊으면 브로커는 윌 메시지를 삭제합니다. 필요한 경우 클라이언트는 연결을 끊기 전에 필요한 모든 메시지를 보낼 책임이 있습니다.

보관된 메시지

보관된 메시지는 브로커 측에 저장됩니다. 향후 클라이언트가 연결할 때 해당 메시지를 받게 됩니다. 일반적인 사용 사례는 게시자의 현재 상태 상태를 보존된 메시지에 저장하는 것입니다. 구독자는 즉시 상태에 대한 메시지를 받게 됩니다.

브로커는 지정된 주제에 대해 마지막으로 전송된 보존된 메시지만 저장할 수 있습니다. 클라이언트가 QoS 수준이 0인 보존 메시지를 게시하는 경우 브로커에서 해당 주제에 대해 이전에 보존된 메시지는 모두 삭제되어야 합니다. 브로커는 마지막 메시지를 저장해야 하지만 삭제할 수도 있습니다. 이는 브로커의 구현에 따라 다릅니다.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.