1.配置Qt-MQTT环境

配置方法网上太多了,自己去看看,比如:

一文搞懂Qt-MQTT开发_qt mqtt_超级小清的博客-CSDN博客

2.知识点总结

QMqttClient类:

QtMqttClient *client=new Qt

client->isConnectedToHost()//---1----表示已经链接,--0----表述未连接

/*提供的信号:*/

connected();// 当客户端成功连接到MQTT代理时发出的信号。

disconnected();// 当客户端与MQTT代理断开连接时发出的信号。

error(QMQTT::ClientError error); //当客户端遇到错误时发出的信号,其中error参数指示具体的错误类型。

subscribed(const QString &topic, quint8 qos); //当客户端成功订阅一个主题时发出的信号,其中topic参数是订阅的主题,qos参数是质量服务等级。

unsubscribed(const QString &topic); //当客户端成功取消订阅一个主题时发出的信号,其中topic参数是取消订阅的主题。

messageReceived(QByteArray,QMqttTopicName); //当客户端接收到一条消息时发出的信号,其中message参数是接收到的消息

                                        //很遗憾没有提供Published相关信号

/*具体使用*/     /*建立连接*/              

client->setProtocolVersion(QMqttClient::MQTT_5_0);//MQTT版本

            client->setCleanSession(ui->Clean_Session->isChecked());//用于指定客户端与代理断开连接时是否清除之前的会话状态。当"Clean Session"设置为true时,表示每次连接都是一个新的会话,之前的订阅、发布等状态都会被清除。当"Clean Session"设置为false时,表示客户端与代理断开连接后,会话状态会被保留,包括之前的订阅和发布消息。

            client->setHostname(hostname);//IP地址QString类型

            client->setPort(ui->Port_lineEdit->text().toInt());//端口

            client->setClientId(ui->ClintID_lineEdit->text());//设置客户端ID

            client->setUsername(ui->UserName_lineEdit->text());//用户名

            client->setPassword(ui->PassWord_lineEdit->text().toLatin1());//密码

            client->setKeepAlive(ui->Time_lineEdit->text().toInt());//在MQTT中,Keep Alive是一个心跳机制,用于维持客户端与代理之间的活动连接。客户端通过定期发送PINGREQ消息来告知代理自己仍然处于活动状态,而代理则通过回复PINGRESP消息来确认连接的活动状态。通过保持Keep Alive间隔内的通信,可以确保连接不会因为长时间的不活动而被断开。

/*有域名用DNS解析*/

            QHostInfo info = QHostInfo::fromName(ui->IP_lineEdit->text());//DNS域名解析info.addresses().first().toString()

        /*.............订阅数据.........*/

client->subscribe(ui->Subscribe_Publish_lineEdit->text());//订阅ui->Subscribe_Publish_lineEdit->text()

connect(client, SIGNAL(messageReceived(QByteArray,QMqttTopicName)), this, SLOT(receiveMess(QByteArray,QMqttTopicName)));//receiveMess(QByteArray,QMqttTopicName)需要自己去定义

        /*.................发布数据............*/

client->publish(ui->Publish_lineEdit->text(),ba);//发布主题:ui->Publish_lineEdit->text(),发布消息:ba,我在前面用数组存储了相关消息

        /*QString msg=ui->Publish_textEdit->toPlainText();

        QByteArray ba;

        ba.append(msg);*/

3.代码部分

.h文件:

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include

#include "QtMqtt/qmqttclient.h"

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define TIMEMS qPrintable (QTime::currentTime().toString("HH:mm:ss zzz"))

QT_BEGIN_NAMESPACE

namespace Ui { class MainWindow; }

QT_END_NAMESPACE

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

MainWindow(QWidget *parent = nullptr);

~MainWindow();

QMqttClient *client;

protected:

void closeEvent(QCloseEvent *event);

private:

Ui::MainWindow *ui;

QTimer *m_pTimer;

void uiChange(bool isEnabled);

uint16_t countTime;//定时时间

QFont font;

void word_style(QFont font);

void writeSetting(void);

void readSettings(void);

private slots:

void onMQTT_Connected();

void onMQTT_Disconnected();

void onMQTT_subscribed(const QString &topic);//产生订阅信号

// void onMQTT_Publish(QString msg);//发布信号

void on_conPushButton_clicked();//连接按钮

void receiveMess(const QByteArray &msg,const QMqttTopicName topic);//接收数据

void on_Publish_pushButton_clicked();

void on_PublishClear_pushButton_clicked();

void on_SubscribeClear_pushButton_clicked();

void on_Subscribe_pushButton_clicked();

//void on_PublishShowClear_pushButton_2_clicked();

void on_PublishShowClear_pushButton_clicked();

};

#endif // MAINWINDOW_H

4..c文件

#include "mainwindow.h"

#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)

: QMainWindow(parent)

, ui(new Ui::MainWindow)

{

ui->setupUi(this);

this->setWindowTitle("MQTT Client-V0.1");

client = new QMqttClient(this);//创建一个MQTT客户端

m_pTimer=new QTimer(this);

countTime=0;

/*设置文字风格*/

word_style(font);

connect(client, SIGNAL(connected()), this, SLOT(onMQTT_Connected()));

connect(client, SIGNAL(disconnected()), this, SLOT(onMQTT_Disconnected()));

connect(client, SIGNAL(messageReceived(QByteArray,QMqttTopicName)), this, SLOT(receiveMess(QByteArray,QMqttTopicName)));

readSettings();

uiChange(true);

}

MainWindow::~MainWindow()

{

delete ui;

}

/*接收数据*/

void MainWindow::receiveMess(const QByteArray &msg,const QMqttTopicName topic){

QString content;

content = QDateTime::currentDateTime().toString() + QLatin1Char('\n');

content += QLatin1String(" Received Topic: ") + topic.name() + QLatin1Char('\n');

content += QLatin1String(" Message: ") + msg + QLatin1Char('\n');

ui->Show_textBrowser->setTextColor(QColor("green"));

ui->Show_textBrowser->append(content);

}

/*连接成功*/

void MainWindow::onMQTT_Connected(){

if(client->Disconnected){

qDebug()<<"connect error"<

uiChange(true);

}else{

qDebug()<<"connect success"<

uiChange(false);

}

}

/*断开连接*/

void MainWindow::onMQTT_Disconnected(){

if(client->Disconnected){

qDebug()<<"connect error"<

}else{

qDebug()<<"connect success"<

}

m_pTimer->stop();

uiChange(true);

}

void MainWindow::onMQTT_subscribed(const QString &topic){

qDebug() << "subscribed success!!" <

ui->Show_textBrowser->setTextColor(QColor("seagreen"));

ui->Show_textBrowser->append(QString("时间[%1] << %2").arg(TIMER_ABSTIME).arg("订阅成功"));

}

/*连接按钮,连接服务器*/

void MainWindow::on_conPushButton_clicked(){

if(ui->conPushButton->text()=="连接")//连接服务器

{

if(!client->Disconnected)//还没有建立连接

{

QHostAddress host(ui->IP_lineEdit->text());//保存IP地址

if(host.isNull()){//IP地址为空主要判断是不是输入的域名

QHostInfo info = QHostInfo::fromName(ui->IP_lineEdit->text());//DNS域名解析

// qDebug() << info.error();

if(info.error()==QHostInfo::NoError){//使用域名绑定的IP

QString hostname=QString(info.addresses().first().toString());

client->setProtocolVersion(QMqttClient::MQTT_5_0);

client->setCleanSession(ui->Clean_Session->isChecked());

client->setHostname(hostname);

client->setPort(ui->Port_lineEdit->text().toInt());

client->setClientId(ui->ClintID_lineEdit->text());

client->setUsername(ui->UserName_lineEdit->text());

client->setPassword(ui->PassWord_lineEdit->text().toLatin1());

client->setKeepAlive(ui->Time_lineEdit->text().toInt());

ui->conPushButton->setText("连接中请等待...");

client->connectToHost();

}

}

/*直接输入的IP地址*/

else{

QString hostname=ui->IP_lineEdit->text();

/*qDebug() << hostname;*/

client->setProtocolVersion(QMqttClient::MQTT_5_0);

client->setCleanSession(ui->Clean_Session->isChecked());

client->setHostname(hostname);

client->setPort(ui->Port_lineEdit->text().toInt());

client->setClientId(ui->ClintID_lineEdit->text());

client->setUsername(ui->UserName_lineEdit->text());

client->setPassword(ui->PassWord_lineEdit->text().toLatin1());

client->setKeepAlive(ui->Time_lineEdit->text().toInt());

ui->Status_label->setText("连接中请等待...");

ui->Status_label->setFont(font);

ui->Status_label->setStyleSheet("color: blue;");

client->connectToHost();

/*qDebug() << "Success1"<

}

}

else{//建立过连接,不做任何处理

}

}

else if(ui->conPushButton->text()=="断开")

{

if(!client->Disconnected)

{

client->disconnectFromHost();

}

}

}

void MainWindow::uiChange(bool isEnabled){

if(isEnabled){

ui->conPushButton->setText("连接");

ui->Clean_Session->setEnabled(true);

ui->Port_lineEdit->setEnabled(true);

ui->ClintID_lineEdit->setEnabled(true);

ui->IP_lineEdit->setEnabled(true);

ui->PassWord_lineEdit->setEnabled(true);

ui->UserName_lineEdit->setEnabled(true);

ui->Time_lineEdit->setEnabled(true);

ui->Subscribe_pushButton->setEnabled(false);

ui->Publish_pushButton->setEnabled(false);

ui->Subscribe_Publish_lineEdit->setEnabled(false);

ui->PublishClear_pushButton->setEnabled(false);

ui->Publish_lineEdit->setEnabled(false);

ui->Publish_textEdit->setEnabled(false);

ui->PublishShow_textBrowser->setEnabled(false);

ui->PublishShowClear_pushButton->setEnabled(false);

ui->Show_textBrowser->setEnabled(false);

ui->SubscribeClear_pushButton->setEnabled(false);

/*设置格式字体*/

ui->Status_label->setText("等待连接");

ui->Status_label->setFont(font);

ui->Status_label->setAlignment(Qt::AlignCenter);

ui->Status_label->setStyleSheet("color: red;");

}else{

ui->conPushButton->setText("断开");

ui->Clean_Session->setEnabled(false);

ui->Port_lineEdit->setEnabled(false);

ui->Time_lineEdit->setEnabled(false);

ui->ClintID_lineEdit->setEnabled(false);

ui->IP_lineEdit->setEnabled(false);

ui->PassWord_lineEdit->setEnabled(false);

ui->UserName_lineEdit->setEnabled(false);

ui->Subscribe_pushButton->setEnabled(true);

ui->Publish_pushButton->setEnabled(true);

ui->Subscribe_Publish_lineEdit->setEnabled(true);

ui->PublishClear_pushButton->setEnabled(true);

ui->Publish_lineEdit->setEnabled(true);

ui->Show_textBrowser->setEnabled(true);

ui->Publish_textEdit->setEnabled(true);

ui->PublishShow_textBrowser->setEnabled(true);

ui->PublishShowClear_pushButton->setEnabled(true);

ui->SubscribeClear_pushButton->setEnabled(true);

/*设置格式字体*/

ui->Status_label->setText("连接成功");

ui->Status_label->setFont(font);

ui->Status_label->setAlignment(Qt::AlignCenter);

ui->Status_label->setStyleSheet("color: blue;");

}

}

void MainWindow::word_style(QFont font){

font.setBold(true);

font.setPointSize(9);

font.setFamily("Arial");

font.setUnderline(true);

}

void MainWindow::on_Publish_pushButton_clicked()

{

if(client->Disconnected)

{

qDebug()<<"Disconnect"<

}

else{

QString msg=ui->Publish_textEdit->toPlainText();

QByteArray ba;

ba.append(msg);

/*发布结果显示*/

client->publish(ui->Publish_lineEdit->text(),ba);

qDebug() << "published success:" << msg;

ui->PublishShow_textBrowser->setTextColor(QColor("dodgerblue"));

ui->PublishShow_textBrowser->append(QString("时间[%1] >> %2").arg(TIMEMS).arg("发布成功"));

}

}

void MainWindow::on_PublishClear_pushButton_clicked()

{

ui->Publish_textEdit->clear();

}

void MainWindow::on_SubscribeClear_pushButton_clicked()

{

ui->Show_textBrowser->clear();

}

void MainWindow::on_Subscribe_pushButton_clicked()

{

if(client->Disconnected)

{

this->uiChange(true);

}

else

{

client->subscribe(ui->Subscribe_Publish_lineEdit->text());

ui->Show_textBrowser->setTextColor(QColor("red"));

ui->Show_textBrowser->append(QString("时间[%1] >> %2").arg(TIMEMS).arg("订阅成功"));

}

}

void MainWindow::closeEvent(QCloseEvent *event){

writeSetting();

event->accept();

}

void MainWindow::writeSetting(){

QSettings settings("Rocfly Inc.", "MQTT");

settings.setValue("geometry", saveGeometry());

settings.setValue("IP",ui->IP_lineEdit->text());

settings.setValue("port",ui->Port_lineEdit->text());

settings.setValue("ID",ui->ClintID_lineEdit->text());

settings.setValue("User_name",ui->UserName_lineEdit->text());

settings.setValue("password",ui->PassWord_lineEdit->text());

settings.setValue("Time",ui->Time_lineEdit->text());

settings.setValue("clean",ui->Clean_Session->isChecked());

settings.setValue("Publish",ui->Publish_lineEdit->text());

settings.setValue("Publish_text",ui->Publish_textEdit->toPlainText());

settings.setValue("subscript",ui->Subscribe_Publish_lineEdit->text());

}

void MainWindow::readSettings(){

QSettings settings("Rocfly Inc.", "MQTT");

settings.setValue("geometry", saveGeometry());

ui->IP_lineEdit->setText(settings.value("IP").toString());

ui->Port_lineEdit->setText(settings.value("port").toString());

ui->ClintID_lineEdit->setText(settings.value("ID").toString());

ui->UserName_lineEdit->setText(settings.value("User_name").toString());

ui->PassWord_lineEdit->setText(settings.value("password").toString());

ui->Time_lineEdit->setText(settings.value("Time").toString());

ui->Clean_Session->setChecked(settings.value("clean",true).toBool());

ui->Publish_lineEdit->setText(settings.value("Publish").toString());

ui->Publish_textEdit->setText(settings.value("Publish_text").toString());

ui->Subscribe_Publish_lineEdit->setText(settings.value("subscript").toString());

}

void MainWindow::on_PublishShowClear_pushButton_clicked()

{

ui->PublishShow_textBrowser->clear();

}

效果展示:

 

 

参考了部分未知名作者的代码,侵权联系删除。

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: