Qt5.14+官方MQTT库连接阿里云界面设计

Qt5.14+官方MQTT库连接阿里云

注意:不同的Qt版本的MQTT库并不完全一样,头文件也略有区别,需要下载对应版本的MQTT库导入到Qt中。

配置MQTT具体看这篇文章

具体的代码如下,主要实现了订阅和发布的基础功能。

使用MQTT要在。Pro文件中加入“QT +=mqtt”

main.cpp

#include "mqtt.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mqtt.cpp

#include "mqtt.h"
#include "ui_mqtt.h"

#include <QtCore/QDateTime>
#include <QtMqtt/qmqttclient.h>
#include <QtWidgets/QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_client = new QMqttClient(this);
    m_client->setHostname(ui->lineEditHost->text());
    m_client->setUsername(ui->lineEditHost_2->text());
    m_client->setPassword(ui->lineEditHost_3->text());
    m_client->setClientId(ui->lineEditHost_4->text());
    m_client->setPort(ui->spinBoxPort->value());

    connect(m_client, &QMqttClient::stateChanged, this, &MainWindow::updateLogStateChange);
    connect(m_client, &QMqttClient::disconnected, this, &MainWindow::brokerDisconnected);

    connect(m_client, &QMqttClient::messageReceived, this, [this](const QByteArray &message, const QMqttTopicName &topic) {
        const QString content = QDateTime::currentDateTime().toString()
                    + QLatin1String(" Received Topic: ")
                    + topic.name()
                    + QLatin1String(" Message: ")
                    + message
                    + QLatin1Char('\n');
        ui->editLog->insertPlainText(content);
    });

    connect(m_client, &QMqttClient::pingResponseReceived, this, [this]() {
        const QString content = QDateTime::currentDateTime().toString()
                    + QLatin1String(" PingResponse")
                    + QLatin1Char('\n');
        ui->editLog->insertPlainText(content);
    });

    connect(ui->lineEditHost, &QLineEdit::textChanged, m_client, &QMqttClient::setHostname);
    connect(ui->lineEditHost_2, &QLineEdit::textChanged, m_client, &QMqttClient::setUsername);
    connect(ui->lineEditHost_3, &QLineEdit::textChanged, m_client, &QMqttClient::setPassword);
    connect(ui->lineEditHost_4, &QLineEdit::textChanged, m_client, &QMqttClient::setClientId);
    connect(ui->spinBoxPort, QOverload<int>::of(&QSpinBox::valueChanged), this, &MainWindow::setClientPort);
    updateLogStateChange();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_buttonConnect_clicked()
{
    if (m_client->state() == QMqttClient::Disconnected) {
        ui->lineEditHost->setEnabled(false);
        ui->lineEditHost_2->setEnabled(false);
        ui->lineEditHost_3->setEnabled(false);
        ui->lineEditHost_4->setEnabled(false);
        ui->spinBoxPort->setEnabled(false);
        ui->buttonConnect->setText(tr("Disconnect"));
        m_client->connectToHost();
    } else {
        ui->lineEditHost->setEnabled(true);
        ui->lineEditHost_2->setEnabled(true);
        ui->lineEditHost_3->setEnabled(true);
        ui->lineEditHost_4->setEnabled(true);
        ui->spinBoxPort->setEnabled(true);
        ui->buttonConnect->setText(tr("Connect"));
        m_client->disconnectFromHost();
    }
}

void MainWindow::on_buttonQuit_clicked()
{
    QApplication::quit();
}

void MainWindow::updateLogStateChange()
{
    const QString content = QDateTime::currentDateTime().toString()
                    + QLatin1String(": State Change")
                    + QString::number(m_client->state())
                    + QLatin1Char('\n');
    ui->editLog->insertPlainText(content);
}

void MainWindow::brokerDisconnected()
{
    ui->lineEditHost->setEnabled(true);
    ui->spinBoxPort->setEnabled(true);
    ui->buttonConnect->setText(tr("Connect"));
}

void MainWindow::setClientPort(int p)
{
    m_client->setPort(p);
}

void MainWindow::on_buttonPublish_clicked()
{
    if (m_client->publish(ui->lineEditTopic_2->text(), ui->lineEditMessage->toPlainText().toUtf8()) == -1)
        QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not publish message"));
}

void MainWindow::on_buttonSubscribe_clicked()
{
    auto subscription = m_client->subscribe(ui->lineEditTopic->text());
    if (!subscription) {
        QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not subscribe. Is there a valid connection?"));
        return;
    }
}

void MainWindow::on_buttonSubscribe_2_clicked()
{
    ui->editLog->clear();
}

main.h

#ifndef MQTT_H
#define MQTT_H

#include <QMainWindow>
#include <QtMqtt/qmqttclient.h>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    void setClientPort(int p);

private slots:
    void on_buttonConnect_clicked();
    void on_buttonQuit_clicked();
    void updateLogStateChange();

    void brokerDisconnected();

    void on_buttonPublish_clicked();

    void on_buttonSubscribe_clicked();

    void on_buttonSubscribe_2_clicked();

private:
    Ui::MainWindow *ui;
    QMqttClient *m_client;
};

#endif // MAINWINDOW_H

界面如下
界面设计代码参考Qt官方文档
工程链接如下:
链接:https://pan.baidu.com/s/1tAgykj7I6hdpYwa72Y0f6w?pwd=ltwv
提取码:ltwv

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt5 Mqtt模块是用于实现MQTT(Message Queuing Telemetry Transport)协议的Qt模块,它提供了连接MQTT代理服务器的功能,可以发布和订阅主题消息。在Qt5.12.1版本中,该模块已经包含在Qt的核心中。 使用Qt5 Mqtt模块,您可以使用以下步骤进行MQTT通信: 1. 创建一个MQTT客户端对象,并连接MQTT代理服务器。 2. 发布消息到指定的主题。 3. 订阅感兴趣的主题,并接收对应的消息。 以下是一个简单的例子来演示如何使用Qt5 Mqtt模块: ```cpp #include <QtMqtt/QMqttClient> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QMqttClient client; client.setHostname("mqtt.example.com"); // 设置MQTT代理服务器地址 client.setPort(1883); // 设置MQTT代理服务器端口 client.connectToHost(); // 连接MQTT代理服务器 // 连接成功后,订阅主题 QObject::connect(&client, &QMqttClient::connected, [&client]() { qDebug() << "Connected to MQTT broker"; client.subscribe("mytopic", 0); // 订阅主题 "mytopic" }); // 收到消息时打印出来 QObject::connect(&client, &QMqttClient::messageReceived, [](const QByteArray &message, const QMqttTopicName &topic) { qDebug() << "Received message:" << message << "on topic:" << topic.name(); }); return app.exec(); } ``` 这只是一个简单的例子,您可以根据自己的需求进行进一步的扩展和定制。希望对您有所帮助!如果你还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值