0
点赞
收藏
分享

微信扫一扫

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统


Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统

  • ​​0.环境​​
  • ​​1.MQTT 源码下载(也可以去官网下载)​​
  • ​​2.MQTT源码解压成功复制 src/mqtt 文件夹到工程中​​
  • ​​3.我的工程目录如下​​
  • ​​4.在工程中添加mqtt源码文件​​
  • ​​5. 在MqttDemo.pro 文件增加 network 模块​​
  • ​​6. 编写如下测试代码​​
  • ​​7. OK进行工程编译​​
  • ​​1)出现第一个问题头文件找不到​​
  • ​​2)出现第二个问题 未定义的引用​​
  • ​​3) 到此成功完成构建​​
  • ​​8. 以OneNet平台为例进行Windows端验证​​
  • ​​8. 以OneNet平台为例进行ubuntu 16.04 端验证​​

Windows下 MQTT源码移植(几乎所有的Qt版本都适用) ​​链接​​ Linux Qt下MQTT模块的导入(源码移植) 链接
Linux Qt下MQTT模块的导入(编译成库版本)几乎适用所有版本 链接

0.环境

qt版本: qt 5.12.9
系统:Windows 10、ubuntu 16.04

1.MQTT 源码下载(也可以去官网下载)

​​地址​​​GitHub地址​​

2.MQTT源码解压成功复制 src/mqtt 文件夹到工程中

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_#include


Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_MQTT_02

3.我的工程目录如下

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_ubuntu_03

4.在工程中添加mqtt源码文件

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_ubuntu_04


Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_MQTT_05

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_windows_06

5. 在MqttDemo.pro 文件增加 network 模块

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_windows_07

6. 编写如下测试代码

mqttdemowidget.h

#ifndef MQTTDEMOWIDGET_H
#define MQTTDEMOWIDGET_H

#include <QWidget>

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

QT_BEGIN_NAMESPACE
namespace Ui { class MqttDemoWidget; }
QT_END_NAMESPACE

class MqttDemoWidget : public QWidget {
Q_OBJECT

public:
MqttDemoWidget(QWidget *parent = nullptr);
~MqttDemoWidget();

void clientMqtt();

private:
Ui::MqttDemoWidget *ui;
QMQTT::Client *client; // 创建QMQTT 客户端

private slots:
void onMQTT_Received(QMQTT::Message);
void onMQTT_subscribed( QString, quint8);
void onMQTT_unSubscribed( QString );
};
#endif // MQTTDEMOWIDGET_H

mqttdemowidget.cpp

#include "mqttdemowidget.h"
#include "ui_mqttdemowidget.h"

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

clientMqtt();
}

MqttDemoWidget::~MqttDemoWidget() {
delete ui;
}

void MqttDemoWidget::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 MqttDemoWidget::onMQTT_Received(QMQTT::Message message) {
QString str = message.payload();
qDebug() <<"\nTopic: " << message.topic() << "payload:" <<str;
}

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

void MqttDemoWidget::onMQTT_unSubscribed(QString topic) {
qDebug() << "\nonMQTT_unSubscribed:" << topic;
}

main.cpp

#include "mqttdemowidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MqttDemoWidget w;
w.show();
return a.exec();
}

7. OK进行工程编译

1)出现第一个问题头文件找不到

在 .pro 文件增加头文件路径:INCLUDEPATH += mqtt/

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_windows_08


Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_windows_09

2)出现第二个问题 未定义的引用

I. 找到头文件 qmqtt_global.h
II. 将 #define Q_MQTT_EXPORT Q_DECL_IMPORT 改为 #define Q_MQTT_EXPORT
III. 提示:这里为什么要改成这样是由于在Windows在使用vs编译dll和exe工程有__declspec(dllexport) 和 __declspec(dllimport) 声明区别(不过多介绍有兴趣可以自己去查资料了解)这里使用MinGW直接把宏定义成空就可以了。

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_Qt_10


Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_ubuntu_11


Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_ubuntu_12

3) 到此成功完成构建

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_Qt_13

8. 以OneNet平台为例进行Windows端验证

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_windows_14


Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_MQTT_15


Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_MQTT_16

8. 以OneNet平台为例进行ubuntu 16.04 端验证

Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统_Qt_17



举报

相关推荐

0 条评论