【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





五:代碼
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 }
//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 = 0);
~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(600,200);
this->setMinimumSize(600,200);
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(15);
ft.setBold(1);
qlbHostNameTag->move(6,6);
qlbHostNameTag->setText("Host");
qlbHostNameTag->setFont(ft);
qlbHostNameTag->setMaximumSize(65,35);
qlbHostNameTag->setMinimumSize(65,35);
qleHostName->move(60,6);
qleHostName->setFont(ft);
qleHostName->setMaximumSize(200,35);
qleHostName->setMinimumSize(200,35);
qlbHostPortTag->move(270,6);
qlbHostPortTag->setText("Port");
qlbHostPortTag->setFont(ft);
qlbHostPortTag->setMaximumSize(65,35);
qlbHostPortTag->setMinimumSize(65,35);
qleHostPort->move(324,6);
qleHostPort->setFont(ft);
qleHostPort->setMaximumSize(60,35);
qleHostPort->setMinimumSize(60,35);
btnConnect->move(390,6);
btnConnect->setText("Connect");
btnConnect->setFont(ft);
btnConnect->setMaximumSize(120,35);
btnConnect->setMinimumSize(120,35);
qlbPubLishTopicTag->move(6,50);
qlbPubLishTopicTag->setText("PublishTopic");
qlbPubLishTopicTag->setFont(ft);
qlbPubLishTopicTag->setMaximumSize(130,35);
qlbPubLishTopicTag->setMinimumSize(130,35);
qlePublishTopic->move(145,50);
qlePublishTopic->setFont(ft);
qlePublishTopic->setMaximumSize(240,35);
qlePublishTopic->setMinimumSize(240,35);
btnPublish->move(390,50);
btnPublish->setText("Publish");
btnPublish->setFont(ft);
btnPublish->setMaximumSize(120,35);
btnPublish->setMinimumSize(120,35);
qlbPublishMessageTag->move(6,94);
qlbPublishMessageTag->setText("PublishMessage");
qlbPublishMessageTag->setFont(ft);
qlbPublishMessageTag->setMaximumSize(160,35);
qlbPublishMessageTag->setMinimumSize(160,35);
qlePublishMessage->move(170,94);
qlePublishMessage->setFont(ft);
qlePublishMessage->setMaximumSize(400,35);
qlePublishMessage->setMinimumSize(400,35);
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()) == -1)
QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not publish message"));
}
//QMqttClientTool.pro
#-------------------------------------------------
#
# Project created by QtCreator 2018-03-10T16:12:38
#
#-------------------------------------------------
QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): 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.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

