Sur cette page

Abonnements MQTT

Création d'une application qui communique avec un courtier MQTT.

Fenêtre principale comportant des commandes de connexion et de publication, ainsi que deux fenêtres d'abonnement affichant les messages reçus sur qtmqtt/topic1

La section «Abonnements MQTT » explique comment créer une application qui communique avec un courtier MQTT. Une nouvelle boîte de dialogue s'ouvre pour chaque abonnement, dans laquelle vous pouvez consulter les messages relatifs aux sujets auxquels vous êtes abonné.

Création d'un client

Nous utilisons la classe ` QMqttClient ` pour créer un client MQTT et définir le nom d'hôte et le port du broker à utiliser pour la connexion :

    m_client = new QMqttClient(this);
    m_client->setHostname(ui->lineEditHost->text());
    m_client->setPort(static_cast<quint16>(ui->spinBoxPort->value()));

S'abonner à des sujets

Lorsque les utilisateurs s'abonnent à des sujets dans le client, un nouvel objet d'abonnement est créé :

void MainWindow::on_buttonSubscribe_clicked()
{
    auto subscription = m_client->subscribe(ui->lineEditTopic->text(),
                                            static_cast<quint8>(ui->spinQoS->text().toUInt()));
    if (!subscription) {
        QMessageBox::critical(this, u"Error"_s,
                              u"Could not subscribe. Is there a valid connection?"_s);
        return;
    }
    auto subWindow = new SubscriptionWindow(subscription);
    subWindow->setWindowTitle(subscription->topic().filter());
    subWindow->show();
}

Nous utilisons la classe ` QMqttSubscription ` pour stocker le sujet, l’état et le niveau de qualité de service (QoS) d’un abonnement :

SubscriptionWindow::SubscriptionWindow(QMqttSubscription *sub, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SubscriptionWindow),
    m_sub(sub)
{
    ui->setupUi(this);

    ui->labelSub->setText(m_sub->topic().filter());
    ui->labelQoS->setText(QString::number(m_sub->qos()));
    updateStatus(m_sub->state());
    connect(m_sub, &QMqttSubscription::messageReceived, this, &SubscriptionWindow::updateMessage);
    connect(m_sub, &QMqttSubscription::stateChanged, this, &SubscriptionWindow::updateStatus);
    connect(m_sub, &QMqttSubscription::qosChanged, [this](quint8 qos) {
        ui->labelQoS->setText(QString::number(qos));
    });
    connect(ui->pushButton, &QAbstractButton::clicked, m_sub, &QMqttSubscription::unsubscribe);
}

Le niveau de qualité de service (QoS) peut être défini séparément pour un message et pour un abonnement. Le niveau de QoS défini pour un abonnement détermine le niveau de QoS minimum. Si un message est envoyé avec un niveau de QoS supérieur, le broker augmente le niveau de QoS de ce message pour l'aligner sur ce niveau supérieur. Par exemple, si le client A est abonné à un sujet avec un niveau de qualité de service 1 et que le client B publie un message sur ce sujet avec un niveau de qualité de service 0, le courtier augmentera automatiquement le niveau de qualité de service du message à 1. Si le client B publie un message sur ce sujet avec un niveau de qualité de service de 2, le courtier l'enverra avec un niveau de qualité de service de 2.

Réception des messages

Lorsque le client reçoit un message, la classe ` QMqttMessage ` est utilisée pour stocker la charge utile du message :

void SubscriptionWindow::updateMessage(const QMqttMessage &msg)
{
    ui->listWidget->addItem(msg.payload());
}

Fichiers :

© 2026 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.