한국어
Qt
 

Qt MQTT 를 사용해보기 위해 우분투 데스크탑에 빌드환경을 구축하고 예제를 실행해본다. Qt MQTT는 커머셜 라이센스 및 GPL 로 사용할 수 있으며 커머셜 라이센스를 보유하고 있다면 MaintenanceTool 을 통해 간단하게 설치할 수 있다.

여기서는 오픈소스 라이센스하에서 사용할 것이므로 직접 소스코드를 빌드하여 빌드환경을 구축한다. 기본적으로 Qt가 설치되어 있어야하며 여기서는 이 과정 (Qt 설치)을 생략한다.
 

Qt MQTT 구축

다음은 git저장소를 클론하고 빌드하는 과정을 보여준다.
$ git clone https://code.qt.io/qt/qtmqtt.git
$ cd qtmqtt
$ git checkout 5.12.9
$ ~/Qt/5.12.5/gcc_64/bin/qmake
$ make
$ make install
 
이제 프로젝트 파일(.pro)에 다음 줄을 추가하면 mqtt 모듈을 사용할 수 있다.
QT    += mqtt
 
클래스를 사용하기 위해 관련 (클라이언트)헤더를 포함한다.
#include <QtMqtt/QMqttClient>
#include <QtMqtt/QMqttMessage>
#include <QtMqtt/QMqttSubscription>
 
클라이언트 객체 생성과 호스트 연결
QMqttClient *client = new QMqttClient();
client->setHostname("Host Name");
client->setPort(1883);
 
클라이언트 객체는 다음과 같은 유용한 시그널을 제공한다.
QMqttClient::stateChanged
QMqttClient::disconnected
QMqttClient::messageReceived
QMqttClient::pingResponseReceived
 
호스트에 연결
if(client->state() == QMqttClient::Disconnected)
    client->connectToHost();
 
토픽 구독
int qos = 0;
QMqttSubscription *subscription = client->subscribe(QMqttTopicFilter("topic"), qos);

 

 

구독이 성공하면 다음 시그널에 연결하여 메세지를 수신할 수 있다.

QMqttSubscription::messageReceived
QMqttSubscription::stateChanged
QMqttSubscription::qosChanged
 
구독을 취소하려면 다음과 같이 할 수 있다.
subscription->unsubscribe();
 
토픽의 메세지를 게시하면 해당 토픽을 구독하는 클라이언트에게 메세지를 전달한다.
client->publish(QMqttTopicName("topic"), "message");

 

pub/sub 예제

이제 간단한 pus/sub예제를 실행 해본다.
브로커는 라즈베리파이4에 mosquitto 를 설치하여 구축한다. 다음의 명령줄로 간단하게 설치할 수 있다.
pi@raspberrypi:~ $ sudo apt install mosquitto
 
다음은 우분투 데스크탑에서 실행되는 간단한 클라이언트 예제를 보여준다.
#include <QCoreApplication>
#include <QtMqtt/QMqttClient>
#include <QtMqtt/QMqttMessage>
#include <QtMqtt/QMqttSubscription>

#include <QDebug>

void subscribe(QMqttClient *client){
    QString topic("sensors/house/temperature");

    int qos = 0;
    QMqttSubscription *subscription = client->subscribe(QMqttTopicFilter(topic), qos);

    QObject::connect(subscription, &QMqttSubscription::messageReceived, [subscription](const QMqttMessage &msg){
        qDebug() << "topic: " << msg.topic().name() << ", temperature: " << msg.payload().toInt() << "°C";
        subscription->unsubscribe();


        qApp->exit();
    });

    // publish message
    client->publish(topic, "15");
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QMqttClient client;
    client.setHostname("10.10.10.102"); // Raspberry pi4 IP Address.
    client.setPort(1883);

    QObject::connect(&client, &QMqttClient::stateChanged, [&client](){
        if(client.state() == QMqttClient::Connected){
            qDebug() << "Client Connected.";
            subscribe(&client);
        }
    });

    if(client.state() == QMqttClient::Disconnected){
        // connect to broker
        client.connectToHost();
    }

    return a.exec();
}
실행결과:
qtmqtt.png
번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 85860
23 가상키보드(Qt Virtual Keyboard)를 사용하는 방법 [32] file makersweb 2019.05.03 221040
22 Windows에서 라즈베리파이3용 Qt5.10.0 크로스컴파일 [20] file makersweb 2018.02.23 12934
21 안드로이드 Qt 프로그래밍 file makersweb 2018.11.30 8816
20 라즈베리파이4에 대한 Qt 5.14.1 크로스컴파일 [1] file makersweb 2020.02.12 4449
19 QPA 플러그인과 EGLFS file makersweb 2017.11.21 3926
18 Qt Bluetooth를 이용한 시리얼(Serial) 통신 file makersweb 2019.02.17 3563
17 Qt5기반 독립 프로세스(out-of-process)로 동작하는 가상키보드(virtual keyboard) file makersweb 2019.02.24 2627
16 QtWayland와 ivi-compositor file makersweb 2018.12.27 2403
15 MCU용 Qt에 대해서 makersweb 2019.08.22 1912
14 라즈베리파이3에서 Boot to Qt 실행해보기 makersweb 2019.11.13 1666
» Qt MQTT의 pus/sub 튜토리얼 file makersweb 2021.02.06 1638
12 Qt for Embedded Linux 화면출력 makersweb 2019.10.17 1598
11 싱글터치 스크린 및 임베디드 리눅스 기반에서 Qt 터치입력 makersweb 2018.12.24 1397
10 안드로이드 가상장치 사용 file makersweb 2019.01.13 1072
9 Qt MQTT 에 대해서 file makersweb 2020.06.02 959
8 Qt로 작성된 안드로이드 APP에 Splash Screen을 추가 file makersweb 2020.03.10 883
7 Qt로 작성된 iOS 앱에서 시리얼 통신 file makersweb 2022.04.30 846
6 QPA 플러그인과 HTML5 Backend file makersweb 2017.12.27 806
5 Qt for MCU 1.0 릴리즈 makersweb 2019.12.10 751
4 Qt Bluetooth Low Energy 개요 makersweb 2022.02.13 661