windows下移植qtmqtt-5.15.2编写MQTT软件

  • 环境:windows 11

  • 编译是mingw,编译msvc步骤一样,将生成的库放到msvc路径下即可。

1.下载qtmqtt-5.15.2的源码

 

40aef01a539c0ce97ce6a75c58511806.png

2.打开qtmqtt.pro编译

  • 错误

  • E:\emb2207\13-mqtt\qtmqtt-5.15.2\qtmqtt-5.15.2\src\mqtt\qmqttmessage.h:33: error: QtMqtt/qmqttglobal.h: No such file or directory
    In file included from E:\emb2207\13-mqtt\qtmqtt-5.15.2\qtmqtt-5.15.2\src\mqtt\qmqttmessage.cpp:30:
    E:\emb2207\13-mqtt\qtmqtt-5.15.2\qtmqtt-5.15.2\src\mqtt\qmqttmessage.h:33:10: fatal error: QtMqtt/qmqttglobal.h: No such file or directory
     #include <QtMqtt/qmqttglobal.h>
              ^~~~~~~~~~~~~~~~~~~~~~

     

f3b0ebcfe000bdacbd7f58a81fac47ea.png

  • 解决办法

  1. 将源码路径下的src下的mqtt里面的头问价全部复制,到qt的安装目录下的mingw的include下创建文件夹QtMqtt。

    E:\software\QT\5.15.2\mingw81_64\include(这个是我qt对应的安装路径以及创建文件夹的地方)

     

    ba0d8924657380514bf933e249e46f5a.png

  • 完成后点击编译无错误

9743fc722d565e7213c8b12abd00e94d.png

3.将bin目录dll动态库放到mingw的bin目录下面

  • 找到源码工程的生成的文件夹,这个我的目录。

    4c62c37471114f20f0277c33c0fa3db4.png

 

10cca0a874d024c9264fef8a02a7e823.png

4.将lib的全部文件放到mingw的lib目录下面

 

b9645df8df6211fb070a2c1a32cbb939.png

5.将生成的mkspecs下的两个文件放到qt安装的目录下的mkspces里面的modules里面

 

8cc296affaaed52c29d2b75333f3e082.png

 

4a980ef433459988cc208660f5700f8f.png

6.构建里面历程中的简单客户端

 

07874fe90b433b9d2cf3213ec3c134f1.png

 

0ff36534b8d0381f758cd51a7f9e1da4.png

 

8008cbe4b246a337e5777a2cec874e7d.png

7.编写MQTT软件

7.1pro文件中增加mqtt

QT       += core gui network mqtt
​
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
​
CONFIG += c++17
​
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
​
SOURCES += \
    main.cpp \
    mainwindow.cpp
​
HEADERS += \
    mainwindow.h
​
FORMS += \
    mainwindow.ui
​
​
​
# 设置编码为 UTF-8
QMAKE_CXXFLAGS += -D_UNICODE -DUNICODE
​
​
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
​
RESOURCES += \
    icons.qrc
​
RC_ICONS = images/logo.ico
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
​
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
​
MainWindow::~MainWindow()
{
    delete ui;
    delete clientMQTT;
    clientMQTT=nullptr;
}
​
void MainWindow::on_pushButton_mqtt_open_clicked(bool checked)
{
    //qDebug()<<"checked="<<checked;
    if(clientMQTT!=nullptr)
    {
        const QString content = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss-")
            + QString("先断开连接MQTT服务器\n");
        ui->plainTextEdit_recv->insertPlainText(content);
        return;
​
    }
    clientMQTT=new QMqttClient(this);
    clientMQTT->setHostname(ui->lineEdit_ip->text());
    clientMQTT->setPort(ui->lineEdit_port->text().toInt());
        if(!ui->lineEdit_id->text().isEmpty())
    {
        //qDebug()<<"!ui->lineEdit_id->text().isEmpty()";
        clientMQTT->setClientId(ui->lineEdit_id->text());
    }
    if(!ui->lineEdit_name->text().isEmpty())
    {
        //qDebug()<<"!ui->lineEdit_name->text().isEmpty()";
        clientMQTT->setUsername(ui->lineEdit_name->text());
    }
    if(!ui->lineEdit_password->text().isEmpty())
    {
        //qDebug()<<"!ui->lineEdit_password->text().isEmpty()";
        clientMQTT->setPassword(ui->lineEdit_password->text());
    }
    connect(clientMQTT,&QMqttClient::stateChanged,this,&MainWindow::onStateChanged);
    connect(clientMQTT,&QMqttClient::messageReceived, this, &MainWindow::onMessageReceived);
    //设置心跳包
    clientMQTT->setKeepAlive(60); // 保持心跳
    clientMQTT->connectToHost();  // 添加这一行
}
​
void MainWindow::onStateChanged(QMqttClient::ClientState state)
{
    qDebug()<<"state="<<state;
    if(state==QMqttClient::Connecting)
    {
        const QString content = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss-")
            + QString("正在连接MQTT服务器\n");
        ui->plainTextEdit_recv->insertPlainText(content);
    }
    else if(state==QMqttClient::Connected)
    {
        ui->pushButton_mqtt_open->setIcon(QIcon(QString::fromUtf8(":/images/open.png")));
        ui->pushButton_client_status->setIcon(QIcon(QString::fromUtf8(":/images/open.png")));
        const QString content = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
            + QString("连接成功到MQTT服务器\n");
        ui->plainTextEdit_recv->insertPlainText(content);
    }
    else if(state==QMqttClient::Disconnected)
    {
        const QString content = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss-")
            + QString(" 断开连接MQTT服务器\n");
        ui->plainTextEdit_recv->insertPlainText(content);
        if(clientMQTT!=nullptr)
        {
            delete clientMQTT;
            clientMQTT=nullptr;
        }
    }
}
​
void MainWindow::onMessageReceived(const QByteArray &message, const QMqttTopicName &topic)
{
    //qDebug()<<"原始数据"<<message;
    if(topic==ui->lineEdit_recv->text())
    {
        const QString content = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss-")
            + QString(message)
            + QString("\n");
        ui->plainTextEdit_recv->insertPlainText(content);
    }
}
​
​
​
void MainWindow::on_pushButton_disconnected_clicked()
{
    if(clientMQTT==nullptr)
    {
        return;
    }
    ui->pushButton_mqtt_open->setText(tr("连接服务器"));
    ui->pushButton_mqtt_open->setIcon(QIcon(QString::fromUtf8(":/images/close.png")));
    ui->pushButton_client_status->setIcon(QIcon(QString::fromUtf8(":/images/close.png")));
    clientMQTT->disconnectFromHost();//断开连接mqtt服务器
}
​
​
void MainWindow::on_pushButton_clean_clicked()
{
    ui->plainTextEdit_recv->clear();
}
​
​
​
void MainWindow::on_pushButton_recv_clicked(bool checked)
{
    //qDebug()<<"checked="<<checked;
    if(checked)
    {
        if(clientMQTT!=nullptr)
        {
            auto subscription =clientMQTT->subscribe(ui->lineEdit_recv->text());
            if (!subscription)
            {
                QMessageBox::critical(this, QString("Error"), QString("Could not subscribe. Is there a valid connection?"));
                return;
            }
            ui->pushButton_recv->setText(tr("取消订阅"));
        }
        else
        {
            QMessageBox::critical(this, QString("Error"), QString("请先连接MQTT服务器"));
            return;
        }
    }
    else {
​
        if(clientMQTT!=nullptr)
        {
            clientMQTT->unsubscribe(ui->lineEdit_recv->text());//取消订阅
            ui->pushButton_recv->setText(tr("订阅主题"));
        }
​
    }
​
}
​
​
void MainWindow::on_pushButton_send_clicked()
{
    // 获取主题和消息内容
    QString topic = ui->lineEdit_send->text();
    QString message = ui->plainTextEdit_send->toPlainText();
​
    // 将 QString 转换为 QByteArray
    QByteArray messageBytes = message.toUtf8();
​
    // 发布消息
    if (clientMQTT->publish(topic, messageBytes) == -1)
    {
        QMessageBox::critical(this, QStringLiteral("错误"), QStringLiteral("无法发布消息"));
    }
}
​
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#pragma execution_character_set("utf-8")
#include <QMainWindow>
#include <QDebug>
#include <QString>
#include <QMessageBox>
#include <QQueue>
#include <QTimer>
#include <QThread>
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostInfo>
#include <QtMqtt/qmqttclient.h>
​
​
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
    Q_OBJECT
​
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
​
private slots:
    void on_pushButton_mqtt_open_clicked(bool checked);
​
   void onStateChanged(QMqttClient::ClientState state);
   void onMessageReceived(const QByteArray &message, const QMqttTopicName &topic);
​
​
   void on_pushButton_disconnected_clicked();
​
   void on_pushButton_clean_clicked();
​
   void on_pushButton_recv_clicked(bool checked);
​
   void on_pushButton_send_clicked();
​
   private:
    Ui::MainWindow *ui;
    QMqttClient * clientMQTT=nullptr;
​
​
};
#endif // MAINWINDOW_H
​

2.软件界面

1a6d87f7db65a8b9aedd37f271681eeb.png

3.测试通信MQTTx

下载地址:MQTTX:全功能 MQTT 客户端工具

 

ab3e82ae1fb04167354e1fb653d74241.png

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值