Files
CodeRepository/Apps/App_MqttClient/WidgetMqtt.cpp
chenzhen 222dda1e43 1,新增“App_ThermalImageSystem”;
2,新增“Apps”;
3,新增“Common”;
4,新增“FileList”;
5,新增“MediaX”;
6,新增“OpenSource”;
7,新增“Samples”;
8,新增“SoftwareBusinessLines”.
2026-02-14 23:03:23 +08:00

474 lines
12 KiB
C++

#include "widgetmqtt.h"
#include "ui_widgetmqtt.h"
WidgetMQTT::WidgetMQTT(QWidget* parent) :
QWidget(parent),
ui(new Ui::WidgetMQTT)
{
ui->setupUi(this);
InitWidget();
}
WidgetMQTT::~WidgetMQTT()
{
ConfigInfo* conf = ConfigInfo::GetInstance();
conf->m_strCurTopic = ui->lineEditTopic->text();
conf->m_strPubishTopic = ui->lineEditPubish->text();
conf->writeConfig();
delete ui;
}
void WidgetMQTT::InitWidget()
{
ConfigInfo* conf = ConfigInfo::GetInstance();
conf->readConfig();
conf->readConfigInfo();
m_pMqttDealer = new MqttDealer;
m_bSendHex = true;
m_bShowHex = true;
m_bSelectSub = false;
m_strReceiveShow = "";
m_bTimeSend = false;
m_iTimeCnt = 2;
m_lRecCnt = 0;
m_iSendCnt = 0;
ui->lineEditServerIP->setText(conf->m_strServerIP);
ui->lineEditServerPort->setText(conf->m_strServerPort);
ui->lineEditTopic->setText(conf->m_strCurTopic);
ui->lineEditPubish->setText(conf->m_strPubishTopic);
ui->pushButtonSubscribe->setEnabled(false);
ui->pushButtonDissubscribe->setEnabled(false);
m_listButtons.append(ui->pushButtonFunc0);
m_listButtons.append(ui->pushButtonFunc1);
m_listButtons.append(ui->pushButtonFunc2);
m_listButtons.append(ui->pushButtonFunc3);
m_listButtons.append(ui->pushButtonFunc4);
m_listButtons.append(ui->pushButtonFunc5);
m_listButtons.append(ui->pushButtonFunc6);
m_listButtons.append(ui->pushButtonFunc7);
m_listButtons.append(ui->pushButtonFunc8);
m_listButtons.append(ui->pushButtonFunc9);
m_listButtons.append(ui->pushButtonFunc10);
m_listLineEdit.append(ui->lineEditMessage0);
m_listLineEdit.append(ui->lineEditMessage1);
m_listLineEdit.append(ui->lineEditMessage2);
m_listLineEdit.append(ui->lineEditMessage3);
m_listLineEdit.append(ui->lineEditMessage4);
m_listLineEdit.append(ui->lineEditMessage5);
m_listLineEdit.append(ui->lineEditMessage6);
m_listLineEdit.append(ui->lineEditMessage7);
m_listLineEdit.append(ui->lineEditMessage8);
m_listLineEdit.append(ui->lineEditMessage9);
m_listLineEdit.append(ui->lineEditMessage10);
m_listCheckBox.append(ui->checkBox_1);
m_listCheckBox.append(ui->checkBox_2);
m_listCheckBox.append(ui->checkBox_3);
m_listCheckBox.append(ui->checkBox_4);
m_listCheckBox.append(ui->checkBox_5);
m_listCheckBox.append(ui->checkBox_6);
m_listCheckBox.append(ui->checkBox_7);
m_listCheckBox.append(ui->checkBox_8);
m_listCheckBox.append(ui->checkBox_9);
m_listCheckBox.append(ui->checkBox_10);
for (int i = 0; i < 10; i++)
{
QLineEdit* le = m_listLineEdit.at(i + 1);
le->setText(conf->m_strInfo[i]);
}
connect(m_pMqttDealer, SIGNAL(sigMQTTDisconnect()), this, SLOT(slotMQTTDisconnect()));
connect(m_pMqttDealer, SIGNAL(sigMQTTMessage(QString, QString)), this, SLOT(slotMQTTMessage(QString, QString)));
connect(m_pMqttDealer, SIGNAL(sigMQTTMessage(QString, QByteArray)), this, SLOT(slotMQTTMessage(QString, QByteArray)));
connect(ui->pushButtonConnect, SIGNAL(clicked()), this, SLOT(slotButtonDown()));
connect(ui->pushButtonSubscribe, SIGNAL(clicked()), this, SLOT(slotButtonDown()));
connect(ui->pushButtonDissubscribe, SIGNAL(clicked()), this, SLOT(slotButtonDown()));
connect(ui->pushButtonClear, SIGNAL(clicked()), this, SLOT(slotButtonDown()));
connect(ui->pushButtonTimeSend, SIGNAL(clicked()), this, SLOT(slotButtonDown()));
connect(ui->pushButtonClearSend, SIGNAL(clicked()), this, SLOT(slotButtonDown()));
connect(ui->radioButtonHex, SIGNAL(clicked()), this, SLOT(slotRadioDown()));
connect(ui->radioButtonString, SIGNAL(clicked()), this, SLOT(slotRadioDown()));
connect(ui->radioButtonHex_2, SIGNAL(clicked()), this, SLOT(slotRadioDown()));
connect(ui->radioButtonString_2, SIGNAL(clicked()), this, SLOT(slotRadioDown()));
for (int i = 0; i < 11; i++)
{
QPushButton* pb = m_listButtons.at(i);
connect(pb, SIGNAL(clicked()), this, SLOT(slotButtonDown()));
}
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timerUpdate()));
timer->start(10);
}
void WidgetMQTT::MosConnect()
{
if (m_pMqttDealer && !m_pMqttDealer->IsOpen())
{
QString strIp = ui->lineEditServerIP->text();
QByteArray baData = strIp.toUtf8();
int nPort = ui->lineEditServerPort->text().toInt();
if (m_pMqttDealer->Open(baData.data(), nPort))
{
ui->lineEditServerIP->setEnabled(false);
ui->lineEditServerPort->setEnabled(false);
ui->pushButtonSubscribe->setEnabled(true);
ui->pushButtonDissubscribe->setEnabled(true);
ui->pushButtonConnect->setText("断开服务器");
ConfigInfo* conf = ConfigInfo::GetInstance();
conf->m_strServerIP = strIp;
conf->m_strServerPort = QString::number(nPort);
conf->writeConfig();
}
}
else
{
DisconnectMos();
}
}
void WidgetMQTT::DisconnectMos()
{
m_pMqttDealer->Close();
m_listTopic.clear();
UpdateList();
ui->lineEditServerIP->setEnabled(true);
ui->lineEditServerPort->setEnabled(true);
ui->pushButtonSubscribe->setEnabled(false);
ui->pushButtonDissubscribe->setEnabled(false);
ui->pushButtonConnect->setText("连接服务器");
}
void WidgetMQTT::slotMQTTDisconnect()
{
DisconnectMos();
}
void WidgetMQTT::slotMQTTMessage(QString strTopic, QByteArray arrayMessage)
{
if (m_bSelectSub && ui->comboBoxSelectTopic->currentText() != strTopic)
{
return;
}
if (m_strReceiveShow != "")
{
m_strReceiveShow += "\n";
}
if (m_bShowHex)
{
m_strReceiveShow += strTopic + ":" + char2QString(arrayMessage);
}
else
{
m_strReceiveShow += strTopic + ":" + QString::fromUtf8(arrayMessage);
}
m_lRecCnt++;
}
void WidgetMQTT::slotMQTTMessage(QString strTopic, QString strMessage)
{
if (m_bSelectSub && ui->comboBoxSelectTopic->currentText() != strTopic)
{
return;
}
if (m_bShowHex)
{
m_strReceiveShow += strTopic + ":" + char2QString(strMessage.toLatin1());
}
else
{
m_strReceiveShow += strTopic + ":" + strMessage;
}
m_lRecCnt++;
}
void WidgetMQTT::UpdateList()
{
ui->comboBoxToptic->clear();
ui->comboBoxSelectTopic->clear();
foreach (QString str, m_listTopic)
{
ui->comboBoxToptic->addItem(str);
ui->comboBoxSelectTopic->addItem(str);
}
}
QByteArray WidgetMQTT::QString2Hex(QString str)
{
QByteArray senddata;
int hexdata, lowhexdata;
char lstr, hstr;
int hexdatalen = 0;
int len = str.length();
senddata.resize(len / 2);
for (int i = 0; i < len;)
{
//字符型
hstr = str[i].toLatin1();
if (hstr == ' ')
{
i++;
continue;
}
i++;
if (i >= len)
{
break;
}
lstr = str[i].toLatin1();
hexdata = convertHexChar(hstr);
lowhexdata = convertHexChar(lstr);
if ((hexdata == 16) || (lowhexdata == 16))
{
break;
}
else
{
hexdata = hexdata * 16 + lowhexdata;
}
i++;
senddata[hexdatalen] = (char)hexdata;
hexdatalen++;
}
senddata.resize(hexdatalen);
return senddata;
}
char WidgetMQTT::convertHexChar(char ch)
{
if ((ch >= '0') && (ch <= '9'))
return ch - 0x30;
else if ((ch >= 'A') && (ch <= 'F'))
return ch - 'A' + 10;
else if ((ch >= 'a') && (ch <= 'f'))
return ch - 'a' + 10;
else
return (-1);
}
QString WidgetMQTT::char2QString(QByteArray arrayData)
{
QString strR = "";
char* cIn = arrayData.data();
for (int i = 0; i < arrayData.count(); i++)
{
char outChar = (char)cIn[i];
strR += QString("%1").
arg(outChar & 0xFF, 2, 16, QLatin1Char('0')).toUpper() + QString(" ");
}
return strR;
}
void WidgetMQTT::slotRadioDown()
{
QRadioButton* button = qobject_cast<QRadioButton*>(sender());
if (button == ui->radioButtonHex)
{
m_bSendHex = true;
}
else if (button == ui->radioButtonString)
{
m_bSendHex = false;
}
else if (button == ui->radioButtonHex_2)
{
m_bShowHex = true;
}
else if (button == ui->radioButtonString_2)
{
m_bShowHex = false;
}
}
void WidgetMQTT::timerUpdate()
{
static int s_iCnt = 0;
if (++s_iCnt % 4 == 0)
{
if (m_strReceiveShow != "")
{
ui->plainTextEdit->appendPlainText(m_strReceiveShow);
m_strReceiveShow = "";
}
ui->lineEditSendCnt->setText(QString::number(m_iSendCnt));
}
static int s_iTSend = 0;
if (m_bTimeSend && ++s_iTSend >= m_iTimeCnt)
{
s_iTSend = 0;
for (int i = 0; i < 10; i++)
{
QCheckBox* cb = m_listCheckBox.at(i);
if (cb->isChecked())
{
QPushButton* pb = m_listButtons.at(i + 1);
pb->click();
}
}
}
ui->lineEditRecCnt->setText(QString::number(m_lRecCnt));
}
void WidgetMQTT::on_checkBoxSubscribe_clicked(bool checked)
{
m_bSelectSub = checked;
ui->comboBoxSelectTopic->setEnabled(checked);
}
void WidgetMQTT::AddToptic(QString strToptic)
{
foreach (QString strT, m_listTopic)
{
if (strT == strToptic)
{
return;
}
}
m_listTopic.insert(0, strToptic);
UpdateList();
}
void WidgetMQTT::slotButtonDown()
{
QPushButton* button = qobject_cast<QPushButton*>(sender());
if (button == ui->pushButtonConnect)
{
MosConnect();
}
else if (button == ui->pushButtonSubscribe)
{
if (m_pMqttDealer->IsOpen() &&
ui->lineEditTopic->text() != "" &&
m_pMqttDealer->Subcribe(ui->lineEditTopic->text()))
{
ConfigInfo* conf = ConfigInfo::GetInstance();
conf->m_strCurTopic = ui->lineEditTopic->text();
conf->writeConfig();
AddToptic(ui->lineEditTopic->text());
UpdateList();
}
}
else if (button == ui->pushButtonDissubscribe)
{
if (m_pMqttDealer->IsOpen() &&
m_listTopic.size() > 0 &&
m_pMqttDealer->Unsubcribe(ui->comboBoxToptic->currentText()))
{
m_listTopic.removeOne(ui->comboBoxToptic->currentText());
UpdateList();
}
}
else if (button == ui->pushButtonClear)
{
ui->plainTextEdit->clear();
m_lRecCnt = 0;
}
for (int i = 0; i < 11; i++)
{
if (ui->lineEditPubish->text() == "")
{
break;
}
QPushButton* pb = m_listButtons.at(i);
if (button == pb)
{
QLineEdit* le = m_listLineEdit.at(i);
if (le->text() == "")
{
continue;
}
QString strSend = le->text();
if (m_bSendHex)
{
QString dd = le->text();
dd.replace(" ", "");
QByteArray array = QString2Hex(dd);
m_pMqttDealer->PublishDataByMQTT(
ui->lineEditPubish->text(),
array);
m_iSendCnt++;
}
else
{
m_pMqttDealer->PublishDataByMQTT(
ui->lineEditPubish->text(),
strSend);
m_iSendCnt++;
}
if (i > 0 && i < 11)
{
ConfigInfo* conf = ConfigInfo::GetInstance();
conf->m_strInfo[i - 1] = le->text();
conf->writeConfigInfo();
}
}
}
if (button == ui->pushButtonTimeSend)
{
m_bTimeSend = !m_bTimeSend;
if (m_bTimeSend)
{
int iT = ui->lineEditTimer->text().toInt() / 10;
m_iTimeCnt = iT < 1 ? 1 : iT;
ui->pushButtonTimeSend->setText("停止发送");
ui->lineEditTimer->setEnabled(false);
}
else
{
ui->pushButtonTimeSend->setText("定时发送");
ui->lineEditTimer->setEnabled(true);
}
}
if (button == ui->pushButtonClearSend)
{
m_iSendCnt = 0;
ui->lineEditSendCnt->setText(QString::number(m_iSendCnt));
}
}