一 编译QtMqtt库
Qt5.10才官方支持MQTT,但我用的Qt版本是5.8.0 Mingw_32BIT, 为了在Qt5.8.0上添加MQTT支持,需要自己编译源码

步骤:

(1) git clone https://github.com/qt/qtmqtt.git

(2) 使用Qt5.8.0自带的qtcreator打开qtmqtt的pro文件,然后切换到release模式编译

(3) 编译结束后会在工程生成的文件下生成如下一些文件

二 连接有人云
(1)首先按照有人云官方的教程添加一个透传设备,我添加的是“默认设备”(也可以是NBIOT等支持透传的设备),设备的ID为:00021153000000000001

(2)然后将这个设备使用有人虚拟串口软件映射为本地的虚拟串口,如下图所示

(3)创建Qt工程,主要代码如下:

#-------------------------------------------------
#
# Project created by QtCreator 2018-12-27T18:02:41
#
#-------------------------------------------------

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = MQTTest
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

LIBS += -LE:/EWorkSpace/20190109_mqtt/build-qtmqtt-Qt580_MINGW_32BIT-Release/bin -lQt5Mqtt

INCLUDEPATH += E:/EWorkSpace/20190109_mqtt/build-qtmqtt-Qt580_MINGW_32BIT-Release/include

SOURCES += main.cpp \
mainwidget.cpp \
mqttclient.cpp

HEADERS += \
mainwidget.h \
mqttclient.h

FORMS += \
mainwidget.ui
#ifndef MQTTCLIENT_H
#define MQTTCLIENT_H

#include <QObject>
#include <QtMqtt/QMqttClient>
#include <QtMqtt/QMqttSubscription>

typedef QMqttSubscription::SubscriptionState SubscriptionState;

class MQTTClient : public QObject
{
Q_OBJECT
public:
explicit MQTTClient(const QString &userName, const QString &passwordMD5, const QString &deviceId, QObject *parent = nullptr);
~MQTTClient();

bool isOpened();
void open();
void close();
void write(const QByteArray &data);

private:
QString m_userName;
QString m_passwordMD5;
QString m_deviceId;
QMqttClient *m_client;
QByteArray m_buffer;

private slots:
void doConnected();
void doDisconnected();
void doMessageReceived(const QByteArray &message, const QMqttTopicName &topic);
void doQMqttSubscriptionStateChanged(SubscriptionState subscriptionState);

signals:
void log(const QString &text);

public slots:
};

#endif // MQTTCLIENT_H
#include "mqttclient.h"
#include <QDebug>

#define MQTT_HOSTNAME "clouddata.usr.cn"
#define MQTT_PORT 1883

#define MQTT_CLIENT_SUBSCRIBE_PREFIX "$USR/DevTx"
#define MQTT_CLIENT_PUBLISH_PREFIX "$USR/DevRx"

MQTTClient::MQTTClient(const QString &userName, const QString &passwordMD5, const QString &deviceId, QObject *parent) : QObject(parent)
{
m_client=NULL;
this->m_userName=userName;
this->m_passwordMD5=passwordMD5;
this->m_deviceId=deviceId;
}

MQTTClient::~MQTTClient()
{
if(m_client!=NULL)
{
if(m_client->state()==QMqttClient::Connected)
{
m_client->disconnectFromHost();
}
delete m_client;
m_client=NULL;
}
}

bool MQTTClient::isOpened()
{
if(m_client==NULL)
{
return false;
}
else if(m_client->state()==QMqttClient::Connected)
{
return true;
}
else
{
return false;
}
}

void MQTTClient::open()
{
if(m_client!=NULL)
{
return;
}
m_client = new QMqttClient(this);
m_client->setHostname(MQTT_HOSTNAME);
m_client->setPort(MQTT_PORT);
m_client->setUsername(m_userName);
m_client->setClientId(QString("APP:%1").arg(m_userName));
m_client->setPassword(m_passwordMD5);
m_client->setProtocolVersion(QMqttClient::MQTT_3_1_1);

connect(m_client, SIGNAL(connected()), this, SLOT(doConnected()));
connect(m_client, SIGNAL(disconnected()), this, SLOT(doDisconnected()));
connect(m_client, SIGNAL(messageReceived(QByteArray,QMqttTopicName)), this, SLOT(doMessageReceived(QByteArray,QMqttTopicName)));

m_client->connectToHost();
emit log("MQTTClient 正在连接...");
}

void MQTTClient::close()
{
if(m_client!=NULL)
{
if(m_client->state()==QMqttClient::Connected)
{
m_client->disconnectFromHost();
}
delete m_client;
m_client=NULL;
}
}

void MQTTClient::write(const QByteArray &data)
{
if(m_client!=NULL)
{
m_client->publish(QString("%1/%2").arg(MQTT_CLIENT_PUBLISH_PREFIX).arg(this->m_deviceId), data);
emit log(QString("MQTTClient 正发布设备消息,设备ID: %1, 消息:%2").arg(this->m_deviceId).arg(QString::fromLatin1(data)));
}
}

void MQTTClient::doConnected()
{
emit log("MQTTClient 已建立连接!");
emit log(QString("MQTTClient 正订阅设备消息,设备ID: %1").arg(this->m_deviceId));
QMqttSubscription *subscription=m_client->subscribe(QString("%1/%2").arg(MQTT_CLIENT_SUBSCRIBE_PREFIX).arg(this->m_deviceId));
connect(subscription, SIGNAL(stateChanged(SubscriptionState)),
this, SLOT(doQMqttSubscriptionStateChanged(SubscriptionState)));
}

void MQTTClient::doDisconnected()
{
emit log("MQTTClient 已断开连接!");
this->close();
}

void MQTTClient::doMessageReceived(const QByteArray &message, const QMqttTopicName &topic)
{
emit log(QString("MQTTClient 接收到数据: %1").arg(QString::fromLatin1(message)));
}

void MQTTClient::doQMqttSubscriptionStateChanged(SubscriptionState subscriptionState)
{
if(subscriptionState==QMqttSubscription::Subscribed)
{
emit log("订阅设备消息成功!");
}
}
#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include "mqttclient.h"

namespace Ui {
class MainWidget;
}

class MainWidget : public QWidget
{
Q_OBJECT

public:
explicit MainWidget(QWidget *parent = 0);
~MainWidget();

private slots:
void on_buttonConnect_clicked();

void on_buttonWrite_clicked();

void on_buttonClear_clicked();

void doLog(const QString &text);

private:
Ui::MainWidget *ui;

MQTTClient *m_mqttClient;
};

#endif // MAINWIDGET_H
#include "mainwidget.h"
#include "ui_mainwidget.h"

MainWidget::MainWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWidget)
{
ui->setupUi(this);
m_mqttClient=NULL;
}

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

void MainWidget::on_buttonConnect_clicked()
{
if(m_mqttClient!=NULL)
{
m_mqttClient->close();
m_mqttClient=NULL;
}
m_mqttClient=new MQTTClient(ui->lineUsername->text(), ui->linePasswordMD5->text(), ui->lineDeviceId->text());
connect(m_mqttClient, SIGNAL(log(QString)), this, SLOT(doLog(QString)));
m_mqttClient->open();
}

void MainWidget::on_buttonWrite_clicked()
{
if((m_mqttClient==NULL) || (!m_mqttClient->isOpened()))
{
ui->textLog->append("MQTT客户端未打开!");
return;
}
m_mqttClient->write(ui->lineWrite->text().toLatin1());
}

void MainWidget::on_buttonClear_clicked()
{
ui->textLog->clear();
}

void MainWidget::doLog(const QString &text)
{
ui->textLog->append(text);
}
然后运行测试:

(------- 完 -------)
---------------------
作者:Keycer
来源:CSDN
原文:https://blog.csdn.net/zgrjkflmkyc/article/details/86159661
版权声明:本文为博主原创文章,转载请附上博文链接!

Qt5.8.0编译QtMqtt库并使用该库连接有人云的例子的更多相关文章

  1. qt5.4.0编译错误

    error1: 进程"C:\Qt\Qt5.4.0\Tools\QtCreator\bin\jom.exe"退出,退出代码 2 solution:去工具->选项->构建和 ...

  2. VS2013编译Qt5.6.0静态库

    获取qt5.6.0源码包 直接去www.qt.io下载就好了,这里就不详细说了. 这里是我已经编译好的** 链接:http://pan.baidu.com/s/1pLb6wVT 密码: ak7y ** ...

  3. VS2015编译Qt5.7.0生成支持XP的静态库(很不错)

    一.编译工具 1.VS2015 编译Qt5.7.0的所需VS版本:Visual Studio 2013 (Update1)或Visual Studio 2015 (Update2).因为Update补 ...

  4. linux下编译qt5.6.0静态库——configure配置

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  5. VS2013编译Qt5.6.0静态库(乌合之众)

    获取qt5.6.0源码包 直接去www.qt.io下载就好了,这里就不详细说了. 这里是我已经编译好的** 链接:http://pan.baidu.com/s/1pLb6wVT 密码: ak7y ** ...

  6. VS2010编译Qt5.4.0静态库

    http://www.kavenblog.com/?p=375 1.Qt的跨平台十分优秀,但是在Windows上是还是会有许多问题,其中之一就是动态链接库的问题,Qt程序的发布必须带一个体积不小的DL ...

  7. linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  8. linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  9. VS2013编译Qt5.6.0静态库,并提供了百度云下载(乌合之众)good

    获取qt5.6.0源码包 直接去www.qt.io下载就好了,这里就不详细说了. 这里是我已经编译好的** 链接:http://pan.baidu.com/s/1pLb6wVT 密码: ak7y ** ...

随机推荐

  1. maven在pom文件中引入了icepdf-core包,pom文件却莫名的报错,说jai_core包missing

    maven在pom文件中引入了icepdf-core包,却莫名的报错,说jai_core包missing,把这个jai_core包引入之后还是一样报错,PS:icepdf-core使用的时候不用引用j ...

  2. IntelliJ IDEA 2017.3 搭建一个多模块的springboot项目(一)

    新人接触springboot,IDE使用的是IntelliJ IDEA 2017.3 ,自己摸索了很久,现在自己整理一下,里面有些操作我自己也不懂是为什么这样,只是模仿公司现有的项目,自己搭建了一个简 ...

  3. Java web 实验三部分资料上传

    花好月圆系列 貂蝉 黄月英 孙尚香 甄姬 标准包 魏 曹操 司马懿 郭嘉 甄姬 张辽 许褚 夏侯惇 蜀 刘备 关羽 张飞 诸葛亮 黄月英 赵云 马超 吴 孙权 孙尚香 周瑜 大乔 甘宁 吕蒙 群 吕布 ...

  4. How to delete System Profiles for those registered with Red Hat Subscription Management (RHSM)?

    Environment Red Hat Customer Portal Certificate Based Subscription Red Hat Subscription Management ( ...

  5. css3_1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. python查找鞍点

    问题:对于给定5X5的整数矩阵,设计算法查找出所有的鞍点的信息(包括鞍点的值和行.列坐标,坐标从1开始). 提示:鞍点的特点:列上最小,行上最大. 思路:求出每一行的最大值,将行号.列号.值存入列表中 ...

  7. redis数据类型及订阅操作

    Redis数据类型详解 Redis键/值介绍 Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如“foo”的简单字符串到一个JPG文件的内容都可以.空字符串也是有效k ...

  8. LC 377. Combination Sum IV

    Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...

  9. vue cli创建typescript项目

    使用最新的Vue CLI @vue/cli创建typescript项目,使用vue -V查看当前的vue cli版本 安装命令 npm install -g @vue-cli 创建项目 vue cre ...

  10. DFS,DP————N皇后问题

    C++代码 #include <iostream> using namespace std; const int N=20; int n; char g[N][N]; bool col[N ...