-
环境:windows 11
-
编译是mingw,编译msvc步骤一样,将生成的库放到msvc路径下即可。
1.下载qtmqtt-5.15.2的源码
-
Qt版MQTT git源码:【下载地址】GitHub - qt/qtmqtt: Qt Module to implement MQTT protocol version 3.1 and 3.1.1 http://mqtt.org/
-
下载对应的版本即可。
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> ^~~~~~~~~~~~~~~~~~~~~~
-
解决办法
-
将源码路径下的src下的mqtt里面的头问价全部复制,到qt的安装目录下的mingw的include下创建文件夹QtMqtt。
E:\software\QT\5.15.2\mingw81_64\include(这个是我qt对应的安装路径以及创建文件夹的地方)
-
完成后点击编译无错误
3.将bin目录dll动态库放到mingw的bin目录下面
-
找到源码工程的生成的文件夹,这个我的目录。
4.将lib的全部文件放到mingw的lib目录下面
5.将生成的mkspecs下的两个文件放到qt安装的目录下的mkspces里面的modules里面
6.构建里面历程中的简单客户端
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.软件界面
3.测试通信MQTTx
下载地址:MQTTX:全功能 MQTT 客户端工具