原文地址 https://blog.csdn.net/luoyayun361/article/details/104671603
概述
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.14.1+mingw7.3.0
注意,編譯這個源碼需要安裝perl,否則會報錯:perl 不是內部或外部命令,也不是可運行的程序。
perl下載地址:https://www.perl.org/get.html
官網下載速度比較慢,我上傳到網盤了,可以在這里下載:
鏈接:https://pan.baidu.com/s/1p5YOo-FU-ZLJUtuZSN0Rjg 提取碼:i0dm
安裝完Perl后會自動寫入環境變量, 這時候再次編譯(Release模式)QtMqtt源碼,編譯完成后得到以下文件;
接下來就可以將mqtt部署到自己的Qt項目中了
編譯時出現的問題:
- 將
connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
替換為
connect(socket, static_cast<void(QAbstractSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error),
this, static_cast<void(QMqttConnection::*)(QAbstractSocket::SocketError)>(&QMqttConnection::transportError) );
- 將
m_receiveAliases.resize(m_clientPrivate->m_serverConnectionProperties.maximumTopicAlias());
m_publishAliases.resize(m_clientPrivate->m_connectionProperties.maximumTopicAlias());
替換為
m_receiveAliases.reserve(m_clientPrivate->m_serverConnectionProperties.maximumTopicAlias());
m_publishAliases.reserve(m_clientPrivate->m_connectionProperties.maximumTopicAlias());
- 將
const auto filterLevels = QStringView{d->filter}.split(QLatin1Char('/'));
const auto topicLevels = QStringView{topic}.split(QLatin1Char('/'));
替換為
const auto filterLevels = QString{d->filter}.split(QLatin1Char('/'));
const auto topicLevels = QString{topic}.split(QLatin1Char('/'));
部署
將QtMqtt的庫直接部署到Qt安裝目錄中,這樣只需要部署一次,以后在任何工程中引用都不需要再額外導入庫了。
首先,將qtmqtt源碼目錄下(qtmqtt\src\mqtt)的所有.h頭文件拷貝,Qt安裝目錄下的include文件夾中創建一個mqtt目錄,將拷貝的文件粘貼進去:
然后,將源碼編譯生成目錄下的lib中以下6個文件拷貝,注意這里編譯的是DEBUG版本,一般還要編譯RELEASE版本,重復以下操作.
將上圖中的文件拷貝到
然后把
拷貝到
並把
拷貝到
ok,配置完畢,這種方式配置在新建工程中引用只需要引入模塊就可以直接使用了
QT += mqtt
包含頭文件
#include <QtMqtt/QtMqtt.h>