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(); } 效果展示: 参考了部分未知名作者的代码,侵权联系删除。 文章链接
发表评论