【Qt官方MQTT库的使用,附一个MqttClient例子】
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
六:代码下载
【Qt官方MQTT库的使用,附一个MqttClient例子】的更多相关文章
- qt在动态库里面加载widget的例子
testDll和testExe项目 备注:windows下dll内不需要new QApplication, linux和mac下面需要在动态库里面new QApplication testdll.h ...
- QT中静态库的生成与使用——创建共享库代码,附例子
一. 静态库的生成 1. 测试目录: lib 2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...
- 六轴加速度传感器MPU6050官方DMP库到瑞萨RL78/G13的移植
2015年的电赛已经结束了.赛前接到器件清单的时候,看到带防护圈的多旋翼飞行器赫然在列,又给了一个瑞萨RL78/G13的MCU,于是自然联想到13年的电赛,觉得多半是拿RL78/G13做四旋翼的主控, ...
- Qt 官方一键动态发布技能
苦找了好几天动态库,程序可以运行了,结果没有图标还是少了运行库很苦恼,发现Qt 官方有一键动态发布功能感觉自己萌萌的,来自qt吧亲测可用. 集成开发环境 QtCreator 目前生成图形界面程序 ex ...
- Qt官方开发环境生成的exe发布方式--使用windeployqt(windeployqt是单独的程序,放在低版本qt4目录下也可以运行的)
Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...
- Qt官方开发环境生成的exe发布方式
本来想自己写一个打包程序的文章了,但是我发现了宝贝,在这里,大神写的比我牛逼的多了,这里做一下搬运工 一是为了方便大家 二是为了以后方便自己找 原文链接:http://tieba.baidu.com/ ...
- MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制
最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2 ...
- Qt官方开发环境生成的exe发布方式--使用windeployqt
Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
随机推荐
- Python数据分析基础教程
Python数据分析基础教程(第2版)(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1_FsReTBCaL_PzKhM0o6l0g 提取码:nkhw 复制这段内容后 ...
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习5
#include <iostream>using namespace std;const MAXSIZE=12;const year=3;int main(){ char *month[M ...
- Python 遇到的坑
1. 循环导入 AB 互相引用,或者 中间掺入了更复杂的一些--用局部导入解决
- python3 load Iris.data数据集出现报错key words: b'Iris-setosa'
通过搜索原因,发现有可能是在对文件读取是编译出现了问题,并且Keyword中提示b'Iris-setosa',而我们的string转float函数中没有字母b,很奇怪.所以尝试将转换函数所有的stri ...
- UIAlertController中TextField的用法
这时候可以添加如下代码: [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { // 可以 ...
- 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'goodsController' defined in file [D:\eclipse\eclipse-space\pinyougou_parent\pinyou
由于错误太宽,没法截取完整的,所以不怎么连贯,但是不影响错误的解决. 这个错误是因为service无法自动注入.显示嵌套状态异常. 我就查看了一下我的坐标和配置文件,配置文件的路径和访问地址都是正确的 ...
- yii 1.x 添加 rules 验证url数组
public function rules() { return CMap::mergeArray( parent::rules(),array( array('third_link', 'urlAr ...
- 数据可视化——阿里云解决方案DataV
数据可视化——阿里云解决方案DataV https://help.aliyun.com/document_detail/53844.html?spm=a2c4g.11186623.6.579.37fd ...
- 关于HTTP协议学习(一)
一,目录结构 B/S 结构定义 URI (统一资源标志符) HTTP 协议 HTTP 请求报文 HTTP 响应报文 HTTP Methods HTTP Status Code 二,B/S,C/S 结构 ...
- CITS1401 Computational Thinking with Python
Department of Computer Science and Software EngineeringCITS1401 ComputationalThinking with PythonPro ...