在Qt6中使用MQTT:入门指南
在Qt6中使用MQTT:入门指南
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的安装目录中。本文中,我们采用第二种方式。
- 在目录
Qt/6.6.2/macos/include/
下创建一个名为QtMqtt
的新文件夹。然后将qtmqtt/src/mqtt/
下的所有文件复制到该文件夹。 - 将生成的静态和动态库复制到Qt的安装目录。将
build-qtmqtt-Desktop_arm_darwin_generic_mach_o_64bit-Release/lib
目录下的所有文件和文件夹复制到Qt/6.6.2/macos/lib/
目录中。如有需要替换的文件,请替换。 - 将
build-qtmqtt-Desktop_arm_darwin_generic_mach_o_64bit-Release/lib/cmake
下的Qt6Mqtt
文件夹复制到Qt/6.6.2/macos/lib/cmake
中。 - 将
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::subscribe
和QMqttClient::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应用。