Windows下 MQTT源码移植(几乎所有的Qt版本都适用)

Windows下 MQTT源码移植

  可以说该移植支持所有的Qt版本吧
  WInd10 + Qt 5.6.3 + QT…

MQTT源码下载

地址

对下载的源码包进行解压

Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第1张图片

首先需要修改.qmake.conf中的版本信息,为当前你所使用的的qt的版本号,我这里修改为:MODULE_VERSION = 5.6.3

Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第2张图片

打开Qt 打开该工程qmqtt.pro

Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第3张图片
打开项目
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第4张图片
进行构建
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第5张图片

到此可以去看见out下生成了库文件

Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第6张图片
这两个文件使我们需要用到的最最最最最最重要的两个文件夹了
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第7张图片

新建一个项目进行测试

首先新建一个mqtt_test_01项目
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第8张图片
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第9张图片
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第10张图片
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第11张图片
后面默认即可
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第12张图片
接下来先进行文件夹的复制
  复制构建后生成的目录下的include 和 lib 两个文件夹到你的工程路径下
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第13张图片
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第14张图片
删除除 libQt5Qmqtt.a libQt5Qmqttd.a Qt5Qmqtt.dll Qt5Qmqttd.dll的全部其他文件
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第15张图片
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第16张图片
复制qmqtt-master/src/mqtt 下的所有的.h 到项目路径下的include/QtQmqtt/下
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第17张图片
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第18张图片

添加库,选择外部库,知道刚刚生成的库

Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第19张图片
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第20张图片
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第21张图片
同理加载另外一个库

在.pro 中加入network 模块

QT += network
mqtt_test_o1.pro内容如下:

#-------------------------------------------------
#
# Project created by QtCreator 2020-06-30T10:58:13
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
QT += network

TARGET = mqtt_test_01
TEMPLATE = app


SOURCES += main.cpp\
        mqtttest.cpp

HEADERS  += mqtttest.h

FORMS    += mqtttest.ui

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Qmqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Qmqttd
else:unix: LIBS += -L$$PWD/lib/ -lQt5Qmqtt

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Qmqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Qmqttd
else:unix: LIBS += -L$$PWD/lib/ -lQt5Qmqtt

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

在mqtttest.h中添加三个头文件

#include <QtNetwork>
#include <QHostAddress>
#include <QtQmqtt/qmqtt.h>

#include 可能会出错,先构建一次项目子啊添加就没错了
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第22张图片
Debug 编译运行发现会报错,说头文件找不到,不要慌,只是前面copy头文件的时候路径没对或着你可以直接在工程中手动加头文件,然后去修改报错的地方的头文件的<>改为 " ",当然我不会再这么做了,这样太难改了,我直接copy头文件到它可以找到的路径下,把:项目名称路径\include\QtQmqtt下的出qmqtt.h外的头文件移动到 :项目名称路径\include\ 下即可
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第23张图片

再次编译运行工程
OKKK,移植完全成功ok
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第24张图片

Ok, 来个小demo测试测试

/*main.cpp*/
#include "mqtttest.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MqttTest w;
    w.show();

    return a.exec();
}

/*mqtttest.h*/
#ifndef MQTTTEST_H
#define MQTTTEST_H

#include <QWidget>

#include <QtNetwork>
#include <QHostAddress>
#include <QtQmqtt/qmqtt.h>

namespace Ui {
class MqttTest;
}

class MqttTest : public QWidget
{
    Q_OBJECT

public:
    explicit MqttTest(QWidget *parent = 0);
    ~MqttTest();
    void clientMqtt();

private:
    Ui::MqttTest *ui;
    QMQTT::Client *client; // 创建QMQTT 客户端
private slots:
   void onMQTT_Received(QMQTT::Message);
   void onMQTT_subscribed( QString, quint8);
   void onMQTT_unSubscribed( QString );
};

#endif // MQTTTEST_H

/*mqtttest.cpp*/
#include "mqtttest.h"
#include "ui_mqtttest.h"

MqttTest::MqttTest(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MqttTest)
{
    ui->setupUi(this);
    clientMqtt();
}

MqttTest::~MqttTest()
{
    client->unsubscribed("abcd");

    delete ui;
}

void MqttTest::clientMqtt(){
    client = new QMQTT::Client(); // 初始化QMQTT客户指针

    connect(client, SIGNAL(received(QMQTT::Message)),this, SLOT(onMQTT_Received(QMQTT::Message)));
    connect(client, SIGNAL(subscribed(QString,quint8)), this, SLOT(onMQTT_subscribed(QString,quint8)) );
    connect(client, SIGNAL(unsubscribed(QString)), this, SLOT( onMQTT_unSubscribed(QString)));


////  oneNet server ///

    QHostAddress host("183.230.40.39"); // 代理服务器 IP
    QByteArray password = "test"; // 设备名称
    quint16 port = 6002; // 代理服务器端口
    QString deviceId = "604***658"; // 设备 ID
    QString productId = "35***5";   // 产品 ID

    client->setKeepAlive(120); // 心跳
    client->setHost(host); // 设置 EMQ 代理服务器
    client->setPort(port); // 设置 EMQ 代理服务器端口
    client->setClientId(deviceId); // 设备 ID
    client->setUsername(productId); // 产品 ID
    client->setPassword(password);
    client->cleanSession();
    client->setVersion(QMQTT::MQTTVersion::V3_1_1); // 设置mqtt版本


    client->connectToHost(); // 连接 EMQ 代理服务器

    QTimer::singleShot(1000, this, [=](){
        client->subscribe("abcd",0);
    });
}

void MqttTest::onMQTT_Received( QMQTT::Message message)
{
    QString str = message.payload();
    qDebug() <<"\nTopic: " << message.topic() << "payload:" <<str;

}

void MqttTest::onMQTT_unSubscribed(QString topic){
    qDebug() << "\nonMQTT_unSubscribed:" << topic;
}
void MqttTest::onMQTT_subscribed(QString topic, quint8 qos)
{
    qDebug() << "\n订阅topic = " << topic << "Qos = " << qos << " 成功!";
}

运行程序
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第25张图片
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第26张图片
用客户端测试来发布一个abcd

Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第27张图片Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第28张图片

发布abcd
Windows下 MQTT源码移植(几乎所有的Qt版本都适用)_第29张图片

OK,到此移植已完成,demo也成功

附上demo源码工程下载

你可能感兴趣的:(QT,windows,qt,QTMQTT,MQTT,dll)