zoukankan      html  css  js  c++  java
  • 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源码目录下(qtmqttsrcmqtt)的所有.h头文件拷贝,Qt安装目录下的include文件夹中创建一个mqtt目录,将拷贝的文件粘贴进去:

    然后,将源码编译生成目录下的lib中以下6个文件拷贝,注意这里编译的是DEBUG版本,一般还要编译RELEASE版本,重复以下操作.

    将上图中的文件拷贝到

    然后把

    拷贝到

    并把

    拷贝到

    ok,配置完毕,这种方式配置在新建工程中引用只需要引入模块就可以直接使用了

    QT += mqtt
    

    包含头文件

    #include <QtMqtt/QtMqtt.h>
    
  • 相关阅读:
    (Java实现) 洛谷 P1106 删数问题
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1106 删数问题
    目测ZIP的压缩率
  • 原文地址:https://www.cnblogs.com/charleechan/p/13931498.html
Copyright © 2011-2022 走看看