VTrain_BothSides/interface/ToWeb.cpp

237 lines
9.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
}