한국어
Qt
 

Mobile and Embedded Qt MQTT 에 대해서

makersweb 2020.06.02 17:59 조회 수 : 1091

Qt MQTT를 사용하면 MQ Telemetry Transport (MQTT) 프로토콜을 통해 통신 할 수있는 애플리케이션을 작성할 수 있다.

 
Qt MQTT는 The Qt Company의 상용 또는 GPL v3라이센스에 따라 사용할 수 있다. 자세한 내용은 아래 링크를 참조.
 
게시 및 구독(Publish and Subscribe)
 
MQTT는 게시 및 구독 패턴으로 작동하는 시스템 간 연결 프로토콜이다. MQTT 클라이언트는 MQTT를 사용하여 브로커라고 부르는 MQTT 서버에 대한 네트워크 연결을 작성하는 프로그램 또는 장치다. 연결이 성립되면 클라이언트는 브로커에 메시지를 보낼 수 있다. 다른 클라이언트는 클라이언트가 보낸 특정 Topic에 대한 알림을 구독 할 수 있다.
 
 

mqtt.png

예를 들어, 클라이언트 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)은 메시지가 정확히 한 번 도착한다는 것을 의미한다.
 
번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 87717
119 안드로이드 가상장치 사용 file makersweb 2019.01.13 1185
118 QMake 프로젝트를 CMake 프로젝트로 변환 with qmake2cmake makersweb 2022.09.17 1192
117 Qml에서 커튼효과 구현 예제 - Shader Effects file 운영자 2018.12.05 1213
116 QProcess 예제 (프로그램 재시작) file makersweb 2023.01.25 1238
115 Qt 6의 비동기 API makersweb 2020.10.19 1316
114 많은 리소스를 사용하는 Qt프로젝트에서 고려해봐야 할 qmake 옵션 makersweb 2019.10.11 1319
113 Qt 하이브리드 애플리케이션(Hybrid App) 개발 file makersweb 2023.02.08 1327
112 재진입(Reentrancy) 및 스레드 안전성(Thread-Safety) makersweb 2020.04.19 1354
111 Qt 스마트 포인터 (QSharedPointer, QScopedPointer, QPointer) makersweb 2022.08.18 1368
110 웹기반 Qt Design Viewer [2] file makersweb 2019.10.23 1397
109 tslib의 ts_calibrate를 응용해서 Qt로 터치보정기능 구현 file makersweb 2019.04.06 1465
108 qInstallMessageHandler를 이용한 디버그 메세지 출력 제어하기 makersweb 2019.02.25 1477
107 QThread 및 QMutex 예제 makersweb 2021.01.12 1481
106 Qbs에 대한 소개와 설치하는 방법 makersweb 2019.10.09 1488
105 싱글터치 스크린 및 임베디드 리눅스 기반에서 Qt 터치입력 makersweb 2018.12.24 1516
104 QML과 JavaScript 의 숫자 관련 내장된 함수 makersweb 2021.03.28 1561
103 Qt Quick 3D 소개 makersweb 2019.11.09 1584
102 QML에서 undefined를 확인하는 방법 makersweb 2017.11.29 1609
101 ApplicationWindow 와 메뉴바(MenuBar)구성 file makersweb 2020.01.04 1619
100 Widgets(C++) 기반의 기본 스타일을 Dark 테마 및 Material 디자인 스타일로 바꾸기 file makersweb 2023.01.28 1633