#include "mqttaw.h"
#include "ui_mqttaw.h"
#include <QtCore/QDateTime>
#include <QtMqtt/qmqttclient.h>
#include <QtWidgets/QMessageBox>
QMqttClient m_client;
mqttAW::mqttAW(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::mqttAW)
{
ui->setupUi(this);
//实例化新的mqttclient
//m_client = new QMqttClient(this);
//读取服务器地址和端口号
m_client.setHostname(ui->lineEditHost->text());
m_client.setPort(ui->spinBoxPort->value());
//用户名和密码
m_client.setUsername(ui->lineEditUserName->text());
m_client.setPassword(ui->lineEditPassword->text());
//信号与函数关联,主要是mqtt状态的信号、接收到数据的信号、发送成功与否的信号
connect(&m_client, &QMqttClient::disconnected, this, &mqttAW::brokerDisconnected);
connect(&m_client, &QMqttClient::messageReceived, this, [this](const QByteArray &message, const QMqttTopicName &topic)
{
const QString content = QDateTime::currentDateTime().toString()
+ QLatin1String(":Received topic ")
+ topic.name()
+ QLatin1String(" Message: ")
+ message
+ QLatin1Char('\n');
ui->editLog->insertPlainText(content);
});
connect(&m_client, &QMqttClient::pingResponseReceived, this, [this]() {
const QString content = QDateTime::currentDateTime().toString()
+ QLatin1String(" PingResponse")
+ QLatin1Char('\n');
ui->editLog->insertPlainText(content);
});
connect(ui->lineEditHost, &QLineEdit::textChanged, &m_client, &QMqttClient::setHostname);
}
// 窗体上按钮链接mqtt服务器触发的函数
void mqttAW::on_buttonConnect_clicked()
{
if (m_client.state() == QMqttClient::Disconnected)
{
ui->lineEditHost->setEnabled(false);
ui->spinBoxPort->setEnabled(false);
ui->lineEditUserName->setEnabled(false);
ui->lineEditPassword->setEnabled(false);
ui->buttonConnect->setText(tr("取消链接"));
m_client.connectToHost();
}
else
{
ui->lineEditHost->setEnabled(true);
ui->spinBoxPort->setEnabled(true);
ui->lineEditUserName->setEnabled(true);
ui->lineEditPassword->setEnabled(true);
ui->buttonConnect->setText(tr("链接MQTT服务器"));
m_client.disconnectFromHost();
}
}
void mqttAW::updateLogStateChange()
{
const QString content = QDateTime::currentDateTime().toString()
+ QLatin1String(": state change ")
+ QString::number(m_client.state())
+ QLatin1Char('\n');
ui->editLog->insertPlainText(content);
}
//消息队列断开链接
void mqttAW::brokerDisconnected()
{
ui->lineEditHost->setEnabled(true);
ui->spinBoxPort->setEnabled(true);
ui->buttonConnect->setText(tr("链接MQTT服务器"));
}
void mqttAW::setClientPort(int p)
{
m_client.setPort(p);
}
//发布消息
void mqttAW::on_buttonPublish_clicked()
{
if (m_client.publish(ui->lineEditTopic->text(), ui->lineEditMessage->text().toUtf8()) == -1)
QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("can not describe message!"));
}
//订阅/取消订阅按钮
void mqttAW::on_buttonSubscribe_clicked()
{
if(ui->buttonSubscribe->text() == "取消设定")
{
m_client.unsubscribe(ui->lineEditTopic->text());
ui->buttonSubscribe->setText(tr("设定"));
ui->lineEditTopic->setEnabled(true);
return;
}
auto subscription = m_client.subscribe(ui->lineEditTopic->text());
if (!subscription)
{
QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("can not describe, connect invaled?"));
return;
}
else
{
ui->buttonSubscribe->setText(tr("取消设定"));
ui->lineEditTopic->setEnabled(false);
}
}
mqttAW::~mqttAW()
{
delete ui;
}