Sur cette page

Abonnements MQTT

Créer une application qui communique avec un courtier MQTT.

Fenêtre principale avec contrôles de connexion et de publication, et deux fenêtres d'abonnement montrant les messages reçus sur qtmqtt/topic1

MQTT Subscriptions montre comment créer une application qui communique avec un courtier MQTT. Une nouvelle boîte de dialogue s'ouvre pour chaque abonnement, où vous pouvez voir les messages sur les sujets souscrits.

Création d'un client

Nous utilisons la classe QMqttClient pour créer un client MQTT et pour définir le nom d'hôte et le port du courtier à 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 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 peut être défini séparément pour un message et pour un abonnement. Le niveau de qualité de service défini pour un abonnement détermine le niveau minimum de qualité de service. Si un message est envoyé avec un niveau de qualité de service plus élevé, le courtier augmente la qualité de service de ce message au niveau supérieur. Par exemple, si le client A s'est abonné à un sujet avec une QoS 1 et que le client B publie un message sur le sujet avec une QoS 0, le courtier augmentera automatiquement la QoS du message à 1. Si le client B publie un message sur le sujet avec une QoS 2, le courtier l'enverra avec une QoS 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.