MQTT 订阅

创建一个与 MQTT 代理通信的应用程序。

MQTT 订阅 展示了如何创建一个与应用程序通信的 MQTT 代理,每个订阅都会打开一个新对话框,其中可以查看订阅主题上的消息。

创建客户端

我们使用 QMqttClient 类来创建 MQTT 客户端,并设置用于连接的代理主机名和端口

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

订阅主题

当用户在客户端中订阅主题时,会创建一个新的订阅对象

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();
}

我们使用 QMqttSubscription 类来存储订阅的主题、状态和 QoS 级别

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);
}

QoS 级别可以为消息和订阅单独设置。订阅的设置 QoS 级别确定最 QoS 级别。如果发送的消息具有更高的 QoS 级别,代理会将该消息的 QoS 提高到更高级别。例如,如果客户端 A 以 QoS 1 订阅了 主题,而客户端 B 在该主题上发布消息,QoS 为 0,则代理将自动将消息的 QoS 提高到 1。如果客户端 B 以 QoS 2 在该主题上发布消息,则代理将以 QoS 2 发送该消息。

接收消息

当客户端收到消息时,使用 QMqttMessage 类来存储实际的消息有效负载

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

文件

© 2024 The Qt Company Ltd. 本文件内包含的文档贡献者是各自的版权所有者。提供的文档是根据由自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt 及相关标志是 The Qt Company Ltd. 在芬兰和/或其他国家的商标。所有其他商标都是其各自所有者的财产。