QT的兩種MQTT庫
目前QT使用MQTT庫的方法有兩種:
- 一種為使用官方庫qmqtt:
https://github.com/qt/qtmqtt - 另一種是為使用EMQX提供的QT庫:
https://github.com/emqx/qmqtt
版本差異
兩個版本存在一定差異
- 官方庫qtmqtt功能比較強,支持MQTT5.0協議,SSL,有比較完整例程提供參考,但是官方庫版本眾多,在github中有32個分支版本,如果QT版本不對應可能會導致一些編譯錯誤,使得編譯無法通過,
- emqtt庫功能較弱,開發檔案介紹太簡單,在emqtt的github中的Readme檔案中簡單介紹了connect,和一些信號和槽,連接服務器只支持IP,使用域名需要自己使用QHostInfo轉化為IP,但是相比官方庫,其編譯簡單,對多個QT版本兼容性較好,方便在不同版本QT使用,此庫同時也支持SSL,但是MQTT5.0還沒有試過是否支持,
Windows下QT使用MQTT庫
在Windows平臺編譯使用官方MQTT的例子已經有博客介紹了,可以參考以下兩個博客:
- 官方庫qtmqtt編譯使用:
https://blog.csdn.net/luoyayun361/article/details/104671603
編譯前需要注意的問題:3、4中的錯誤很可能為編譯了不對應QT版本的Qmqtt庫,可在官方github分支中查找自己QT對應的版本,在這里我使用的是QT5.8.0版本編譯官方庫,所以我使用了最接近QT5.8.0的版本qtmqtt-5.12版本,


按照對應版本的QTMQTT庫進行編譯一般不會出現錯誤,實測完成1、2中的錯誤修改后編譯完成,成功提取lib檔案,
- 其中編譯官方庫需要除了此博客中的注意點以外,還需要注庫的源檔案路徑中不能出現中文,否則無法進行編譯,
- 編譯可能會出錯 QtMqtt/qmqttglobal.h: No such file or directory,
解決方法為:在QT的安裝目下include檔案夾下創建QtMqtt檔案夾,例如 Qt\5.8\mingw53_32\include\QtMqtt將源檔案src/mqtt下所有.h頭檔案添加到我們創建的QtMqtt檔案夾,
問題的主要原因是:編譯器是按照在Qt安裝目錄下搜索的,但我們檔案是我們自己隨意放的目錄下的 src\mqtt 路徑下,
原文:https://blog.csdn.net/qq_39280795/article/details/105455436 - 編譯可能會出錯 qmqttconnection.cpp:169: error: ‘errorOccurred’ is not a member of ‘QAbstractSocket’
connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
qmqttconnection.cpp 中 168行有這么一句:
就是這句出了問題,查幫助檔案或者源代碼都可以發現 QAbstractSocket 沒有 errorOccurred 這個 信號,有的那個信號叫:connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
所以要改寫成:void error(QAbstractSocket::SocketError socketError)connect(socket, static_cast<void(QAbstractSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error), this, static_cast<void(QMqttConnection::*)(QAbstractSocket::SocketError)>(&QMqttConnection::transportError) );
原文:https://blog.csdn.net/liyuanbhu/article/details/106597506
4.錯誤qmqttconnection.cpp:1455: error: ‘class QList’ has no member named ‘resize’
此錯誤為QT6的QMQTT類中成員,使用了QT5編譯,當然無法找到,使用老版本QT需要在github倉庫中選擇對應版本的分支,
5.編譯運行官方例子simpleclient.pro中出現的問題:error: QMqttClient: No such file or directory此錯誤可以將
#include <QMqttClient>
改為
#include <qmqttclient.h>
此外還會出現error: QtMqtt/QMqttClient: No such file or directory
此錯誤可以將
#include <QtMqtt/QMqttClient>
改為
#include <qmqttglobal.h>
- emqx_mqtt:
https://luoyayun361.blog.csdn.net/article/details/104699062Windows上QT5.8按照此教程沒有出現錯誤,
Linux下QT使用MQTT庫
- Linux下官方QTMQTT庫程式從win上可以移植過來,但是注意QT版本不能相差太大,并且lib下dll的檔案需要換成.so檔案,這就意味著需要將QTMqtt代碼使用Linux上QT的gcc++重新編譯一遍,并且將lib下的dll,.a檔案換成linux編譯出的lib,
1.編譯qtmqtt,勾選release,注意kit套件版本,要和winQT版本對應上,一般ubuntu系統會自帶QT,注意安裝使用配套Win上寫的程式的QT版本,

2.編譯會出現和Win上同樣的錯誤QtMqtt/qmqttglobal.h: No such file or directory,
此時可按照win上qtmqtt教程一樣在qt的安裝目錄/opt/Qt5.8.0/5.8/gcc_64/include目錄下新建QtMqtt檔案夾,將原始碼檔案qtmqtt-5.12/src/mqtt中的.h頭檔案復制到其中,
3.再次編譯成功,會在原始碼檔案夾中找到lib檔案夾下的lib檔案,替換windows下編好程式的lib庫(.a,.dll檔案),


4.相比在win上的程式還需在程式的.pro檔案中多加入一段else:unix:!macx: LIBS += -L$$PWD/lib/ -lQt5Mqtt
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Mqttd
else:unix:!macx: LIBS += -L$$PWD/lib/ -lQt5Mqtt
INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include
5.編譯win上移植過來的程式運行成功


- Linux下emqx的移植,同理與qtmqtt一樣,需要在linux平臺下重新編譯原始碼,
可以看博客:https://blog.csdn.net/wct3344142/article/details/107022706
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274124.html
標籤:其他
