Qt Mqtt客户端 + Emqx

环境

Qt 5.14.2
qtmqtt
mqttx

功能

QT Mqtt客户端

qtmqtt

  1. 下载 qtmqtt (注意下载与QT版本相符的库)并使用QT 编译
    编译完成后需要的文件:
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

emqx

1.虚拟机中安装emqx,并启动

curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash
sudo apt-get install emqx
sudo systemctl start emqx

2.访问emqx
用户:admin,密码public
http://IPAddress:18083/
在这里插入图片描述

源码

1.引入库文件及H文件

win32: LIBS += -L$$PWD/./ -lQt5Mqtt

INCLUDEPATH += $$PWD/.
DEPENDPATH += $$PWD/.

INCLUDEPATH += $$PWD/Qt5Mqtt/

2.mainwindow.h

#include "Qt5Mqtt/qmqttclient.h"
class MainWindow : public QMainWindow
{
    Q_OBJECT

public slots:
    void setClientPort(int p);
private slots:
    void on_buttonConnect_clicked();
    void updateLogStateChange();
    void brokerDisconnected();
    void on_buttonPublish_clicked();
    void on_buttonSubscribe_clicked();
private:
    Ui::MainWindow *ui;
    QMqttClient *m_client;
};

3.mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_client = new QMqttClient(this);
    m_client->setUsername("user");
    m_client->setPassword("P@ssw0rd");

    m_client->setHostname(ui->lineEditHost->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->spinBoxPort, QOverload<int>::of(&QSpinBox::valueChanged), this, &MainWindow::setClientPort);
    updateLogStateChange();
}

void MainWindow::on_buttonConnect_clicked()
{
    if (m_client->state() == QMqttClient::Disconnected)
    {
        m_client->connectToHost();
    } else {
        m_client->disconnectFromHost();
    }
}


void MainWindow::updateLogStateChange()
{
    switch(m_client->state())
    {
       case QMqttClient::ClientState::Connected:{

        ui->lineEditTopic->setEnabled(true);
        ui->lineEditMessage->setEnabled(true);

        ui->buttonSubscribe->setEnabled(true);
        ui->buttonPublish->setEnabled(true);

        ui->lineEditHost->setEnabled(false);
        ui->spinBoxPort->setEnabled(false);
        ui->buttonConnect->setText(tr("Disconnect"));

       }break;
       default:{

        ui->lineEditTopic->setEnabled(false);
        ui->lineEditMessage->setEnabled(false);

        ui->buttonSubscribe->setEnabled(false);
        ui->buttonPublish->setEnabled(false);

        ui->lineEditHost->setEnabled(true);
        ui->spinBoxPort->setEnabled(true);
        ui->buttonConnect->setText(tr("Connect"));

      }break;
    }



    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->text(), ui->lineEditMessage->text().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;
    }
}

运行

在这里插入图片描述

相关推荐

  1. ZooKeeper客户实战

    2024-07-14 05:46:02       40 阅读
  2. Kafka客户实战

    2024-07-14 05:46:02       48 阅读
  3. 游戏客户开发

    2024-07-14 05:46:02       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 05:46:02       53 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 05:46:02       56 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 05:46:02       46 阅读
  4. Python语言-面向对象

    2024-07-14 05:46:02       57 阅读

热门阅读

  1. 【Linux】常用命令大全

    2024-07-14 05:46:02       22 阅读
  2. IOS热门面试题(一)

    2024-07-14 05:46:02       27 阅读
  3. SD card知识学习

    2024-07-14 05:46:02       17 阅读
  4. 洞察构建脉络:Kylin Cube构建过程的监控之道

    2024-07-14 05:46:02       23 阅读
  5. 使用个人p12证书请求https接口数据

    2024-07-14 05:46:02       21 阅读
  6. 华为SRG2200 端口映射 & 双向NAT & 回流

    2024-07-14 05:46:02       25 阅读
  7. 宕机/脱机

    2024-07-14 05:46:02       23 阅读
  8. 【LC刷题】DAY24:122 55 45 1005

    2024-07-14 05:46:02       26 阅读
  9. Qt/QML学习-BusyIndicator

    2024-07-14 05:46:02       20 阅读
  10. 算法热门面试题二

    2024-07-14 05:46:02       23 阅读