1. 程式人生 > 實用技巧 >QT5.12.9 編譯 MQTT

QT5.12.9 編譯 MQTT

概述

Qt 開發 MQTT 程式有兩種方式,一個是 Qt 官方提供的基於 MQTT 的封裝,一個是第三方(EMQ)開發的用於 Qt 呼叫 MQTT 的介面,二者使用方法大同小異,並且均提供了原始碼。那麼,這裡先來介紹第一種,如基於 Qt 官方提供的封裝來使用 MQTT。

Qt 官方雖然在 2017 年就已經提供了對 MQTT 的封裝,但是並沒有正式加入到 Qt 的標準庫裡面,所以需要自己下載原始碼進行編譯。

Qt 官方介紹文件地址:https://doc.qt.io/QtMQTT/qtmqtt-index.html

下載

Qt 官方在 github 上提供了原始碼,地址:https://github.com/qt/qtmqtt



這是最新的,基於 MQTT 5.0 協議的版本。先把原始碼下載下來。

編譯

下載原始碼後得到如下檔案,直接開啟工程檔案準備編譯。


我這裡的編譯環境是:Qt5.12.9 + MinGW-64

注意,編譯這個原始碼需要安裝perl,否則會報錯:perl 不是內部或外部命令,也不是可執行的程式。

perl 下載地址:https://www.perl.org/get.html

官網下載速度比較慢,我上傳到網盤了,可以在這裡下載:

連結:https://pan.baidu.com/s/1p5YOo-FU-ZLJUtuZSN0Rjg 提取碼:i0dm

下載好後直接安裝即可,安裝完 Perl 後會自動寫入環境變數, 這時候再次編譯(Release模式)QtMqtt 原始碼,編譯完成後得到以下檔案:


bin 目錄下就是我們要的庫檔案:


但實際編譯過程中遇到很多問題,具體解決方法參考:編譯安裝 QtMqtt 的幾個問題及解決辦法

部署到Qt專案

編譯出來的 Qt Mqtt 庫,要使用它有兩種方式,一種是直接在專案中匯入外部庫和標頭檔案,還有一種是將其以模組的形式部署到 Qt 的安裝目錄,其中第二種的好處就是,只需要做一次操作,以後需要再用 Mqtt 庫就可以直接呼叫了,不需要每次都匯入外部庫。這裡兩種方法都介紹一下,首先來看第一種。

匯入外部庫

新建一個 Qt 工程,然後拷貝剛剛編譯的原始碼生成目錄下的 lib 資料夾中 libQt5Mqtt.a、libQt5Mqttd.a、Qt5Mqtt.dll、Qt5Mqttd.dll 這四個檔案,在新建工程目錄下建立 lib 資料夾,將拷貝的檔案貼上進去。

然後在 qtmqtt 原始碼目錄下(qtmqtt\src\mqtt)的所有 .h 標頭檔案拷貝,在新建工程目錄下建立 include 資料夾,將拷貝的檔案貼上進去:


開啟新建工程的 pro 檔案,新增:


再新增庫檔案引用:

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqttd

新增 include 檔案的引用:

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

為了統一演示,先介紹完第二種方法後再來看 demo。


部署到Qt安裝目錄

再來看第二種方法,如何將 QtMqtt 的庫直接部署到 Qt 安裝目錄中,這樣只需要部署一次,以後在任何工程中引用都不需要再額外匯入庫了,相比第一種來說更方便些。

首先,將 qtmqtt 原始碼目錄下(qtmqtt\src\mqtt)的所有 .h 標頭檔案拷貝,然後在 Qt 安裝目錄下的 include 資料夾中建立一個 QtMqtt 目錄,將拷貝的檔案貼上進去:


然後將生成的動態庫和靜態庫複製到 Qt 安裝目錄下對應存放庫的路徑下:


到目前為止,我們只是將 mqtt 的靜態和動態庫複製到了 qt 安裝目錄下,但是並沒有作為一個模組匯入到 qt 中,要想在 pro 檔案裡寫 Qt+=mqtt 而不用我們每次都寫庫路徑,還需要將 MQTT 加入 QT 模組中。



配置完畢,這種方式配置在新建工程中引用只需要引入模組就可以直接使用了:

QT += mqtt

包含標頭檔案:

#include "QtMqtt/qmqttclient.h"

所以推薦使用第二種方式進行配置。接下來看看 Demo。

Demo演示

為了方便演示,我們直接使用 Qt Mqtt 原始碼中自帶的示例來編譯執行。


這個示例 Qt 官方有詳細介紹的,https://doc.qt.io/QtMQTT/qtmqtt-simpleclient-example.html
將該示例開啟,有個地方需要改一下,開啟 Pro 檔案:

將以上兩行註釋掉,要不然會有依賴,無法獨立執行。

我們直接編譯執行該示例,效果圖如下:


在官方文件中介紹,可以直接連線以下兩個伺服器地址:


經測試,第一個地址連線不上,所以我們直接輸入第二個地址進行測試:broker.hivemq.com


輸入地址,點選連線後就可以連線伺服器,並且 State 變成了 2 就表示已經連上了。
然後點選訂閱按鈕,表示要訂閱這個主題,在點擊發布,就可以收到資訊了:


可以在多臺電腦上進行測試,只要訂閱了同一個主題,那麼一端傳送訊息,其他端就可以接收到相應的資訊。

Qt官方提供了非常詳細的文件介紹,大家可以去參考介面的使用,最主要使用的類是QMqttClient

至此,Qt官方提供的MQTT封裝模組使用介紹已經全部完了,如果想了解第三方(EMQ)開發的用於 Qt 呼叫 MQTT 的介面,請參考:Qt開發MQTT(二) 之第三方QMQTT

Demo下載

這是遇到了些編譯錯誤,解決修改好後的 MQTT 原始碼下載地址(Qt 5.12.9 MinGW):

https://github.com/confidentFeng/QtAppProject/tree/master/qtmqtt-dev

匯入外部庫方式的 Demo 下載地址:https://github.com/confidentFeng/QtAppProject/tree/master/QMqttClientTool


參考:

Qt開發MQTT(一) 之Qt官方Qt MQTT

QT5.12編譯MQTT 5.13圖文詳細版