重点,重点,大重点!!!
我从网上也是找了很多的mqtt 在qt 中的移植。但是由于版本的问题,都是不兼容。导致最后也是很难运行起来。甚至是编译 不通过。在此一定要特别强调:每个版本不一样,结果也不一样,不需要千篇一律。
我使用的QT版本:QT5.14.2
mqtt版本路径:https://github.com/emqtt/qmqtt/tree/master
链接:https://pan.baidu.com/s/1ufwam8rpsqb1mbRuaRMABg
提取码:msoj
使用方法:
在这里添加下面执行的方法,上次没有添加,感觉缺了一步。
QT (我用的QT5,win10系统)安装之后在开始的目录里有:
我使用的是32-bit 的MinGW 7.3.0 。 记住在安装QT 的时候要选中MinGW 安装。然后系统中若是没有则需要安装MinGW。官网下载即可。
在qmqtt-master 目录中:
1、qmake
2、mingw32-make
3、mingw32-make install
这三步就可以将qmqtt 加入到qt 模块中使用。就可以这样了
这样就可以添加使用了。在我这个过程中,没有生成 ***d.dll 的调试文件。
敲黑板:
若是你选择了mingw 32-bit ,则在QT 中调试运行时需要选择这个版本,例如:
因为我们使用什么版本去编译库,编译后的库及头文件等就会在此版本的文件夹中。所以要选择这个版本。
假如我们选择MinGW 32-bit 这个版本。则需要将下面目录中所有头文件都拷贝到mingw文件夹中。
拷贝后的样子。注意看截图中的路径。
好了,可以用库了。
再加一个例程,要不然都不知道怎么用!!
添加库指示:
头文件定义:
#ifndef MQTT_CONFIG_H
#define MQTT_CONFIG_H
#include <QMainWindow>
#include "bmstest.h"
#include "qmqtt.h"
#include "QTimer"
namespace Ui {
class Mqtt_Config;
}
class Mqtt_Config : public QMainWindow
{
Q_OBJECT
public:
explicit Mqtt_Config(QWidget *parent = nullptr);
~Mqtt_Config();
signals:
void disinfo_mqtt(const int index,const QString &str);
public slots:
void dev_mac_slot(const int i,const QString &mac);
private slots:
void dev_mqtt_slot(const QMQTT::Message &mes);
void dev_mqtt_connected_slot();
void on_Mqtt_Start_PB_clicked();
void on_Mqtt_Stop_PB_clicked();
private:
Ui::Mqtt_Config *ui;
QMQTT::Client *dev_mqtt_client = nullptr;
QString mac_backup_str[50] ;
};
#endif // MQTT_CONFIG_H
源文件:
#include "mqtt_config.h"
#include "ui_mqtt_config.h"
Mqtt_Config::Mqtt_Config(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Mqtt_Config)
{
ui->setupUi(this);
dev_mqtt_client = new QMQTT::Client();
}
Mqtt_Config::~Mqtt_Config()
{
delete ui;
delete dev_mqtt_client;
}
void Mqtt_Config::dev_mac_slot(const int i,const QString &str)
{
mac_backup_str[i] = str;
// qDebug() << "mac_back" << str;
}
void Mqtt_Config::dev_mqtt_slot(const QMQTT::Message &mes)
{
QString mac = mes.payload().mid(2,12);
QString cmd = mes.payload().mid(28,4);
for(int i = 0; i < 50; i++) {
if((mac == mac_backup_str[i]) && (cmd == "1201")) {
// qDebug() << "i=" <<i<< "内容"<<mes.payload();
emit disinfo_mqtt(i,mes.payload());
break;
}
}
}
void Mqtt_Config::dev_mqtt_connected_slot()
{
if(dev_mqtt_client->connectionState() == QMQTT::STATE_CONNECTED) {
dev_mqtt_client->subscribe("serv/tq/b",1);
}
}
void Mqtt_Config::on_Mqtt_Start_PB_clicked()
{
QString pswd = "******"; //登录密码
dev_mqtt_client->setHost(QHostAddress("xxx.xxx.xxx.xxx")); //登录IP
dev_mqtt_client->setPort(xxx); //登录端口
dev_mqtt_client->setUsername("******"); //登录用户名
dev_mqtt_client->setPassword(pswd.toUtf8()); //登录密码处理
dev_mqtt_client->setClientId("bms_mqtt_test");
connect(dev_mqtt_client,&QMQTT::Client::received,this,&Mqtt_Config::dev_mqtt_slot);
connect(dev_mqtt_client,&QMQTT::Client::connected,this,&Mqtt_Config::dev_mqtt_connected_slot);
dev_mqtt_client->connectToHost();
this->hide();
}
void Mqtt_Config::on_Mqtt_Stop_PB_clicked()
{
dev_mqtt_client->unsubscribe("***"); //订阅的主题
dev_mqtt_client->disconnectFromHost();
this->hide();
}
注意:
1、在安装QT5 的过程中,会让我们选择安装的组件,一定要选择perl 安装。我的是perl 5.22