Qt官方MQTT库的使用,附一个MqttClient例子

修改説明:

修改時間:2019年5月31日

修改内容:mqtt庫編譯的説明

-----------------------------------------------------------

开发环境:win7 64 + Qt5.9

记录时间:2018年3月11日 00:48:42

联系邮箱: yexiaopeng1992@126.com(有问题发我邮件)

一:前言

  最近在调试Mqtt通讯基础上的加密,但因为Mqtt服务器是大家公用的,不能修改,所以就决定写一个Mqtt的客户端,与自己的开发板之间通信,使用客户端模拟服务器的加密。因为自己在图形编程中,自己对Qt比较熟悉,因此选择了Qt进行编程。但后来发现Qt没有集成Mqtt的组件,而使用网上大部分网友说说的emqtt作为Mqtt库的话,虽然编译没有问题,但发现使用qmqtt虽然可以连接公司的Mqtt服务器,但不能通讯。后来上Y_o_u_T_u_b_e搜索了一下,看见有Qt官方介绍Mqtt的视频,研究并写了一个小Demo测试,发现可以使用,在文末会提供下载测试。在此,便简单介绍一下,更多功能欢迎大家一起研究。

二:资料

介绍地址:https://codereview.qt-project.org/#/admin/projects/qt/qtmqtt
源码下载:git clone https://codereview.qt-project.org/qt/qtmqtt
Qt MQTT Examples:https://doc.qt.io/QtMQTT/qtmqtt-examples.html
Qt MQTT Client Example:https://doc.qt.io/QtMQTT/qtmqtt-simpleclient-example.html

三:编译生成QtMqtt的库

修改説明

當前Qt已經將MQTT的代碼上傳至github,在使用這個版本進行庫生成時,有些許差異。特此説明

github地址:https://github.com/qt/qtmqtt

下載后,打開最外層的 qtmqtt.pro項目進行構建即可。  構建中會報文件找不到的錯誤。如  <QtMqtt/qmqttglobal.h>等文件,

按照這種寫法,文件應該在Qt按照路徑下,但文件是存在 項目的 src\mqtt 路徑下。因此,在Qt安裝路徑的頭文件目錄下,新建QtMqtt目錄,將對應文件放入,重新編譯即可得到庫。


3.1  git clone https://codereview.qt-project.org/qt/qtmqtt 下载源码到本地

3.2 打开qtmqtt文件夹下的qtmqtt.pro工程

3.3 重新构建qtmqtt.pro

3.4 构建成功后,将输出文件夹中的include和lib文件夹复制到其他地方

3.4 将lib文件夹下除了libQt5Mqtt.a、libQt5Mqttd.a、Qt5Mqtt.dll、Qt5Mqttd.dll四个文件之外的文件删除

3.5 将include\QtMqtt 文件下除了qtmqttversion.h以外的.h文件,全部用qtmqtt\src\mqtt中同名的.h文件取代(include内的头文件只是指向了

qtmqtt\src\mqtt中的头文件)

四:新建自己的工程来使用QtMqtt的库

4.1 新建一个Qt工程,基于Qidget,不使用系统生成UI

4.2将第三步获得的lib和include文件夹复制到新工程的文件夹下。

4.3 修改.pro文件:

增加network模块
QT += core gui network

增加头文件搜索路径
INCLUDEPATH += ./include

增加库

4.4 根据 https://doc.qt.io/QtMQTT/qtmqtt-simpleclient-example.html 中的例子,简单写了一个先服务器发布消息的小Demo

五:代码

 //main.cpp
#include "QMqttClientTool.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMqttClientTool w;
w.show(); return a.exec();
}
//QMqttClientTool.h
#ifndef QMQTTCLIENTTOOL_H
#define QMQTTCLIENTTOOL_H #include <QWidget>
#include "QtMqtt/QMqttClient"
#include "QPushButton"
#include "QLineEdit"
#include "QLabel" class QMqttClientTool : public QWidget
{
Q_OBJECT public:
QMqttClientTool(QWidget *parent = );
~QMqttClientTool(); QPushButton * btnConnect;//连接MQTT服务器
QPushButton * btnPublish;//发布消息
QLabel * qlbHostNameTag;
QLabel * qlbHostPortTag;
QLabel * qlbPubLishTopicTag;
QLabel * qlbPublishMessageTag;
QLineEdit * qleHostName;
QLineEdit * qleHostPort;
QLineEdit * qlePublishTopic;
QLineEdit * qlePublishMessage; private:
QMqttClient * m_client;//mqtt client指针 private slots:
void on_btnConnect_clicked(void);//连接MQTT服务器槽函数
void on_btnPublish_clicked(void);//发布消息槽函数 }; #endif // QMQTTCLIENTTOOL_H
//QMqttClientTool.cpp
#include "QMqttClientTool.h"
#include "QDebug"
#include <QtWidgets/QMessageBox>
QMqttClientTool::QMqttClientTool(QWidget *parent)
: QWidget(parent)
{ this->setMaximumSize(,);
this->setMinimumSize(,); m_client = new QMqttClient(this);
btnConnect = new QPushButton(this);
btnPublish = new QPushButton(this);
qlbHostNameTag = new QLabel(this);
qlbHostPortTag = new QLabel(this);
qlbPubLishTopicTag = new QLabel(this);
qlbPublishMessageTag = new QLabel(this);
qleHostName = new QLineEdit(this);
qleHostPort = new QLineEdit(this);
qlePublishTopic = new QLineEdit(this);
qlePublishMessage = new QLineEdit(this);
QFont ft;
ft.setPointSize();
ft.setBold(); qlbHostNameTag->move(,);
qlbHostNameTag->setText("Host");
qlbHostNameTag->setFont(ft);
qlbHostNameTag->setMaximumSize(,);
qlbHostNameTag->setMinimumSize(,); qleHostName->move(,);
qleHostName->setFont(ft);
qleHostName->setMaximumSize(,);
qleHostName->setMinimumSize(,); qlbHostPortTag->move(,);
qlbHostPortTag->setText("Port");
qlbHostPortTag->setFont(ft);
qlbHostPortTag->setMaximumSize(,);
qlbHostPortTag->setMinimumSize(,); qleHostPort->move(,);
qleHostPort->setFont(ft);
qleHostPort->setMaximumSize(,);
qleHostPort->setMinimumSize(,); btnConnect->move(,);
btnConnect->setText("Connect");
btnConnect->setFont(ft);
btnConnect->setMaximumSize(,);
btnConnect->setMinimumSize(,); qlbPubLishTopicTag->move(,);
qlbPubLishTopicTag->setText("PublishTopic");
qlbPubLishTopicTag->setFont(ft);
qlbPubLishTopicTag->setMaximumSize(,);
qlbPubLishTopicTag->setMinimumSize(,); qlePublishTopic->move(,);
qlePublishTopic->setFont(ft);
qlePublishTopic->setMaximumSize(,);
qlePublishTopic->setMinimumSize(,); btnPublish->move(,);
btnPublish->setText("Publish");
btnPublish->setFont(ft);
btnPublish->setMaximumSize(,);
btnPublish->setMinimumSize(,); qlbPublishMessageTag->move(,);
qlbPublishMessageTag->setText("PublishMessage");
qlbPublishMessageTag->setFont(ft);
qlbPublishMessageTag->setMaximumSize(,);
qlbPublishMessageTag->setMinimumSize(,); qlePublishMessage->move(,);
qlePublishMessage->setFont(ft);
qlePublishMessage->setMaximumSize(,);
qlePublishMessage->setMinimumSize(,); connect(btnConnect,SIGNAL(clicked()),this,SLOT(on_btnConnect_clicked()));
connect(btnPublish,SIGNAL(clicked()),this,SLOT(on_btnPublish_clicked()));
} QMqttClientTool::~QMqttClientTool()
{ } void QMqttClientTool::on_btnConnect_clicked()
{
//未连接服务器则连接
if (m_client->state() == QMqttClient::Disconnected) {
btnConnect->setText(tr("Disconnect"));
m_client->setHostname(qleHostName->text());
m_client->setPort(qleHostPort->text().toInt());
qleHostName->setEnabled(false);
qleHostPort->setEnabled(false);
m_client->connectToHost();
} else {//断开连接
btnConnect->setText(tr("Connect"));
qleHostName->setEnabled(true);
qleHostPort->setEnabled(true);
m_client->disconnectFromHost();
}
} void QMqttClientTool::on_btnPublish_clicked()
{ if (m_client->publish(qlePublishTopic->text(),qlePublishMessage->text().toUtf8()) == -)
QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not publish message"));
}
//QMqttClientTool.pro
#-------------------------------------------------
#
# Project created by QtCreator --10T16::
#
#------------------------------------------------- QT += core gui network greaterThan(QT_MAJOR_VERSION, ): QT += widgets TARGET = QMqttClientTool
TEMPLATE = app # The following define makes your compiler emit warnings if you use
# any feature of Qt which has 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. SOURCES += \
main.cpp \
QMqttClientTool.cpp HEADERS += \
QMqttClientTool.h
INCLUDEPATH += ./include win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqttd INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/lib/libQt5Mqtt.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/lib/libQt5Mqttd.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/lib/Qt5Mqtt.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/lib/Qt5Mqttd.lib

六:代码下载

点我下载QMqttClientTool

【Qt官方MQTT库的使用,附一个MqttClient例子】的更多相关文章

  1. qt在动态库里面加载widget的例子

    testDll和testExe项目 备注:windows下dll内不需要new QApplication, linux和mac下面需要在动态库里面new QApplication testdll.h ...

  2. QT中静态库的生成与使用——创建共享库代码,附例子

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

  3. 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植

    2015年的电赛已经结束了.赛前接到器件清单的时候,看到带防护圈的多旋翼飞行器赫然在列,又给了一个瑞萨RL78/G13的MCU,于是自然联想到13年的电赛,觉得多半是拿RL78/G13做四旋翼的主控, ...

  4. Qt 官方一键动态发布技能

    苦找了好几天动态库,程序可以运行了,结果没有图标还是少了运行库很苦恼,发现Qt 官方有一键动态发布功能感觉自己萌萌的,来自qt吧亲测可用. 集成开发环境 QtCreator 目前生成图形界面程序 ex ...

  5. Qt官方开发环境生成的exe发布方式--使用windeployqt(windeployqt是单独的程序,放在低版本qt4目录下也可以运行的)

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...

  6. Qt官方开发环境生成的exe发布方式

    本来想自己写一个打包程序的文章了,但是我发现了宝贝,在这里,大神写的比我牛逼的多了,这里做一下搬运工 一是为了方便大家 二是为了以后方便自己找 原文链接:http://tieba.baidu.com/ ...

  7. MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制

    最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2 ...

  8. Qt官方开发环境生成的exe发布方式--使用windeployqt

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...

  9. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

随机推荐

  1. centos升级python2.7到3.6之后造成yum命令报错

    今天学习浏览器模拟,把云端centos上的python2.7升级到3.6,但是安装其他软件时发现报如下错误: File "/usr/bin/yum", line 30 except ...

  2. yum clear all无反应

    卸载重装yum 操作系统版本:centos7 [root@linux-node3 ~]# uname -r 3.10.0-514.el7.x86_64 一.将现有的yum源卸载 [root@linux ...

  3. open

    open服务指的是封装的订单流接口,给外部第三方提供使用.(当然也可以区别的名字,我司这么叫而已,并且是用Java写的,谁晓得为什么不选择PHP来写)通过open api合作方就可以通过调用接口直接下 ...

  4. C语言编译器CL.exe

    下载地址CL.7z版权问题:仅供学习交流,请于24小时内删除,本人不承担版权问题… 基本使用: 1.解压缩,例如解压缩到E盘根目录下 2.打开cmd命令行界面(快捷方式win+R输入cmd回车)cd命 ...

  5. nodejs+koa在header里面添加header信息

    参考:https://koa.bootcss.com/ ctx.append('resultCode', '0000'); ctx.append('resultMessage', 'success') ...

  6. easy-ui 中的事件触发 (tree)

    easy-ui可以为插件添加事件,但没有触发事件的处理(可能是未找到),所以有时候,我们需要通过程序去触发某个插件指定的事件时,就一筹莫展了 以Tree插件为例 ,添加了onClick事件 jQuer ...

  7. 05-Python入门学习-字符串与列表的内置方法

    字符串 一:基本使用 1 用途: 记录描述性的状态,比如人的名字.地址.性别 2 定义方式: 在"",'',"""""" ...

  8. 02_ if_else if 练习

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. django 创建model(数据库表)失败

    在models.py中创建数据库表   from django.db import models # Create your models here. class Book(models.Model) ...

  10. Hibernate-day03

    双向的many2one/one2many 双向many2one/one2many的问题:一定有额外的SQL发出;在数据库里面,外键表示many2one或者one2many的关系,外键是没有方向的;但是 ...