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 中的例子,簡單寫了一個先服務器發佈消息的小Demohtml
五:代碼
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