From 5abb482d0cdaa065cb26a11adf0ed0b5df76df8e Mon Sep 17 00:00:00 2001 From: "Mr.V" Date: Wed, 27 Mar 2024 20:09:46 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=9B=B4=E6=96=B0=E4=B8=B2=E5=8F=A3?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E7=BC=93=E5=86=B2=E5=8C=BA=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?1024=202=E3=80=81=E4=BC=98=E5=8C=96=E8=AF=BB=E5=8F=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98=203=E3=80=81?= =?UTF-8?q?=E5=AF=B9=E8=AF=86=E5=88=AB=E7=BB=93=E6=9E=9C=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=BC=82=E6=AD=A5=E5=A4=84=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=8E=A5=E5=8F=A3=E9=98=BB=E5=A1=9E=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=9A=84=E7=95=8C=E9=9D=A2=E5=8D=A1=E9=A1=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Train_RFID/config/config.ini | 20 ----- app/config/config.ini | 10 +-- src/CMakeLists.txt | 2 + src/qt_source/DeleteOldLog.cpp | 19 ---- src/qt_source/DeleteOldLog.h | 20 ----- src/qt_source/mainwindow.cpp | 154 ++++++++++++++++++++++----------- src/qt_source/mainwindow.h | 25 ++++-- src/serial/ComDetect.cpp | 2 + 8 files changed, 132 insertions(+), 120 deletions(-) delete mode 100644 Train_RFID/config/config.ini delete mode 100644 src/qt_source/DeleteOldLog.cpp delete mode 100644 src/qt_source/DeleteOldLog.h diff --git a/Train_RFID/config/config.ini b/Train_RFID/config/config.ini deleted file mode 100644 index 0965dfc..0000000 --- a/Train_RFID/config/config.ini +++ /dev/null @@ -1,20 +0,0 @@ -[base] -com_name=COM2 -baud=19200 -track_name=2 -have_magnet_steel=true -magnet_steel_order=8421 -up_result=false -use_socket_server=true - -[interface] -http_ip=192.168.137.104 -http_port=20004 -token_path=/api/token_path -up_result_path=/api/train-carriage/identification/rfid-save -username=guest_01 -password=d55b0f642e817eea24725d2f2a31dd08 - -[socket_server] -server_ip=172.24.192.1 -server_port=60001 diff --git a/app/config/config.ini b/app/config/config.ini index 0965dfc..dad4d6d 100644 --- a/app/config/config.ini +++ b/app/config/config.ini @@ -4,11 +4,11 @@ baud=19200 track_name=2 have_magnet_steel=true magnet_steel_order=8421 -up_result=false -use_socket_server=true +up_result=true +use_socket_server=false [interface] -http_ip=192.168.137.104 +http_ip=192.168.2.108 http_port=20004 token_path=/api/token_path up_result_path=/api/train-carriage/identification/rfid-save @@ -16,5 +16,5 @@ username=guest_01 password=d55b0f642e817eea24725d2f2a31dd08 [socket_server] -server_ip=172.24.192.1 -server_port=60001 +server_ip=172.18.160.1 +server_port=7000 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1ffacc4..3bb309c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -25,6 +25,7 @@ find_package(Qt5 COMPONENTS Widgets Network SerialPort + Concurrent REQUIRED) #导入Qt的Network配置和在pro文件里面添加QT+=network是一样的 @@ -122,6 +123,7 @@ target_link_libraries(Train_RFID Qt5::Widgets Qt5::Network Qt5::SerialPort + Qt5::Concurrent ) if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) diff --git a/src/qt_source/DeleteOldLog.cpp b/src/qt_source/DeleteOldLog.cpp deleted file mode 100644 index c10f75e..0000000 --- a/src/qt_source/DeleteOldLog.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// -// Created by Mr.V on 2024/3/16. -// - -#include "DeleteOldLog.h" - -void DeleteOldLog::deleteFile() { - QDir dir("./Logs"); - QStringList fileList; - QFileInfoList fileInfoList = dir.entryInfoList(fileList, QDir::Files); - - for (int i = 0; i < fileInfoList.size(); i++) { - QFileInfo info = fileInfoList.at(i); - if (info.birthTime() < QDateTime::currentDateTime().addDays(-10)) - { - QFile::remove(info.absoluteFilePath()); - } - } -} \ No newline at end of file diff --git a/src/qt_source/DeleteOldLog.h b/src/qt_source/DeleteOldLog.h deleted file mode 100644 index e2f3c25..0000000 --- a/src/qt_source/DeleteOldLog.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// Created by Mr.V on 2024/3/16. -// - -#ifndef TRAIN_RFID_DELETEOLDLOG_H -#define TRAIN_RFID_DELETEOLDLOG_H -#include -#include -#include - -class DeleteOldLog { - Q_OBJECT -public: - bool readDeleteConfig(); -public slots: - void deleteFile(); -}; - - -#endif //TRAIN_RFID_DELETEOLDLOG_H diff --git a/src/qt_source/mainwindow.cpp b/src/qt_source/mainwindow.cpp index def2834..37a5cd2 100644 --- a/src/qt_source/mainwindow.cpp +++ b/src/qt_source/mainwindow.cpp @@ -42,10 +42,6 @@ MainWindow::MainWindow(QWidget *parent) { this->logError(errorMessage); } - // 创建菜单栏 -// this->initMenu(); - -// this->ui->testButton->setHidden(true); // 获取本机串口列表 this->getComList(); @@ -71,8 +67,8 @@ MainWindow::MainWindow(QWidget *parent) connect(m_pSystemTray,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason))); this->logRfidRecvName = "./Logs/rfid_data.txt"; - recvLog.setFileName(logRfidRecvName); - recvLog.open(QIODevice::ReadWrite | QIODevice::Append); + this->recvLog.setFileName(logRfidRecvName); + this->recvLog.open(QIODevice::ReadWrite | QIODevice::Append); //初始最小化 //this->showMinimized();//最小化 @@ -147,6 +143,7 @@ MainWindow::MainWindow(QWidget *parent) }); } + ui->openComButton->click(); } MainWindow::~MainWindow() @@ -174,8 +171,9 @@ void MainWindow::logError(const QString& message) { } void MainWindow::initParam() { + this->rfidSourceInfo = ""; this->trainTime = ""; - this->recvLog.close(); + if (this->recvLog.isOpen()) this->recvLog.close(); this->vecTrain.clear(); this->needIdentify = false; this->rnameRfidLog(); @@ -219,12 +217,25 @@ bool MainWindow::mkRfidLog() return false; } +void MainWindow::deleteOldFiles(const QString &path, int days) +{ + QDir dir(path); + foreach(QFileInfo fi, dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot)) + { + if((fi.lastModified().addDays(days) < QDateTime::currentDateTime())) + { + QFile::remove(fi.absoluteFilePath()); + } + } +} + bool MainWindow::rnameRfidLog() { try { this->recvLog.close(); QFile logFile(this->logRfidRecvName); QFileInfo fileInfo(logFile); + if (fileInfo.size() == 0) return false; QString newLogFileName = fileInfo.path() + "/"; newLogFileName.append(QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss")); @@ -235,6 +246,8 @@ bool MainWindow::rnameRfidLog() this->logError("读取RFID原始数据,存储重命名失败!"); return false; } + + this->deleteOldFiles(fileInfo.path(), 3); } catch (const std::exception &e) { this->logError("读取RFID原始数据,存储重命名失败!"); return false; @@ -245,7 +258,6 @@ bool MainWindow::rnameRfidLog() void MainWindow::saveRfidLog(const QString &value) { try { -// QString logValue = "[" + QDateTime::currentDateTime().toString("hh:mm::ss") + "] " + value + "\n"; QString logValue = value + "\n"; if (!this->recvLog.isOpen()) { @@ -334,33 +346,32 @@ QStandardItem* MainWindow::getStandardItem(const QString &value) /******************************同 web 交互****************************************/ + /** * @brief:Http发送RFID数据 * @param:carriageType:车型 * @param:carriageNumber:车号 * @param:carriageOrder:车节号 * @param:time:当前时间 + * @param:rfidSourceInfo:RFID的原始数据(过滤掉了重复磁条信息) * @return: 成功:true * 失败:false */ -bool MainWindow::upWeb(std::string &carriageType, std::string &carriageNumber, std::string &carriageOrder, std::string &time) +bool MainWindow::upWeb(std::string &carriageType, + std::string &carriageNumber, + std::string &carriageOrder, + std::string &time, + std::string &strRfidInfo) { try { - httplib::Client cli(this->interfaceConfig_.httpIp.toStdString(), this->interfaceConfig_.httpPort); - cli.set_connection_timeout(0, 300 * 1000); - cli.set_read_timeout(1,0); - httplib::Headers header; - httplib::Params params; Json::Value arrayObj; //构建对象 - header.emplace("blade-auth", this->webToken); - //header.emplace("Content-Type", "application/json"); - arrayObj["comeTime"] = time; arrayObj["collectTime"] = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz").toStdString(); arrayObj["carriageNumber"] = carriageNumber; arrayObj["carriageType"] = carriageType; arrayObj["carriageOrder"] = carriageOrder; + arrayObj["steel"] = strRfidInfo; Json::Value trainParams; trainParams["poundNo"] = std::to_string(this->baseConfig_.trackName); @@ -370,6 +381,14 @@ bool MainWindow::upWeb(std::string &carriageType, std::string &carriageNumber, s this->logInfo("第" + QString::fromStdString(carriageOrder) + "节,发送web: " + QString::fromStdString(str)); + httplib::Client cli(this->interfaceConfig_.httpIp.toStdString(), this->interfaceConfig_.httpPort); + cli.set_connection_timeout(0, 300 * 1000); + cli.set_read_timeout(1,0); + httplib::Headers header; + httplib::Params params; + header.emplace("blade-auth", this->webToken); + //header.emplace("Content-Type", "application/json"); + auto res = cli.Post(this->interfaceConfig_.upResultPath.toStdString(), header, str, "application/json"); if (res) { @@ -393,9 +412,10 @@ bool MainWindow::upWeb(std::string &carriageType, std::string &carriageNumber, s if (root["msg"].asString() == "请求未授权") { this->logWarn("第" + QString::fromStdString(carriageOrder) + "节,因请求未授权,而上传识别结果失败!重新请求token。"); if (!this->getToken()) return false; - return this->upWeb(carriageType, carriageNumber, carriageOrder, time); + return this->upWeb(carriageType, carriageNumber, carriageOrder, time, strRfidInfo); } - this->logError("第" + QString::fromStdString(carriageOrder) + "节,识别结果上传失败,原因:" + QString::fromStdString(root.asString())); + this->logError("---"); + this->logError("第" + QString::fromStdString(carriageOrder) + "节,识别结果上传失败,原因:" + QString::fromStdString(root["msg"].asString())); } } else @@ -409,7 +429,7 @@ bool MainWindow::upWeb(std::string &carriageType, std::string &carriageNumber, s if (res->status == 401) { this->logWarn("因请求未授权,而上传识别结果失败!重新请求token。"); this->getToken(); - return this->upWeb(carriageType, carriageNumber, carriageOrder, time); + return this->upWeb(carriageType, carriageNumber, carriageOrder, time, strRfidInfo); } } } @@ -437,7 +457,7 @@ bool MainWindow::getToken() { httplib::Client cli(this->interfaceConfig_.httpIp.toStdString(), this->interfaceConfig_.httpPort); cli.set_connection_timeout(0, 300 * 1000); - cli.set_read_timeout(1,0); + cli.set_read_timeout(0,300*1000); httplib::Headers header; httplib::Params params; @@ -470,7 +490,7 @@ bool MainWindow::getToken() } else { - this->logError("获取web token失败,原因:" + QString::fromStdString(root.asString())); + this->logError("获取web token失败,原因:" + QString::fromStdString(res->body)); } } else @@ -576,7 +596,7 @@ void MainWindow::on_ShowMainAction() */ void MainWindow::on_ExitAppAction() { - // 弹出对话框要求用户输入账号和密码 + // 弹出对话框要求用户输入密码 QString password = QInputDialog::getText(this, "密码验证", "请输入密码:", QLineEdit::Password); // 验证账号和密码是否正确 @@ -586,7 +606,6 @@ void MainWindow::on_ExitAppAction() exit(0); } else { QMessageBox::warning(this, "验证失败", "密码不正确!"); - //event->ignore(); // 阻止关闭窗口 } } @@ -631,9 +650,7 @@ void MainWindow::openComClicked() "background-color: rgba(74, 221, 108, 225);\ " "border:1px solid rgba(168, 168, 168, 105);"); connect(this->serial_,&QSerialPort::readyRead,this,&MainWindow::readCom); -// QTimer* timer = new QTimer(this); -// connect(timer, &QTimer::timeout, this, &MainWindow::readCom); -// timer->start(10); + connect(this->serial_, &QSerialPort::errorOccurred, this, &MainWindow::serialPort_error); } @@ -645,16 +662,24 @@ void MainWindow::openComClicked() } else { - if (this->comDetect_.closeCom()) - { - if (this->needIdentify == true) this->needIdentify = false; - this->isOpenCom = false; - this->logInfo("串口已关闭!"); - this->initParam(); - this->ui->openComButton->setText("打开串口"); - this->ui->LEDlabel->setStyleSheet("border-radius: 16px;\ " - "background-color: red;\ " - "border:1px solid rgba(168, 168, 168, 105);"); + // 弹出对话框要求用户输入密码 + QString password = QInputDialog::getText(this, "密码验证", "请输入密码:", QLineEdit::Password); + + // 验证账号和密码是否正确 + if (password == "matrix") { + if (this->comDetect_.closeCom()) + { + if (this->needIdentify == true) this->needIdentify = false; + this->isOpenCom = false; + this->logInfo("串口已关闭!"); + this->initParam(); + this->ui->openComButton->setText("打开串口"); + this->ui->LEDlabel->setStyleSheet("border-radius: 16px;\ " + "background-color: red;\ " + "border:1px solid rgba(168, 168, 168, 105);"); + } + } else { + QMessageBox::warning(this, "验证失败", "密码不正确!"); } } } @@ -680,7 +705,7 @@ void MainWindow::serialPort_error(QSerialPort::SerialPortError error) void MainWindow::readCom() { try { - if (this->serial_->waitForReadyRead(5)) { + if (this->serial_->waitForReadyRead(10)) { QByteArray data = this->serial_->readAll(); // 读取数据 if(!data.isEmpty()) { @@ -710,10 +735,9 @@ void MainWindow::getQueueDataThread() this->tmpRfid.append(strRfidInfo); if (this->tmpRfid.right(1) != "&") { -// this->logDebug("--" + this->tmpRfid + " " + this->tmpRfid.right(1)); return; } -// this->logDebug("--" + this->tmpRfid); + this->tmpRfid = this->tmpRfid.replace("&", ""); QStringList rfidSubList = this->tmpRfid.split("@"); this->tmpRfid = ""; @@ -761,30 +785,42 @@ void MainWindow::getQueueDataThread() int train_order = vecTrain.size(); this->resultTableModel_->setItem(train_order - 1, 0, new QStandardItem(strTrainInfo)); this->logInfo(QString("第%1节 %2").arg(train_order).arg(strTrainInfo)); - emit upRfid_signals(); + // 将接收到的RFID使用@符拼接起来,以待后续上传web + this->rfidSourceInfo.append("@" + i); + QString rfidinfo = this->rfidSourceInfo; + this->rfidSourceInfo = ""; + emit upRfid_signals(rfidinfo); + } } else if (i.size() == 7) { + // 不使用磁钢的情况下 过滤掉磁钢信号 + if (!this->baseConfig_.havaMagnetSteel) continue; // 磁钢信号 QString strFirst = i.left(1); QString strOther = i.mid(1, i.size() - 1); + // 将接收到的RFID使用@符拼接起来,以待后续上传web + this->rfidSourceInfo.append("@" + i); split_lambda(strFirst, strOther); } else if (i.size() == 14) // 特殊情况,来车信号少了&符 { + // 不使用磁钢的情况下 过滤掉磁钢信号 + if (!this->baseConfig_.havaMagnetSteel) continue; for (int j = 0; j < i.size(); j+=7) { QString rfid_cg = i.mid(j, 7); QString strFirst = rfid_cg.left(1); QString strOther = rfid_cg.mid(1, 6); + // 将接收到的RFID使用@符拼接起来,以待后续上传web + this->rfidSourceInfo.append("@" + rfid_cg); split_lambda(strFirst, strOther); } - } } } -void MainWindow::upRfid() +void MainWindow::upRfid(QString rfidInfo) { if (!this->baseConfig_.upResult) return; if (!this->needIdentify && this->baseConfig_.havaMagnetSteel) @@ -804,14 +840,29 @@ void MainWindow::upRfid() info = info.mid(1,info.size() - 1); - std::string carriageType = info.left(6).simplified().toStdString(); - std::string carriageNum = info.mid(6, info.size() - 6).simplified().toStdString(); - std::string nowTime = this->trainTime.toStdString(); - std::string strOrder = QString::number(order).toStdString(); - if (!this->upWeb(carriageType, carriageNum, strOrder, nowTime)) - { - this->logError("第" + QString::fromStdString(strOrder) + "节,识别结果上传失败!"); - } + TrainInfo trainInfo; + trainInfo.carriageType = info.left(6).simplified().toStdString(); + trainInfo.carriageNum = info.mid(6, info.size() - 6).simplified().toStdString(); + trainInfo.strOrder = QString::number(order).toStdString(); + trainInfo.nowTime = this->trainTime.toStdString(); + trainInfo.strRfidInfo = rfidInfo.toStdString(); + + this->queueTrainInfo_.push(trainInfo); + auto up = QtConcurrent::run([=](){ + while (!this->queueTrainInfo_.isEmpty()) + { + TrainInfo trainInfo = this->queueTrainInfo_.pop(); + if (!this->upWeb(trainInfo.carriageType, + trainInfo.carriageNum, + trainInfo.strOrder, + trainInfo.nowTime, + trainInfo.strRfidInfo)) + { + this->logError("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败!"); + } + } + return true; + }); } void MainWindow::IdentifyTypeUpdate() { @@ -821,6 +872,7 @@ void MainWindow::IdentifyTypeUpdate() { { this->logInfo("来车了"); this->mkRfidLog(); + this->vecTrain.clear(); this->needIdentify = true; this->trainTime = this->getSystemTime(); this->resultTableModel_->clear(); diff --git a/src/qt_source/mainwindow.h b/src/qt_source/mainwindow.h index 0ba48d9..1841f2a 100644 --- a/src/qt_source/mainwindow.h +++ b/src/qt_source/mainwindow.h @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -52,6 +53,7 @@ #include "ComDetect.h" #include "TcpClient.h" + QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE @@ -63,18 +65,24 @@ class MainWindow : public QWidget public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); + void logDebug(const QString& message); void logInfo(const QString& message); void logWarn(const QString& message); void logError(const QString& message); bool mkRfidLog(); + void deleteOldFiles(const QString &path, int days); bool rnameRfidLog(); void saveRfidLog(const QString &value); void initParam(); - bool upWeb(std::string &carriageType, std::string &carriageNumber, std::string &carriageOrder, std::string &time); + bool upWeb(std::string &carriageType, + std::string &carriageNumber, + std::string &carriageOrder, + std::string &time, + std::string &rfidSourceInfo); bool getToken(); QString getSystemTime(); @@ -83,8 +91,6 @@ public: QList getComList(); // 将所有串口const 展示在下&拉列表 void initComboBox(); - // 设置菜单项 - void initMenu(); // 创建日志目录 static bool mkLogDir(); // 获取QStandardItem @@ -92,6 +98,13 @@ public: QStandardItem* getStandardItem(const QString &value); private: + struct TrainInfo { + std::string carriageType; + std::string carriageNum; + std::string strOrder; + std::string nowTime; + std::string strRfidInfo; + }; QString trainTime; QString logRfidRecvName; @@ -116,6 +129,8 @@ private: // 整列车识别结果存储 QStringList vecTrain; MQueue queue_{}; // RFID读取的数据队列 + MQueue queueTrainInfo_{}; // RFID读取的磁钢信息队列 + QString rfidSourceInfo; QString tmpRfid; //临时存储的RFID原始数据,用于防止接收的数据不完整 // 识别方向正确标志 @@ -149,14 +164,14 @@ private: signals: void getRfid_signals(); - void upRfid_signals(); + void upRfid_signals(QString rfidInfo); void connect_socket(QString ip, int port); void IdentifyType(); private slots: void openComClicked(); void readCom(); void getQueueDataThread(); - void upRfid(); + void upRfid(QString rfidInfo); void serialPort_error(QSerialPort::SerialPortError error); void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason); void readTestInfo(); diff --git a/src/serial/ComDetect.cpp b/src/serial/ComDetect.cpp index 5a9b6fe..51bf9a3 100644 --- a/src/serial/ComDetect.cpp +++ b/src/serial/ComDetect.cpp @@ -42,6 +42,8 @@ QSerialPort* ComDetect::openCom(const QString &com, int baud) this->serial_->setDataBits(QSerialPort::Data8); //数据位 this->serial_->setStopBits(QSerialPort::OneStop);//停止位,停止位默认选择1位 this->serial_->setFlowControl(QSerialPort::NoFlowControl);// 控制流,默认选择无 + this->serial_->setReadBufferSize(1024); // 设置读取的缓冲区1024字节 + if (this->serial_->open(QSerialPort::ReadWrite)) { this->serial_->clear(QSerialPort::AllDirections);