parent
0be507724f
commit
6e6113c48a
|
|
@ -8,7 +8,7 @@ up_result=true
|
||||||
use_socket_server=false
|
use_socket_server=false
|
||||||
|
|
||||||
[interface]
|
[interface]
|
||||||
http_ip=192.168.2.108
|
http_ip=192.168.2.212
|
||||||
http_port=20004
|
http_port=20004
|
||||||
token_path=/api/token_path
|
token_path=/api/token_path
|
||||||
up_result_path=/api/train-carriage/identification/rfid-save
|
up_result_path=/api/train-carriage/identification/rfid-save
|
||||||
|
|
@ -16,5 +16,5 @@ username=guest_01
|
||||||
password=d55b0f642e817eea24725d2f2a31dd08
|
password=d55b0f642e817eea24725d2f2a31dd08
|
||||||
|
|
||||||
[socket_server]
|
[socket_server]
|
||||||
server_ip=172.18.160.1
|
server_ip=192.168.2.212
|
||||||
server_port=7000
|
server_port=7000
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ find_package(Qt5 COMPONENTS
|
||||||
QT5_WRAP_CPP(MOC_Files
|
QT5_WRAP_CPP(MOC_Files
|
||||||
qt_source/mainwindow.h
|
qt_source/mainwindow.h
|
||||||
interface/TcpClient.h
|
interface/TcpClient.h
|
||||||
|
threads/UpResultThread.h
|
||||||
)
|
)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
|
|
@ -102,6 +103,8 @@ file(GLOB_RECURSE COMMON_SRCS_LISTS
|
||||||
ConfigUtil/*.cpp
|
ConfigUtil/*.cpp
|
||||||
# interface
|
# interface
|
||||||
interface/*.cpp
|
interface/*.cpp
|
||||||
|
# threads
|
||||||
|
threads/*.cpp
|
||||||
# 串口信息处理逻辑
|
# 串口信息处理逻辑
|
||||||
serial/*.cpp
|
serial/*.cpp
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -17,5 +17,20 @@
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
#include "StringUtil.h"
|
#include "StringUtil.h"
|
||||||
|
|
||||||
|
namespace ai_matrix {
|
||||||
|
const QString g_config_path = "./config/config.ini";
|
||||||
|
|
||||||
|
struct TrainInfo {
|
||||||
|
std::string carriageType;
|
||||||
|
std::string carriageNum;
|
||||||
|
std::string strOrder;
|
||||||
|
std::string trainTime;
|
||||||
|
std::string collectTime;
|
||||||
|
std::string strRfidInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif //TRAIN_RFID_COMMON_H
|
#endif //TRAIN_RFID_COMMON_H
|
||||||
|
|
|
||||||
20
src/main.cpp
20
src/main.cpp
|
|
@ -3,6 +3,25 @@
|
||||||
#include "TcpClient.h"
|
#include "TcpClient.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
void myMessageOutput(QtMsgType type, const QMessageLogContext& context, const QString& msg) {
|
||||||
|
switch (type) {
|
||||||
|
case QtDebugMsg:
|
||||||
|
// 处理debug信息
|
||||||
|
break;
|
||||||
|
case QtWarningMsg:
|
||||||
|
// 处理警告信息
|
||||||
|
break;
|
||||||
|
case QtCriticalMsg:
|
||||||
|
// 处理严重错误信息
|
||||||
|
LogError<<"严重异常";
|
||||||
|
break;
|
||||||
|
case QtFatalMsg:
|
||||||
|
// 处理致命错误信息
|
||||||
|
LogError<<"致命异常";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
@ -40,6 +59,7 @@ int main(int argc, char *argv[]) {
|
||||||
{
|
{
|
||||||
SetConsoleOutputCP(CP_UTF8);
|
SetConsoleOutputCP(CP_UTF8);
|
||||||
QApplication::setWindowIcon(QIcon("./logo.ico"));
|
QApplication::setWindowIcon(QIcon("./logo.ico"));
|
||||||
|
qInstallMessageHandler(myMessageOutput);
|
||||||
MainWindow w;
|
MainWindow w;
|
||||||
w.show();
|
w.show();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -152,42 +152,13 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
|
|
||||||
ui->openComButton->click();
|
ui->openComButton->click();
|
||||||
|
|
||||||
// QThread *thread = new QThread;
|
this->upResultThread = new UpResultThread(&this->queueTrainInfo_, &this->iDirection, this);
|
||||||
// // 创建并移至线程的lambda表达式
|
this->upResultThread->start();
|
||||||
// moveToThread(thread);
|
|
||||||
// connect(thread, &QThread::started, [=]() {
|
connect(this->upResultThread, &UpResultThread::DebugSignals, this, &MainWindow::DebugSlots);
|
||||||
//// // 配置文件读取
|
connect(this->upResultThread, &UpResultThread::InfoSignals, this, &MainWindow::InfoSlots);
|
||||||
//// QString errorMessage = "";
|
connect(this->upResultThread, &UpResultThread::WarnSignals, this, &MainWindow::WarnSlots);
|
||||||
//// ai_matrix::BaseConfig baseConfig;
|
connect(this->upResultThread, &UpResultThread::ErrorSignals, this, &MainWindow::ErrorSlots);
|
||||||
//// ai_matrix::InterfaceConfig interfaceConfig;
|
|
||||||
//// if (!ConfigUtil::readBaseConfig(this->configPath_, errorMessage, baseConfig))
|
|
||||||
//// {
|
|
||||||
//// this->logError(errorMessage);
|
|
||||||
//// }
|
|
||||||
//// if (!ConfigUtil::readInterfaceConfig(this->configPath_, errorMessage, interfaceConfig))
|
|
||||||
//// {
|
|
||||||
//// this->logError(errorMessage);
|
|
||||||
//// }
|
|
||||||
//
|
|
||||||
// while (true)
|
|
||||||
// {
|
|
||||||
//// if ((this->iDirection == 0 && this->queueTrainInfo_.size() <= 4) || this->iDirection < 0) continue;
|
|
||||||
// while (!this->queueTrainInfo_.isEmpty())
|
|
||||||
// {
|
|
||||||
// TrainInfo trainInfo_ = this->queueTrainInfo_.pop();
|
|
||||||
// if (!this->upWeb(trainInfo_))
|
|
||||||
// {
|
|
||||||
// //this->logError("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败!");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//// QThread::msleep(1000);
|
|
||||||
// }
|
|
||||||
// QThread::msleep(2000);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// connect(thread, &QThread::finished, thread, &QObject::deleteLater);
|
|
||||||
// thread->start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
|
|
@ -389,175 +360,6 @@ QStandardItem* MainWindow::getStandardItem(const QString &value)
|
||||||
return resultTableItem;
|
return resultTableItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************同 web 交互****************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief:Http发送RFID数据
|
|
||||||
* @param:carriageType:车型
|
|
||||||
* @param:carriageNumber:车号
|
|
||||||
* @param:carriageOrder:车节号
|
|
||||||
* @param:time:当前时间
|
|
||||||
* @param:rfidSourceInfo:RFID的原始数据(过滤掉了重复磁条信息)
|
|
||||||
* @return: 成功:true
|
|
||||||
* 失败:false
|
|
||||||
*/
|
|
||||||
bool MainWindow::upWeb(TrainInfo &trainInfo)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
Json::Value arrayObj; //构建对象
|
|
||||||
|
|
||||||
arrayObj["comeTime"] = trainInfo.trainTime;
|
|
||||||
arrayObj["collectTime"] = trainInfo.collectTime;
|
|
||||||
arrayObj["carriageNumber"] = trainInfo.carriageNum;
|
|
||||||
arrayObj["carriageType"] = trainInfo.carriageType;
|
|
||||||
arrayObj["carriageOrder"] = trainInfo.strOrder;
|
|
||||||
// arrayObj["steel"] = trainInfo.strRfidInfo;
|
|
||||||
|
|
||||||
Json::Value trainParams;
|
|
||||||
trainParams["poundNo"] = std::to_string(this->baseConfig_.trackName);
|
|
||||||
arrayObj["trainParams"] = trainParams;
|
|
||||||
Json::StreamWriterBuilder writer;
|
|
||||||
std::string str = Json::writeString(writer, arrayObj);
|
|
||||||
|
|
||||||
this->logInfo("第" + QString::fromStdString(trainInfo.strOrder) + "节,发送web: " + QString::fromStdString(str));
|
|
||||||
httplib::Client cli(this->interfaceConfig_.httpIp.toStdString(), this->interfaceConfig_.httpPort);
|
|
||||||
|
|
||||||
cli.set_connection_timeout(3, 0);
|
|
||||||
cli.set_read_timeout(0, 700 * 1000);
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
if (res->status == 200)
|
|
||||||
{
|
|
||||||
this->logInfo("第" + QString::fromStdString(trainInfo.strOrder) + "节,web返回: " + QString::fromStdString(res->body));
|
|
||||||
Json::CharReaderBuilder readerBuilder;
|
|
||||||
std::istringstream iss(res->body);
|
|
||||||
Json::Value root;
|
|
||||||
std::string errs;
|
|
||||||
bool parsingSuccessful = Json::parseFromStream(readerBuilder, iss, &root, &errs);
|
|
||||||
if (parsingSuccessful)
|
|
||||||
{
|
|
||||||
if (root["success"].asBool())
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
if (root["msg"].asString() == "请求未授权") {
|
|
||||||
this->logWarn("第" + QString::fromStdString(trainInfo.strOrder) + "节,因请求未授权,而上传识别结果失败!重新请求token。");
|
|
||||||
if (!this->getToken()) return false;
|
|
||||||
return this->upWeb(trainInfo);
|
|
||||||
}
|
|
||||||
this->logError("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败,原因:" + QString::fromStdString(root["msg"].asString()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this->logError("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败,返回数据解析异常,返回数据非json:" + QString::fromStdString(res->body));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this->logError("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败,原因:" + QString::number(res->status) + " - " + QString::fromStdString(res->body));
|
|
||||||
if (res->status == 401) {
|
|
||||||
this->logWarn("因请求未授权,而上传识别结果失败!重新请求token。");
|
|
||||||
this->getToken();
|
|
||||||
return this->upWeb(trainInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this->logError("第" + QString::fromStdString(trainInfo.strOrder) + "节,上传数据失败,请检查网络,或者上传地址!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (std::exception &e)
|
|
||||||
{
|
|
||||||
this->logError("第" + QString::fromStdString(trainInfo.strOrder) + "节,上传识别结果失败,原因:");
|
|
||||||
this->logError(e.what());
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief:Http获取授权
|
|
||||||
* @param:
|
|
||||||
* @return:
|
|
||||||
*/
|
|
||||||
bool MainWindow::getToken()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
httplib::Client cli(this->interfaceConfig_.httpIp.toStdString(), this->interfaceConfig_.httpPort);
|
|
||||||
cli.set_connection_timeout(0, 300 * 1000);
|
|
||||||
cli.set_read_timeout(0,300*1000);
|
|
||||||
httplib::Headers header;
|
|
||||||
httplib::Params params;
|
|
||||||
|
|
||||||
header.emplace("Authorization", "Basic Y2xpZW50X2VudGVycHJpc2U6Y2xpZW50X2VudGVycHJpc2Vfc2VjcmV0");
|
|
||||||
|
|
||||||
params.emplace("username", this->interfaceConfig_.username.toStdString());
|
|
||||||
params.emplace("password", this->interfaceConfig_.password.toStdString());
|
|
||||||
params.emplace("tenantId", "000000");
|
|
||||||
params.emplace("grant_type", "password");
|
|
||||||
auto res = cli.Post("/api/blade-auth/oauth/token", header, params);
|
|
||||||
if (res)
|
|
||||||
{
|
|
||||||
if (res->status == 200)
|
|
||||||
{
|
|
||||||
Json::CharReaderBuilder readerBuilder;
|
|
||||||
std::istringstream iss(res->body);
|
|
||||||
Json::Value root;
|
|
||||||
std::string errs;
|
|
||||||
bool parsingSuccessful = Json::parseFromStream(readerBuilder, iss, &root, &errs);
|
|
||||||
|
|
||||||
if (parsingSuccessful)
|
|
||||||
{
|
|
||||||
if (!root.get("token_type", "").asString().empty())
|
|
||||||
{
|
|
||||||
this->webToken = root["token_type"].asString();
|
|
||||||
this->webToken.append(" ");
|
|
||||||
this->webToken.append(root["access_token"].asString());
|
|
||||||
this->logInfo("已获取到web token");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this->logError("获取web token失败,原因:" + QString::fromStdString(res->body));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this->logError("获取web token返回数据解析异常,返回数据非json。详细:" + QString::fromStdString(res->body));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
auto err = res.error();
|
|
||||||
// if (err == httplib::Error::Connection) {
|
|
||||||
// std::cout << " (连接出错)" << std::endl;
|
|
||||||
// }
|
|
||||||
this->logError("获取web token失败!请检查网络或请求地址。详细:" + QString::fromStdString(to_string(err)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (std::exception &e)
|
|
||||||
{
|
|
||||||
this->logError("获取授权失败,原因:");
|
|
||||||
this->logError(e.what());
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***************************最小化相关****************************************/
|
/***************************最小化相关****************************************/
|
||||||
/**
|
/**
|
||||||
* @brief:接收最小化信号
|
* @brief:接收最小化信号
|
||||||
|
|
@ -630,26 +432,6 @@ void MainWindow::on_ShowMainAction()
|
||||||
this->activateWindow();
|
this->activateWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief:最小化
|
|
||||||
* @param:
|
|
||||||
* @return:空
|
|
||||||
*/
|
|
||||||
void MainWindow::on_ExitAppAction()
|
|
||||||
{
|
|
||||||
// 弹出对话框要求用户输入密码
|
|
||||||
QString password = QInputDialog::getText(this, "密码验证", "请输入密码:", QLineEdit::Password);
|
|
||||||
|
|
||||||
// 验证账号和密码是否正确
|
|
||||||
if (password == "matrix") {
|
|
||||||
this->initParam();
|
|
||||||
this->tcp_->close();
|
|
||||||
exit(0);
|
|
||||||
} else {
|
|
||||||
QMessageBox::warning(this, "验证失败", "密码不正确!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
|
void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
|
||||||
{
|
{
|
||||||
switch(reason){
|
switch(reason){
|
||||||
|
|
@ -895,17 +677,6 @@ void MainWindow::upRfid(QString rfidInfo)
|
||||||
trainInfo.strRfidInfo = rfidInfo.toStdString();
|
trainInfo.strRfidInfo = rfidInfo.toStdString();
|
||||||
|
|
||||||
this->queueTrainInfo_.push(trainInfo);
|
this->queueTrainInfo_.push(trainInfo);
|
||||||
// QtConcurrent::run([=](){
|
|
||||||
if ((this->iDirection == 0 && this->queueTrainInfo_.size() <= 4) || this->iDirection < 0) return;
|
|
||||||
while (!this->queueTrainInfo_.isEmpty())
|
|
||||||
{
|
|
||||||
TrainInfo trainInfo_ = this->queueTrainInfo_.pop();
|
|
||||||
if (!this->upWeb(trainInfo_))
|
|
||||||
{
|
|
||||||
//this->logError("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::IdentifyTypeUpdate() {
|
void MainWindow::IdentifyTypeUpdate() {
|
||||||
|
|
@ -929,6 +700,22 @@ void MainWindow::IdentifyTypeUpdate() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::DebugSlots(const QString &info) {
|
||||||
|
this->logDebug(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::InfoSlots(const QString &info) {
|
||||||
|
this->logInfo(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::WarnSlots(const QString &info) {
|
||||||
|
this->logWarn(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::ErrorSlots(const QString &info) {
|
||||||
|
this->logError(info);
|
||||||
|
}
|
||||||
|
|
||||||
// ============================= 测试 ====================================
|
// ============================= 测试 ====================================
|
||||||
|
|
||||||
void MainWindow::readTestInfo()
|
void MainWindow::readTestInfo()
|
||||||
|
|
|
||||||
|
|
@ -52,11 +52,13 @@
|
||||||
#include "ConfigUtil.h"
|
#include "ConfigUtil.h"
|
||||||
#include "ComDetect.h"
|
#include "ComDetect.h"
|
||||||
#include "TcpClient.h"
|
#include "TcpClient.h"
|
||||||
|
#include "../threads/UpResultThread.h"
|
||||||
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
namespace Ui { class MainWindow; }
|
namespace Ui { class MainWindow; }
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
using namespace ai_matrix;
|
||||||
|
|
||||||
class MainWindow : public QWidget
|
class MainWindow : public QWidget
|
||||||
{
|
{
|
||||||
|
|
@ -93,14 +95,8 @@ public:
|
||||||
QStandardItem* getStandardItem(const QString &value);
|
QStandardItem* getStandardItem(const QString &value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct TrainInfo {
|
|
||||||
std::string carriageType;
|
UpResultThread *upResultThread;
|
||||||
std::string carriageNum;
|
|
||||||
std::string strOrder;
|
|
||||||
std::string trainTime;
|
|
||||||
std::string collectTime;
|
|
||||||
std::string strRfidInfo;
|
|
||||||
};
|
|
||||||
QString trainTime;
|
QString trainTime;
|
||||||
|
|
||||||
QString logRfidRecvName;
|
QString logRfidRecvName;
|
||||||
|
|
@ -142,9 +138,6 @@ private:
|
||||||
|
|
||||||
TcpClient* tcpClient;
|
TcpClient* tcpClient;
|
||||||
|
|
||||||
bool upWeb(TrainInfo &trainInfo);
|
|
||||||
bool getToken();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QTcpSocket* tcp_ = nullptr;
|
QTcpSocket* tcp_ = nullptr;
|
||||||
QStatusBar* statusBar;
|
QStatusBar* statusBar;
|
||||||
|
|
@ -159,7 +152,6 @@ private:
|
||||||
void creat_action();
|
void creat_action();
|
||||||
void changeEvent(QEvent *event);
|
void changeEvent(QEvent *event);
|
||||||
void on_ShowMainAction();
|
void on_ShowMainAction();
|
||||||
void on_ExitAppAction();
|
|
||||||
void closeEvent(QCloseEvent *event);
|
void closeEvent(QCloseEvent *event);
|
||||||
void creat_menu();
|
void creat_menu();
|
||||||
|
|
||||||
|
|
@ -178,6 +170,11 @@ private slots:
|
||||||
void readTestInfo();
|
void readTestInfo();
|
||||||
void IdentifyTypeUpdate();
|
void IdentifyTypeUpdate();
|
||||||
|
|
||||||
|
void DebugSlots(const QString &info);
|
||||||
|
void InfoSlots(const QString &info);
|
||||||
|
void WarnSlots(const QString &info);
|
||||||
|
void ErrorSlots(const QString &info);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,206 @@
|
||||||
|
//
|
||||||
|
// Created by Mr.V on 2024/4/3.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "UpResultThread.h"
|
||||||
|
|
||||||
|
|
||||||
|
UpResultThread::UpResultThread(MQueue<TrainInfo> *queueTrainInfo, int *iDirection, QObject *parent) :
|
||||||
|
QThread(parent)
|
||||||
|
{
|
||||||
|
this->queueTrainInfo_ = queueTrainInfo;
|
||||||
|
this->iDirection = iDirection;
|
||||||
|
|
||||||
|
// 配置文件读取
|
||||||
|
QString errorMessage = "";
|
||||||
|
if (!ConfigUtil::readBaseConfig(g_config_path, errorMessage, this->baseConfig_))
|
||||||
|
{
|
||||||
|
this->ErrorSignals(errorMessage);
|
||||||
|
}
|
||||||
|
if (!ConfigUtil::readInterfaceConfig(g_config_path, errorMessage, this->interfaceConfig_))
|
||||||
|
{
|
||||||
|
this->ErrorSignals(errorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpResultThread::run()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
// if ((*this->iDirection == 0 && this->queueTrainInfo_->size() <= 4) || *this->iDirection < 0) continue;
|
||||||
|
|
||||||
|
while (!this->queueTrainInfo_->isEmpty())
|
||||||
|
{
|
||||||
|
TrainInfo trainInfo_ = this->queueTrainInfo_->pop();
|
||||||
|
if (!this->upWeb(trainInfo_))
|
||||||
|
{
|
||||||
|
//this->logError("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QThread::sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief:Http发送RFID数据
|
||||||
|
* @param:carriageType:车型
|
||||||
|
* @param:carriageNumber:车号
|
||||||
|
* @param:carriageOrder:车节号
|
||||||
|
* @param:time:当前时间
|
||||||
|
* @param:rfidSourceInfo:RFID的原始数据(过滤掉了重复磁条信息)
|
||||||
|
* @return: 成功:true
|
||||||
|
* 失败:false
|
||||||
|
*/
|
||||||
|
bool UpResultThread::upWeb(TrainInfo &trainInfo)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Json::Value arrayObj; //构建对象
|
||||||
|
|
||||||
|
arrayObj["comeTime"] = trainInfo.trainTime;
|
||||||
|
arrayObj["collectTime"] = trainInfo.collectTime;
|
||||||
|
arrayObj["carriageNumber"] = trainInfo.carriageNum;
|
||||||
|
arrayObj["carriageType"] = trainInfo.carriageType;
|
||||||
|
arrayObj["carriageOrder"] = trainInfo.strOrder;
|
||||||
|
arrayObj["steel"] = trainInfo.strRfidInfo;
|
||||||
|
|
||||||
|
Json::Value trainParams;
|
||||||
|
trainParams["poundNo"] = std::to_string(this->baseConfig_.trackName);
|
||||||
|
arrayObj["trainParams"] = trainParams;
|
||||||
|
Json::StreamWriterBuilder writer;
|
||||||
|
std::string str = Json::writeString(writer, arrayObj);
|
||||||
|
|
||||||
|
this->InfoSignals("第" + QString::fromStdString(trainInfo.strOrder) + "节,发送web: " + QString::fromStdString(str));
|
||||||
|
httplib::Client cli(this->interfaceConfig_.httpIp.toStdString(), this->interfaceConfig_.httpPort);
|
||||||
|
|
||||||
|
cli.set_connection_timeout(3, 0);
|
||||||
|
cli.set_read_timeout(3, 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)
|
||||||
|
{
|
||||||
|
if (res->status == 200)
|
||||||
|
{
|
||||||
|
this->InfoSignals("第" + QString::fromStdString(trainInfo.strOrder) + "节,web返回: " + QString::fromStdString(res->body));
|
||||||
|
Json::CharReaderBuilder readerBuilder;
|
||||||
|
std::istringstream iss(res->body);
|
||||||
|
Json::Value root;
|
||||||
|
std::string errs;
|
||||||
|
bool parsingSuccessful = Json::parseFromStream(readerBuilder, iss, &root, &errs);
|
||||||
|
if (parsingSuccessful)
|
||||||
|
{
|
||||||
|
if (root["success"].asBool())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
if (root["msg"].asString() == "请求未授权") {
|
||||||
|
this->WarnSignals("第" + QString::fromStdString(trainInfo.strOrder) + "节,因请求未授权,而上传识别结果失败!重新请求token。");
|
||||||
|
if (!this->getToken()) return false;
|
||||||
|
return this->upWeb(trainInfo);
|
||||||
|
}
|
||||||
|
this->ErrorSignals("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败,原因:" + QString::fromStdString(root["msg"].asString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->ErrorSignals("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败,返回数据解析异常,返回数据非json:" + QString::fromStdString(res->body));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->ErrorSignals("第" + QString::fromStdString(trainInfo.strOrder) + "节,识别结果上传失败,原因:" + QString::number(res->status) + " - " + QString::fromStdString(res->body));
|
||||||
|
if (res->status == 401) {
|
||||||
|
this->WarnSignals("因请求未授权,而上传识别结果失败!重新请求token。");
|
||||||
|
this->getToken();
|
||||||
|
return this->upWeb(trainInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->ErrorSignals("第" + QString::fromStdString(trainInfo.strOrder) + "节,上传数据失败,请检查网络,或者上传地址!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (std::exception &e)
|
||||||
|
{
|
||||||
|
this->ErrorSignals("第" + QString::fromStdString(trainInfo.strOrder) + "节,上传识别结果失败,原因:" + QString::fromStdString(e.what()));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief:Http获取授权
|
||||||
|
* @param:
|
||||||
|
* @return:
|
||||||
|
*/
|
||||||
|
bool UpResultThread::getToken()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
httplib::Client cli(this->interfaceConfig_.httpIp.toStdString(), this->interfaceConfig_.httpPort);
|
||||||
|
cli.set_connection_timeout(0, 300 * 1000);
|
||||||
|
cli.set_read_timeout(0,300*1000);
|
||||||
|
httplib::Headers header;
|
||||||
|
httplib::Params params;
|
||||||
|
|
||||||
|
header.emplace("Authorization", "Basic Y2xpZW50X2VudGVycHJpc2U6Y2xpZW50X2VudGVycHJpc2Vfc2VjcmV0");
|
||||||
|
|
||||||
|
params.emplace("username", this->interfaceConfig_.username.toStdString());
|
||||||
|
params.emplace("password", this->interfaceConfig_.password.toStdString());
|
||||||
|
params.emplace("tenantId", "000000");
|
||||||
|
params.emplace("grant_type", "password");
|
||||||
|
auto res = cli.Post("/api/blade-auth/oauth/token", header, params);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
if (res->status == 200)
|
||||||
|
{
|
||||||
|
Json::CharReaderBuilder readerBuilder;
|
||||||
|
std::istringstream iss(res->body);
|
||||||
|
Json::Value root;
|
||||||
|
std::string errs;
|
||||||
|
bool parsingSuccessful = Json::parseFromStream(readerBuilder, iss, &root, &errs);
|
||||||
|
|
||||||
|
if (parsingSuccessful)
|
||||||
|
{
|
||||||
|
if (!root.get("token_type", "").asString().empty())
|
||||||
|
{
|
||||||
|
this->webToken = root["token_type"].asString();
|
||||||
|
this->webToken.append(" ");
|
||||||
|
this->webToken.append(root["access_token"].asString());
|
||||||
|
this->InfoSignals("已获取到web token");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->ErrorSignals("获取web token失败,原因:" + QString::fromStdString(res->body));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->ErrorSignals("获取web token返回数据解析异常,返回数据非json。详细:" + QString::fromStdString(res->body));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto err = res.error();
|
||||||
|
// if (err == httplib::Error::Connection) {
|
||||||
|
// std::cout << " (连接出错)" << std::endl;
|
||||||
|
// }
|
||||||
|
this->ErrorSignals("获取web token失败!请检查网络或请求地址。详细:" + QString::fromStdString(to_string(err)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (std::exception &e)
|
||||||
|
{
|
||||||
|
this->ErrorSignals("获取授权失败,原因:" + QString::fromStdString(e.what()));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
//
|
||||||
|
// Created by Mr.V on 2024/4/3.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef TRAIN_RFID_UPRESULTTHREAD_H
|
||||||
|
#define TRAIN_RFID_UPRESULTTHREAD_H
|
||||||
|
|
||||||
|
#include <QThread>
|
||||||
|
#include "common.h"
|
||||||
|
#include "MQueue.h"
|
||||||
|
#include "httplib.h"
|
||||||
|
#include "json.h"
|
||||||
|
#include "ConfigUtil.h"
|
||||||
|
|
||||||
|
using namespace ai_matrix;
|
||||||
|
|
||||||
|
class UpResultThread : public QThread{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
~UpResultThread() {};
|
||||||
|
|
||||||
|
UpResultThread(MQueue<TrainInfo> *queueTrainInfo, int *iDirection, QObject *parent = nullptr);
|
||||||
|
|
||||||
|
void run() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
MQueue<TrainInfo> *queueTrainInfo_ = nullptr;
|
||||||
|
int *iDirection;
|
||||||
|
ai_matrix::BaseConfig baseConfig_;
|
||||||
|
ai_matrix::InterfaceConfig interfaceConfig_;
|
||||||
|
std::string webToken; //授权信息
|
||||||
|
|
||||||
|
bool upWeb(TrainInfo &trainInfo);
|
||||||
|
bool getToken();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void DebugSignals(const QString &info);
|
||||||
|
void InfoSignals(const QString &info);
|
||||||
|
void WarnSignals(const QString &info);
|
||||||
|
void ErrorSignals(const QString &info);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //TRAIN_RFID_UPRESULTTHREAD_H
|
||||||
Loading…
Reference in New Issue