系统:Windows10
环境:QT5.12.9
下载源代码编译
GitHub上下载的源代码未发现有.pro文件所以无法一直无从下手怎么去编译,然后偶然的机会在CSDN上打开GitHub加速下载链接惊喜的发现有.pro文件,这里给出链接:点击直达
GitHub原链接:
当我们下载好后解压打开工程文件,取消影子构建,然后点击构建
当编译完成过后会有几个新的文件夹生成到我们的代码目录中
添加库文件到QT安装目录
然后我们需要用到的文件有:
然后我们进入qt的安装目录,进入到你需要使用的编译器的文件夹,我这里的windows平台用的是mingw所以就进入这个文件夹
然后再include目录下新建一个QtMqtt文件夹然后讲src/mqtt文件夹下的所有.h文件复制过来
然后是将编译的lib文件中的.dll文件存放到编译器目录的bin文件中,将.pri和.a文件存放到lib文件中
测试工程
ui页面
.pro工程文件
QT += qmqtt
添加头文件
#include <QtMqtt/qmqtt.h>
完整的.c文件
#include "testmqtt.h"
#include "ui_testmqtt.h"
testMqtt::testMqtt(QWidget *parent) :
QWidget(parent),
ui(new Ui::testMqtt)
{
client = new QMQTT::Client(); // 初始化QMQTT客户指针
ui->setupUi(this);
connect(client, SIGNAL(received(QMQTT::Message)),this, SLOT(MQTT_Received(QMQTT::Message)));
}
testMqtt::~testMqtt()
{
delete ui;
}
void testMqtt::on_btn_connect_clicked()
{
QHostAddress host(ui->edit_ip->text());
quint16 port = ui->edit_port->text().toUInt();
QString id = "qt-client";
QString username = "useradmin"; // 用户名
QByteArray password = "password"; // 登录密码
client->setKeepAlive(60); // 心跳
client->setHost(host); // 设置 EMQ 代理服务器
client->setPort(port); // 设置 EMQ 代理服务器端口
client->setClientId(id); // 设备 ID
client->setUsername(username);
client->setPassword(password);
client->cleanSession();
client->setVersion(QMQTT::MQTTVersion::V3_1_1); // 设置mqtt版本
qDebug()<<port<<endl;
qDebug()<<host<<endl;
client->connectToHost(); // 连接 EMQ 代理服务器
QTimer::singleShot(1000, this, [=](){
ui->edit_message->insertPlainText("链接成功\n");
});
}
void testMqtt::on_btn_subscribe_clicked()
{
client->subscribe(ui->edit_topic->text(),quint8(ui->cmb_qos->currentText().toInt())); // 订阅主题 对应取消订阅unsubscribe
ui->edit_message->insertPlainText("订阅了["+ui->edit_topic->text()+"]主题\n");
}
void testMqtt::on_btn_publish_clicked()
{
QMQTT::Message msg;
msg.setQos(quint8(ui->cmb_qos->currentText().toInt()));
msg.setTopic(ui->edit_topic->text());
msg.setPayload(ui->edit_pushtext->text().toUtf8());
client->publish(msg);
ui->edit_message->insertPlainText("发送:" + ui->edit_pushtext->text().toUtf8()+"\n");
}
void testMqtt::MQTT_Received(QMQTT::Message message)
{
QString str = message.payload();
ui->edit_message->insertPlainText("收到消息主题[ " + message.topic() +"]:"+str.toLocal8Bit() + "\n");
}
完整的.h文件
#ifndef TESTMQTT_H
#define TESTMQTT_H
#include <QWidget>
#include <QtMqtt/qmqtt.h>
#include <QDebug>
#include <QTimer>
namespace Ui {
class testMqtt;
}
class testMqtt : public QWidget
{
Q_OBJECT
public:
explicit testMqtt(QWidget *parent = nullptr);
~testMqtt();
private slots:
void on_btn_connect_clicked();
void on_btn_subscribe_clicked();
void on_btn_publish_clicked();
void MQTT_Received(QMQTT::Message message);
private:
Ui::testMqtt *ui;
QMQTT::Client *client;
};
#endif // TESTMQTT_H
最终效果
快下班了代码写的比较着急,但效果大概就是这样,可以作为参考,后续可能还会做一期Linux和arm上的编写敬请期待。
2021-10-15 补充:将配置文件添加到安装目录
将编译好的配置文件,如下图
添加到QT编译器目录的modules中
配置完成过后使用qmqtt编译的时候可能还会出现找不到文件的情况
这里是因为#include<>和#include"“的区别,前者是从标准库中去寻找文件,后者则是从工程中寻找文件,遇到这个错误只需要将qmqtt的头文件换成#include”"引用即可,这里不止一处会出现该问题需要注意,这里还需要注意的是编译的MQTT库文件不要删除因为配置文件中有相关目录是指向编译文件的目录的。
完整文件下载
我用阿里云盘分享了「qt mqtt」,你可以不限速下载🚀
复制这段内容打开「阿里云盘」App 即可获取
链接:https://www.aliyundrive.com/s/vrTRX16bpZq