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. Android ble蓝牙问题

    (1)蓝牙回调安卓4.4的蓝牙回调是在异步线程中(不在主线程),若要在蓝牙回调中执行更新界面的操作,记得切换到主线程去操作 (2)三星手机兼容性问题connectGatt()方法在某些三星手机上只能在 ...

  2. 移动端的搜索用的是from提交

    html部分 <form action="javascript:searchSubmit();"> <input  type="search" ...

  3. vee-validate的使用

    官网地址:http://vee-validate.logaretm.com/ 这是一个插件Vue.js可以验证输入字段,显示错误,在一个简单而强大的方法.学习vee-validate,首先可以去阅读官 ...

  4. 10.1jihe

    两种操作,1是加入数字,二是找最接近的 用set或者平衡二叉树就好了 只写了二叉树的,套版子就好 #include<bits/stdc++.h> #define sf scanf #def ...

  5. php正则表达式 剔除字符串中 ,除了汉字的字符(只保留汉字) php 正则 只保留汉字,剔除所有符号

    <?php //提取字符串中的汉字其余信息剔除 $str='f龙,真 .,.,.?!::·…~&@#,.?!:;.……-&@#“”‘’〝 "〞'´'>< ...

  6. 自动化测试如何使用driver.findElements去操作页面元素

    当你要操作的元素页面有很多个的时候,如下图这样,你想使用".datagrid-row-expander.datagrid-row-expand"这个cssSelector,这个时候 ...

  7. 底层原理Hashmap源码解析实例

    Map.java package com.collection; public interface Map<K, V> { public V put(K k, V v); public V ...

  8. [05-02]红帽linux常用操作命令

    命令怎么用(三种方式) shutdown --help shutdown --? man shutdown  (man 就是manual  手册, 指南) 服务 service 怎么知道服务的名字呢? ...

  9. MongoDB - 2

    Aggregation Framework: $project: a document stream by renaming, adding, or removing fields #alter Da ...

  10. LAYUI select 下拉框得高度

    页面下得select 框 在css页面加样式 .layui-form-select dl {    max-height: 152px;}