关于MQTT协议与QT的结合【保姆级的操作手册二】

        在我的前一篇文章中,已经全面的讲了通过官方提供的MQTT版本结合QT相同的版本来进行编译移植,这篇文章将会着重介绍另一种方式来编译MQTT库 ,Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统,这种方式基本适合与所有的 QT版本。

0. 环境:

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

1.MQTT 源码下载

https://github.com/emqx/qmqtt

这个不是官网的地址,官网的版本需要切合QT的相同版本,我试过没成功,欢迎大神补充。希望能私聊告诉最好 哈哈哈。

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

删除qmqtt.pri-----qmqtt.pro-----qmqtt.qbs 这三个文件

 3.我的工程目录如下

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

其实也可以用pri的方式来添加

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

 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)出现第一个问题头文件找不到

 

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直接把宏定义成空就可以了。

 

 3) 到此成功完成构建

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

 

 

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

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gallagher_SF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值