使用QT快速搭建简易的Mqtt客户端连接华为云
本文介绍了在QT中实现MQTT客户端的方法。首先参考相关技术文档添加MQTT模块,然后基于官方例程进行修改:在UI界面添加Username、Clientid和Password三个文本框,并在代码中设置对应的连接参数。通过信号与槽机制实现客户端与服务器的交互功能,包括连接状态监控、消息收发等。最后根据华为云的实际连接参数进行配置,完成客户端与服务器的成功连接。整个流程展示了如何在QT框架下快速开发具
·
1.添加Mqtt模块
详情根据这篇文章 https://blog.csdn.net/m0_56942491/article/details/132516553
2.根据官方的例程原地修改
找到官方例程,在QT中打开简易客户端的工程。
在ui设计中在原基础上添加三个lineEdit文本框。分别在原名基础上添加Username,Clientid,Password。
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCore/QDateTime>
#include <QtMqtt/QMqttClient>
#include <QtWidgets/QMessageBox>
using namespace Qt::StringLiterals;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_client = new QMqttClient(this);
m_client->setHostname(ui->lineEditHost->text());
m_client->setClientId(ui->lineEditClientid->text());
m_client->setUsername(ui->lineEditUsername->text());
m_client->setPassword(ui->lineEditPassword->text());
m_client->setKeepAlive(1000);
m_client->setProtocolVersion(QMqttClient::MQTT_3_1);
m_client->setPort(static_cast<quint16>(ui->spinBoxPort->value()));
connect(m_client, &QMqttClient::stateChanged, this, &MainWindow::updateLogStateChange);
connect(m_client, &QMqttClient::disconnected, this, &MainWindow::brokerDisconnected);
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);
});
connect(m_client, &QMqttClient::pingResponseReceived, this, [this]() {
const QString content = QDateTime::currentDateTime().toString()
+ "PingResponse\n"_L1;
ui->editLog->insertPlainText(content);
});
connect(ui->lineEditHost, &QLineEdit::textChanged, m_client, &QMqttClient::setHostname);
connect(ui->lineEditClientid, &QLineEdit::textChanged, m_client, &QMqttClient::setClientId);
connect(ui->lineEditUsername, &QLineEdit::textChanged, m_client, &QMqttClient::setUsername);
connect(ui->lineEditPassword, &QLineEdit::textChanged, m_client, &QMqttClient::setPassword);
connect(ui->spinBoxPort, QOverload<int>::of(&QSpinBox::valueChanged), this, &MainWindow::setClientPort);
updateLogStateChange();
}
MainWindow::~MainWindow()
{
delete ui;
}
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();
}
}
void MainWindow::on_buttonQuit_clicked()
{
QApplication::quit();
}
void MainWindow::updateLogStateChange()
{
const QString content = QDateTime::currentDateTime().toString()
+ ": State Change"_L1
+ QString::number(m_client->state())
+ u'\n';
ui->editLog->insertPlainText(content);
}
void MainWindow::brokerDisconnected()
{
ui->lineEditHost->setEnabled(true);
ui->spinBoxPort->setEnabled(true);
ui->buttonConnect->setText(tr("Connect"));
}
void MainWindow::setClientPort(int p)
{
m_client->setPort(static_cast<quint16>(p));
}
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);
}
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;
}
}
让后在mainwindow.c文件中添加ui设计中像例程中的Hostname一样添加信号与槽函数就行了。
3.设置参数
根据自己的华为云中的连接参数添加
参数填完后点击connect就可以了
可以看到已经连接上了。
更多推荐
所有评论(0)