问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

在Qt6中使用MQTT:入门指南

创作时间:
作者:
@小白创作中心

在Qt6中使用MQTT:入门指南

引用
1
来源
1.
https://www.cnblogs.com/emqx/p/18558600

Qt是一个跨平台框架和工具包,可用于开发能够在不同硬件平台和操作系统上运行的软件。MQTT是一种基于发布/订阅模式的轻量级物联网消息协议。本文将为您提供在Qt6中使用MQTT进行无缝通信的分步指南。

Qt6 项目准备

本文中,我们在搭载M2芯片的MacBook上使用了Qt v6.6.2。您可以在此处下载并安装Qt的开源版本。

建议在安装前先注册一个Qt账户。

安装Qt后,您需要安装g++和XCode并设置一些环境变量。Qt官方文档提供了在macOS上的相关设置说明。

通过CMake编译Qt MQTT模块

Qt MQTT模块是Qt的官方库,提供了符合标准的MQTT协议规范实现。然而,该模块并未包含在开源安装包中,需要从源代码编译。

首先,从GitHub下载Qt MQTT的源代码。确保Qt MQTT的版本与您机器上安装的Qt版本匹配。

git clone git://code.qt.io/qt/qtmqtt.git -b 6.6.2

接下来,在QtCreator中编译Qt MQTT。在Qt6中,您可以使用qmake或CMake来构建代码。本文中我们使用CMake。打开Qt MQTT的CMakeLists.txt文件并编译项目。

编译成功后,将创建一个名为build-qtmqtt-Desktop_arm_darwin_generic_mach_o_64bit-Release的新文件夹,所有静态和动态库文件将生成并存储在此文件夹中。

添加Qt MQTT模块

编译完成后,有两种方式可以使用该模块。一种是在项目中将qtmqtt导入为第三方模块,另一种是将编译后的文件直接放置在Qt的安装目录中。本文中,我们采用第二种方式。

  1. 在目录Qt/6.6.2/macos/include/下创建一个名为QtMqtt的新文件夹。然后将qtmqtt/src/mqtt/下的所有文件复制到该文件夹。
  2. 将生成的静态和动态库复制到Qt的安装目录。将build-qtmqtt-Desktop_arm_darwin_generic_mach_o_64bit-Release/lib目录下的所有文件和文件夹复制到Qt/6.6.2/macos/lib/目录中。如有需要替换的文件,请替换。
  3. build-qtmqtt-Desktop_arm_darwin_generic_mach_o_64bit-Release/lib/cmake下的Qt6Mqtt文件夹复制到Qt/6.6.2/macos/lib/cmake中。
  4. build-qtmqtt-Desktop_arm_darwin_generic_mach_o_64bit-Release/mkspecs/modules中的两个.pri文件复制到Qt/6.6.2/macos/mkspecs/modules中。

社区成员Diego Schulz提供了更好的Qt MQTT模块构建和安装方法,供您参考。

准备MQTT Broker

在继续操作之前,请确保您拥有一个用于通信和测试的MQTT服务器。

本指南将使用由EMQ提供的免费公共MQTT Broker,基于EMQX Platform构建。服务器访问详情如下:

  • 代理:broker.emqx.io
  • TCP端口:1883
  • SSL/TLS端口:8883
  • WebSocket端口:8083
  • SSL/TLS端口:8883
  • 安全WebSocket端口:8084

更多相关信息,请参考:免费的公共MQTT服务器

在Qt中使用MQTT

简单的Qt MQTT应用程序

现在我们可以在Qt中使用Qt MQTT模块,该模块提供了一些示例来展示其功能。

在本文中,我们将使用Simple MQTT Client Example来演示如何使用MQTT创建一个与MQTT Broker通信的应用程序。我们在QtCreator中打开示例项目,查看该应用程序的运行情况。

回到我们使用git clone git://code.qt.io/qt/qtmqtt.git -b 6.6.2命令下载的目录,进入simpleclient示例项目目录:

cd qtmqtt
cd examples/mqtt/simpleclient

找到其中的CMakeLists.txt文件。用Qt Creator打开它,并按以下选项配置项目:

配置完成后。由于在前面的步骤中已经在本地环境中安装了QtMqtt库,程序可以成功运行。

在启动的图形化应用程序中,将主机输入框填入broker.emqx.io,端口填入1883。依次点击“Connect”、“Subscribe”和“Publish”按钮,将会得到如下输出:

此时,一个简单的MQTT客户端已成功运行。

创建MQTT客户端

首先,我们使用QMqttClient类创建一个MQTT客户端。该类提供了用于设置唯一客户端ID、代理主机名和端口的属性:

// mainwindow.cpp line 19
m_client = new QMqttClient(this);
m_client->setHostname(ui->lineEditHost->text());
m_client->setPort(static_cast<quint16>(ui->spinBoxPort->value()));

我们不设置客户端ID,系统会自动生成。

接下来,我们连接到QMqttClient::messageReceived()来接收来自代理的所有消息:

// mainwindow.cpp line 26
connect(m_client, &QMqttClient::messageReceived, this, [this](const QByteArray &message, const QMqttTopicName &topic) {
    const QString content = QDateTime::currentDateTime().toString()
                + " Received Topic: "_L1
                + topic.name()
                + " Message: "_L1
                + message
                + u'\n';
    ui->editLog->insertPlainText(content);
});

连接/断开Broker

在示例程序中,我们可以通过点击“Connect/Disconnect”按钮连接/断开到MQTT Broker,触发以下函数:

// mainwindow.cpp line 52
void MainWindow::on_buttonConnect_clicked()
{
    if (m_client->state() == QMqttClient::Disconnected) {
        ui->lineEditHost->setEnabled(false);
        ui->spinBoxPort->setEnabled(false);
        ui->buttonConnect->setText(tr("Disconnect"));
        m_client->connectToHost();
    } else {
        ui->lineEditHost->setEnabled(true);
        ui->spinBoxPort->setEnabled(true);
        ui->buttonConnect->setText(tr("Connect"));
        m_client->disconnectFromHost();
    }
}

关键在于我们可以通过调用m_client->connectToHost()/m_client->disconnectFromHost()方法来连接/断开MQTT Broker。

订阅/取消订阅主题

同样,我们可以通过调用QMqttClient::subscribeQMqttClient::unsubscribe来创建和取消订阅主题:

// mainwindow.cpp line 9:
void MainWindow::on_buttonSubscribe_clicked()
{
    auto subscription = m_client->subscribe(ui->lineEditTopic->text());
    if (!subscription) {
        QMessageBox::critical(this, u"Error"_s,
                              u"Could not subscribe. Is there a valid connection?"_s);
        return;
    }
}

一旦订阅成功创建,MQTT Broker就会将该主题的消息推送到客户端,Qt MQTT将回调我们之前为其设置的QMqttClient::messageReceived函数。

发布消息

我们可以通过调用QMqttClient::publish将消息内容发布到指定主题:

// mainwindow.cpp line 93
void MainWindow::on_buttonPublish_clicked()
{
    if (m_client->publish(ui->lineEditTopic->text(), ui->lineEditMessage->text().toUtf8()) == -1)
        QMessageBox::critical(this, u"Error"_s, u"Could not publish message"_s);
}

完整代码

所有示例代码可在GitHub qtmqtt/example中找到。

Qt Creator中常见的编译错误

在导入qtmqtt到Qt Creator后,您可能会遇到如下错误:

[cmake] CMake Error at CMakeLists.txt:14 (find_package):
[cmake]   Could not find a package configuration file provided by "Qt6" (requested
[cmake]   version 6.6.2) with any of the following names:
[cmake]
[cmake]     Qt6Config.cmake
[cmake]     qt6-config.cmake
[cmake]
[cmake]   Add the installation prefix of "Qt6" to CMAKE_PREFIX_PATH or set "Qt6_DIR"
[cmake]   to a directory containing one of the above files.  If "Qt6" provides a

这是由于Qt6安装目录未被CMake识别。您可以通过将Qt/6.6.2/macos/lib/cmake添加到CMake模块路径来解决此问题:

结语

本指南提供了在Qt6中设置和使用MQTT的步骤,包括从编译Qt MQTT模块到创建一个简单的MQTT客户端应用程序。使用EMQ提供的公共MQTT Broker,您可以轻松测试和实现MQTT的通信功能。通过这一过程,您已经了解了Qt MQTT的基础使用方式,包括连接代理、订阅和取消订阅主题以及发布消息的功能。希望本文能够帮助您顺利构建基于Qt和MQTT的IoT应用。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号