QT MQTT库在win上和linux上的使用
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文件。
解決方法為:在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
connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
qmqttconnection.cpp 中 168行有這么一句:connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError); 就是這句出了問題。查幫助文檔或者源代碼都可以發現 QAbstractSocket 沒有 errorOccurred 這個 信號。有的那個信號叫: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/104699062 Windows上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/include5.編譯win上移植過來的程序運行成功
- Linux下emqx的移植,同理與qtmqtt一樣,需要在linux平臺下重新編譯源碼。
可以看博客:https://blog.csdn.net/wct3344142/article/details/107022706
總結
以上是生活随笔為你收集整理的QT MQTT库在win上和linux上的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django按日期查询数据
- 下一篇: 韦东山 IMX6ULL和正点原子_「正点