generated from zhangwei/Matrixai
			
		
			
	
	
		
			237 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			237 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | #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; | |||
|  |     } | |||
|  | 
 | |||
|  | } |