Qt開發MQTT


原文地址 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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM