VTrain/interface/ToWeb.cpp

237 lines
9.9 KiB
C++
Raw Permalink Normal View History

2024-11-27 12:47:45 +00:00
#include "ToWeb.h"
namespace ai_matrix
{
const int TIME_DIFF = 28800; // 8 hour
ToWeb *ToWeb::ins = nullptr;
ToWeb::GarbageCollector ToWeb::gc;
std::mutex ToWeb::mx;
ToWeb *ToWeb::getins()
{
//双层锁,确保线程安全
if (ins == nullptr)
{
std::lock_guard<std::mutex> guard(mx); //防止异常发生不能解锁
if (ins == nullptr)
{
ins = new ToWeb();
}
}
return ins;
}
void ToWeb::setConfig(const HttpServerConfig &httpConfig) {
this->httpConfig_ = httpConfig;
}
bool ToWeb::getToken() {
try
{
httplib::Client cli(this->httpConfig_.strIp, this->httpConfig_.iPort);
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->httpConfig_.strUserName);
params.emplace("password", this->httpConfig_.strPassword);
params.emplace("tenantId", "000000");
params.emplace("grant_type", "password");
auto res = cli.Post(this->httpConfig_.strTokenUrl, 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());
LogInfo << "已获取到web token";
return true;
}
else
{
LogError << "获取web token失败原因" << res->body;
}
}
else
{
LogError << "获取web token返回数据解析异常返回数据非json。详细" << res->body;
}
}
}
else
{
auto err = res.error();
// if (err == httplib::Error::Connection) {
// std::cout << " (连接出错)" << std::endl;
// }
LogError << "获取web token失败请检查网络或请求地址。详细" << to_string(err);
}
}
catch (std::exception &e)
{
LogError << "获取授权失败,原因:";
LogError << e.what();
}
return false;
}
bool ToWeb::upWeb(const Json::Value &jvRequest, int retransmission) {
try {
Json::StreamWriterBuilder writer;
std::string str = Json::writeString(writer, jvRequest);
LogInfo << "" << jvRequest["carriageOrder"].asInt() << "发送web: " << str;
httplib::Client cli(this->httpConfig_.strIp, this->httpConfig_.iPort);
cli.set_connection_timeout(0, 300 * 1000);
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->httpConfig_.strUpResultUrl, header, str, "application/json");
if (res)
{
if (res->status == 200)
{
LogInfo << "" << jvRequest["carriageOrder"].asInt() << "web返回: " << 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() == "请求未授权") {
LogWarn << "" << jvRequest["carriageOrder"].asInt() << "因请求未授权而上传识别结果失败重新请求token。";
if (!this->getToken()) return false;
return this->upWeb(jvRequest, retransmission);
}
LogError << "" << jvRequest["carriageOrder"].asInt() << "节,识别结果上传失败,原因:" << root["msg"].asString();
}
}
else
{
LogError << "" << jvRequest["carriageOrder"].asInt() << "识别结果上传失败返回数据解析异常返回数据非json" + res->body;
}
}
else
{
LogError << "" << jvRequest["carriageOrder"].asInt() << "节,识别结果上传失败,原因:" << res->status << " - " << res->body;
if (res->status == 401) {
LogWarn << "因请求未授权而上传识别结果失败重新请求token。";
this->getToken();
return this->upWeb(jvRequest, retransmission);
}
}
}
else
{
LogError << "" << jvRequest["carriageOrder"].asInt() << "节,上传数据失败(超时),请检查网络,或者上传地址!计划重新上传次数:" << retransmission;
if (retransmission > 0) return this->upWeb(jvRequest, --retransmission);
}
}
catch (std::exception &e)
{
LogError << "" << jvRequest["carriageOrder"].asInt() << "节,上传识别结果失败,原因:";
LogError << e.what();
}
return false;
}
bool ToWeb::upDeviceStatus(const Json::Value &jvRequest, int retransmission) {
try {
Json::StreamWriterBuilder writer;
std::string str = Json::writeString(writer, jvRequest);
LogInfo << "设备状态报警发送web: " << str;
httplib::Client cli(this->httpConfig_.strIp, this->httpConfig_.iPort);
cli.set_connection_timeout(0, 300 * 1000);
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->httpConfig_.strUpDeviceStatusUrl, header, str, "application/json");
if (res)
{
if (res->status == 200)
{
LogInfo << "设备状态报警web返回: " << 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() == "请求未授权") {
LogWarn << "设备状态报警因请求未授权而上传识别状态失败重新请求token。";
if (!this->getToken()) return false;
return this->upDeviceStatus(jvRequest, retransmission);
}
LogError << "设备状态报警,识别状态上传失败,原因:" << root["msg"].asString();
}
}
else
{
LogError << "设备状态报警识别状态上传失败返回数据解析异常返回数据非json" + res->body;
}
}
else
{
LogError << "设备状态报警,识别状态上传失败,原因:" << res->status << " - " << res->body;
if (res->status == 401) {
LogWarn << "因请求未授权而上传识别状态失败重新请求token。";
this->getToken();
return this->upDeviceStatus(jvRequest, retransmission);
}
}
}
else
{
LogError << "设备状态报警,上传数据失败(超时),请检查网络,或者上传地址!计划重新上传次数:" << retransmission;
if (retransmission > 0) return this->upDeviceStatus(jvRequest, --retransmission);
}
}
catch (std::exception &e)
{
LogError << "设备状态报警,上传识别状态失败,原因:";
LogError << e.what();
}
return false;
}
}