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

五:代码

  1. //main.cpp
  2. #include "QMqttClientTool.h"
  3. #include <QApplication>
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication a(argc, argv);
  8. QMqttClientTool w;
  9. w.show();
  10.  
  11. return a.exec();
  12. }
  1. //QMqttClientTool.h
  2. #ifndef QMQTTCLIENTTOOL_H
  3. #define QMQTTCLIENTTOOL_H
  4.  
  5. #include <QWidget>
  6. #include "QtMqtt/QMqttClient"
  7. #include "QPushButton"
  8. #include "QLineEdit"
  9. #include "QLabel"
  10.  
  11. class QMqttClientTool : public QWidget
  12. {
  13. Q_OBJECT
  14.  
  15. public:
  16. QMqttClientTool(QWidget *parent = );
  17. ~QMqttClientTool();
  18.  
  19. QPushButton * btnConnect;//连接MQTT服务器
  20. QPushButton * btnPublish;//发布消息
  21. QLabel * qlbHostNameTag;
  22. QLabel * qlbHostPortTag;
  23. QLabel * qlbPubLishTopicTag;
  24. QLabel * qlbPublishMessageTag;
  25. QLineEdit * qleHostName;
  26. QLineEdit * qleHostPort;
  27. QLineEdit * qlePublishTopic;
  28. QLineEdit * qlePublishMessage;
  29.  
  30. private:
  31. QMqttClient * m_client;//mqtt client指针
  32.  
  33. private slots:
  34. void on_btnConnect_clicked(void);//连接MQTT服务器槽函数
  35. void on_btnPublish_clicked(void);//发布消息槽函数
  36.  
  37. };
  38.  
  39. #endif // QMQTTCLIENTTOOL_H
  1. //QMqttClientTool.cpp
  2. #include "QMqttClientTool.h"
  3. #include "QDebug"
  4. #include <QtWidgets/QMessageBox>
  5. QMqttClientTool::QMqttClientTool(QWidget *parent)
  6. : QWidget(parent)
  7. {
  8.  
  9. this->setMaximumSize(,);
  10. this->setMinimumSize(,);
  11.  
  12. m_client = new QMqttClient(this);
  13. btnConnect = new QPushButton(this);
  14. btnPublish = new QPushButton(this);
  15. qlbHostNameTag = new QLabel(this);
  16. qlbHostPortTag = new QLabel(this);
  17. qlbPubLishTopicTag = new QLabel(this);
  18. qlbPublishMessageTag = new QLabel(this);
  19. qleHostName = new QLineEdit(this);
  20. qleHostPort = new QLineEdit(this);
  21. qlePublishTopic = new QLineEdit(this);
  22. qlePublishMessage = new QLineEdit(this);
  23. QFont ft;
  24. ft.setPointSize();
  25. ft.setBold();
  26.  
  27. qlbHostNameTag->move(,);
  28. qlbHostNameTag->setText("Host");
  29. qlbHostNameTag->setFont(ft);
  30. qlbHostNameTag->setMaximumSize(,);
  31. qlbHostNameTag->setMinimumSize(,);
  32.  
  33. qleHostName->move(,);
  34. qleHostName->setFont(ft);
  35. qleHostName->setMaximumSize(,);
  36. qleHostName->setMinimumSize(,);
  37.  
  38. qlbHostPortTag->move(,);
  39. qlbHostPortTag->setText("Port");
  40. qlbHostPortTag->setFont(ft);
  41. qlbHostPortTag->setMaximumSize(,);
  42. qlbHostPortTag->setMinimumSize(,);
  43.  
  44. qleHostPort->move(,);
  45. qleHostPort->setFont(ft);
  46. qleHostPort->setMaximumSize(,);
  47. qleHostPort->setMinimumSize(,);
  48.  
  49. btnConnect->move(,);
  50. btnConnect->setText("Connect");
  51. btnConnect->setFont(ft);
  52. btnConnect->setMaximumSize(,);
  53. btnConnect->setMinimumSize(,);
  54.  
  55. qlbPubLishTopicTag->move(,);
  56. qlbPubLishTopicTag->setText("PublishTopic");
  57. qlbPubLishTopicTag->setFont(ft);
  58. qlbPubLishTopicTag->setMaximumSize(,);
  59. qlbPubLishTopicTag->setMinimumSize(,);
  60.  
  61. qlePublishTopic->move(,);
  62. qlePublishTopic->setFont(ft);
  63. qlePublishTopic->setMaximumSize(,);
  64. qlePublishTopic->setMinimumSize(,);
  65.  
  66. btnPublish->move(,);
  67. btnPublish->setText("Publish");
  68. btnPublish->setFont(ft);
  69. btnPublish->setMaximumSize(,);
  70. btnPublish->setMinimumSize(,);
  71.  
  72. qlbPublishMessageTag->move(,);
  73. qlbPublishMessageTag->setText("PublishMessage");
  74. qlbPublishMessageTag->setFont(ft);
  75. qlbPublishMessageTag->setMaximumSize(,);
  76. qlbPublishMessageTag->setMinimumSize(,);
  77.  
  78. qlePublishMessage->move(,);
  79. qlePublishMessage->setFont(ft);
  80. qlePublishMessage->setMaximumSize(,);
  81. qlePublishMessage->setMinimumSize(,);
  82.  
  83. connect(btnConnect,SIGNAL(clicked()),this,SLOT(on_btnConnect_clicked()));
  84. connect(btnPublish,SIGNAL(clicked()),this,SLOT(on_btnPublish_clicked()));
  85. }
  86.  
  87. QMqttClientTool::~QMqttClientTool()
  88. {
  89.  
  90. }
  91.  
  92. void QMqttClientTool::on_btnConnect_clicked()
  93. {
  94. //未连接服务器则连接
  95. if (m_client->state() == QMqttClient::Disconnected) {
  96. btnConnect->setText(tr("Disconnect"));
  97. m_client->setHostname(qleHostName->text());
  98. m_client->setPort(qleHostPort->text().toInt());
  99. qleHostName->setEnabled(false);
  100. qleHostPort->setEnabled(false);
  101. m_client->connectToHost();
  102. } else {//断开连接
  103. btnConnect->setText(tr("Connect"));
  104. qleHostName->setEnabled(true);
  105. qleHostPort->setEnabled(true);
  106. m_client->disconnectFromHost();
  107. }
  108. }
  109.  
  110. void QMqttClientTool::on_btnPublish_clicked()
  111. {
  112.  
  113. if (m_client->publish(qlePublishTopic->text(),qlePublishMessage->text().toUtf8()) == -)
  114. QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not publish message"));
  115. }
  1. //QMqttClientTool.pro
  2. #-------------------------------------------------
  3. #
  4. # Project created by QtCreator --10T16::
  5. #
  6. #-------------------------------------------------
  7.  
  8. QT += core gui network
  9.  
  10. greaterThan(QT_MAJOR_VERSION, ): QT += widgets
  11.  
  12. TARGET = QMqttClientTool
  13. TEMPLATE = app
  14.  
  15. # The following define makes your compiler emit warnings if you use
  16. # any feature of Qt which has been marked as deprecated (the exact warnings
  17. # depend on your compiler). Please consult the documentation of the
  18. # deprecated API in order to know how to port your code away from it.
  19. DEFINES += QT_DEPRECATED_WARNINGS
  20.  
  21. # You can also make your code fail to compile if you use deprecated APIs.
  22. # In order to do so, uncomment the following line.
  23. # You can also select to disable deprecated APIs only up to a certain version of Qt.
  24. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.
  25.  
  26. SOURCES += \
  27. main.cpp \
  28. QMqttClientTool.cpp
  29.  
  30. HEADERS += \
  31. QMqttClientTool.h
  32. INCLUDEPATH += ./include
  33.  
  34. win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqtt
  35. else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqttd
  36.  
  37. INCLUDEPATH += $$PWD/include
  38. DEPENDPATH += $$PWD/include
  39.  
  40. win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/lib/libQt5Mqtt.a
  41. else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/lib/libQt5Mqttd.a
  42. else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/lib/Qt5Mqtt.lib
  43. 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. Python数据分析基础教程

    Python数据分析基础教程(第2版)(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1_FsReTBCaL_PzKhM0o6l0g 提取码:nkhw 复制这段内容后 ...

  2. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习5

    #include <iostream>using namespace std;const MAXSIZE=12;const year=3;int main(){ char *month[M ...

  3. Python 遇到的坑

    1. 循环导入 AB 互相引用,或者 中间掺入了更复杂的一些--用局部导入解决

  4. python3 load Iris.data数据集出现报错key words: b'Iris-setosa'

    通过搜索原因,发现有可能是在对文件读取是编译出现了问题,并且Keyword中提示b'Iris-setosa',而我们的string转float函数中没有字母b,很奇怪.所以尝试将转换函数所有的stri ...

  5. UIAlertController中TextField的用法

    这时候可以添加如下代码: [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { // 可以 ...

  6. 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'goodsController' defined in file [D:\eclipse\eclipse-space\pinyougou_parent\pinyou

    由于错误太宽,没法截取完整的,所以不怎么连贯,但是不影响错误的解决. 这个错误是因为service无法自动注入.显示嵌套状态异常. 我就查看了一下我的坐标和配置文件,配置文件的路径和访问地址都是正确的 ...

  7. yii 1.x 添加 rules 验证url数组

    public function rules() { return CMap::mergeArray( parent::rules(),array( array('third_link', 'urlAr ...

  8. 数据可视化——阿里云解决方案DataV

    数据可视化——阿里云解决方案DataV https://help.aliyun.com/document_detail/53844.html?spm=a2c4g.11186623.6.579.37fd ...

  9. 关于HTTP协议学习(一)

    一,目录结构 B/S 结构定义 URI (统一资源标志符) HTTP 协议 HTTP 请求报文 HTTP 响应报文 HTTP Methods HTTP Status Code 二,B/S,C/S 结构 ...

  10. CITS1401 Computational Thinking with Python

    Department of Computer Science and Software EngineeringCITS1401 ComputationalThinking with PythonPro ...