Train_Identify_arm/nvidia_ascend_engine/common_engine/DataUploadEngine/DeviceStatusUpSerEngine.cpp

1 line
9.7 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.

/*
* @Author: your name
* @Date: 2023-07-20 17:15:33
* @LastEditors: your name
* @LastEditTime: 2023-07-23 20:09:39
* @Description: file content
* @FilePath: /shigetai_lirs/nvidia_ascend_engine/common_engine/DataUploadEngine/DeviceStatusUpSerEngine.cpp
*
* Copyright © 2022 <Shandong Matrix Software Engineering Co., Ltd>
*/
#include "DeviceStatusUpSerEngine.h"
#include "myutils.h"
DeviceStatusUpSerEngine::DeviceStatusUpSerEngine() {}
DeviceStatusUpSerEngine::~DeviceStatusUpSerEngine() {}
APP_ERROR DeviceStatusUpSerEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
strGetTokenURL_ = MyYaml::GetIns()->GetStringValue("gc_gettoken_url");
strURL_ = MyYaml::GetIns()->GetStringValue("gc_device_status_url");
strPoundNo_ = MyYaml::GetIns()->GetStringValue("atlas_poundno");
LogInfo << "DeviceStatusUpSerEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR DeviceStatusUpSerEngine::DeInit()
{
LogDebug << "curl_easy_cleanup";
curl_easy_cleanup(pCurl_);
/* 这个处理移动到main中 防止多线程调用
LogDebug << "内存清理";
curl_global_cleanup();
*/
LogInfo << "DeviceStatusUpSerEngine DeInit ok";
return APP_ERR_OK;
}
/**
* libcurl回调函数
* inParam : void *pBuffer 回调内容地址
: size_t size 回调单个数据大小
: size_t nmemb 回调数据个数
* outParam: std::string &strResp 返回内容
* return : 回调数据大小
*/
size_t DeviceStatusUpSerEngine::WriteCallBack(void *pBuffer, size_t size, size_t nmemb, std::string &strResp)
{
size_t sizes = size * nmemb;
std::string strTemp((char*)pBuffer, sizes);
strResp += strTemp;
return sizes;
}
/**
* 调用http接口获取token
* inParam :
* outParam: std::string &strBladeAuth 返回的token信息
* return : true:成功; false:失败
*/
bool DeviceStatusUpSerEngine::GetToken(std::string &strBladeAuth)
{
//1. 获得curl操作符
if (nullptr == pCurl_)
{
LogDebug<<"pCurl_ is null, invoke curl_easy_init";
pCurl_ = curl_easy_init();
if (nullptr == pCurl_)
{
LogError << "curl_easy_init failed !";
return false;
}
}
//2. 设置head, 和表单
//设置head信息
struct curl_slist *pHeaderList = nullptr;
pHeaderList = curl_slist_append(pHeaderList, "Authorization:Basic Y2xpZW50X2VudGVycHJpc2U6Y2xpZW50X2VudGVycHJpc2Vfc2VjcmV0");
//设置表单信息
curl_mime *pMultipart = curl_mime_init(pCurl_);
curl_mimepart *pPart = curl_mime_addpart(pMultipart);
curl_mime_name(pPart, "username");
curl_mime_data(pPart, "guest_01", CURL_ZERO_TERMINATED);
pPart = curl_mime_addpart(pMultipart);
curl_mime_name(pPart, "password");
curl_mime_data(pPart, "d55b0f642e817eea24725d2f2a31dd08", CURL_ZERO_TERMINATED);
pPart = curl_mime_addpart(pMultipart);
curl_mime_name(pPart, "tenantId");
curl_mime_data(pPart, "000000", CURL_ZERO_TERMINATED);
pPart = curl_mime_addpart(pMultipart);
curl_mime_name(pPart, "grant_type");
curl_mime_data(pPart, "password", CURL_ZERO_TERMINATED);
curl_easy_setopt(pCurl_, CURLOPT_CONNECTTIMEOUT, 1); //连接超时(1s连接不上服务器返回超时)
curl_easy_setopt(pCurl_, CURLOPT_URL, strGetTokenURL_.c_str()); //设置url
curl_easy_setopt(pCurl_, CURLOPT_HTTPHEADER, pHeaderList); //设置报文头
curl_easy_setopt(pCurl_, CURLOPT_MIMEPOST, pMultipart); //设置表单
//curl_easy_setopt(pCurl_, CURLOPT_POSTFIELDS, strBody.c_str()); //设置post内容
//curl_easy_setopt(pCurl_, CURLOPT_POST, 1); //设置操作为POST(为非0表示post)
curl_easy_setopt(pCurl_, CURLOPT_WRITEFUNCTION, WriteCallBack); //设置回调函数
std::string strResponse;
curl_easy_setopt(pCurl_, CURLOPT_WRITEDATA, &strResponse); //设置回调参数
//3. 执行http请求
CURLcode res = curl_easy_perform(pCurl_);
curl_slist_free_all(pHeaderList); //清除headerlist
curl_mime_free(pMultipart); //清除curl_mime
curl_easy_reset(pCurl_); //重置curl
if (res != CURLE_OK)
{
LogError << " curl_easy_perform fail:" << curl_easy_strerror(res);
return false;
}
//4. 执行成功解析响应内容
Json::CharReaderBuilder readerBuilder;
std::shared_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
Json::Value jvResponse;
JSONCPP_STRING errs;
if (!reader->parse(strResponse.data(), strResponse.data() + strResponse.size(), &jvResponse, &errs))
{
LogError << " response content fail " << strResponse;
return false;
}
LogDebug << "GetToken resp:" << strResponse;
strBladeAuth += jvResponse["token_type"].asString();
strBladeAuth += " ";
strBladeAuth += jvResponse["access_token"].asString();
return true;
}
/**
* 列车信息提交http接口
* inParam : Json::Value &jvRequest 提交内容
* outParam:
* return : true:提交成功; false:提交失败
*/
bool DeviceStatusUpSerEngine::ResultToHttpSrv(Json::Value &jvRequest)
{
//获取token
std::string strBladeAuth("blade-auth:");
if (!GetToken(strBladeAuth))
{
LogError << " GetToken fail ";
return false;
}
LogDebug << "strBladeAuth:" << strBladeAuth;
//1. 获得curl操作符
if (nullptr == pCurl_)
{
LogDebug<<"pCurl_ is null, invoke curl_easy_init";
pCurl_ = curl_easy_init();
if (nullptr == pCurl_)
{
LogError << "curl_easy_init failed !";
return false;
}
}
//2. 设置http请求信息
Json::StreamWriterBuilder jswBuilder;
std::string strRequest = Json::writeString(jswBuilder, jvRequest);
LogDebug << "to http:" << strRequest;
std::string strResponse;
struct curl_slist *pHeaderList = nullptr;
pHeaderList = curl_slist_append(pHeaderList, "Accept:application/json");
pHeaderList = curl_slist_append(pHeaderList, "Content-Type:application/json");
pHeaderList = curl_slist_append(pHeaderList, "charset:utf-8");
pHeaderList = curl_slist_append(pHeaderList, strBladeAuth.c_str());
curl_easy_setopt(pCurl_, CURLOPT_CONNECTTIMEOUT, 1); //连接超时(1s连接不上服务器返回超时)
curl_easy_setopt(pCurl_, CURLOPT_URL, strURL_.c_str()); //设置url
curl_easy_setopt(pCurl_, CURLOPT_HTTPHEADER, pHeaderList); //设置报文头
curl_easy_setopt(pCurl_, CURLOPT_POSTFIELDS, strRequest.c_str()); //设置post内容
curl_easy_setopt(pCurl_, CURLOPT_POST, 1); //设置操作为POST(为非0表示post)
curl_easy_setopt(pCurl_, CURLOPT_WRITEFUNCTION, WriteCallBack); //设置回调函数
curl_easy_setopt(pCurl_, CURLOPT_WRITEDATA, &strResponse); //设置回调参数
//3. 执行http请求
CURLcode res = curl_easy_perform(pCurl_);
curl_slist_free_all(pHeaderList); //清除headerlist
curl_easy_reset(pCurl_); //重置curl
if (res != CURLE_OK)
{
LogError << jvRequest.toStyledString()
<< " curl_easy_perform fail:" << curl_easy_strerror(res);
return false;
}
//4. 执行成功解析响应内容
LogDebug << "设备异常上传结果:" << strResponse;
Json::CharReaderBuilder readerBuilder;
std::shared_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
Json::Value jvResponse;
JSONCPP_STRING errs;
if (!reader->parse(strResponse.data(), strResponse.data() + strResponse.size(), &jvResponse, &errs))
{
LogError << jvRequest.toStyledString()
<< " response content fail " << strResponse;
return false;
}
if (!jvResponse["success"].asBool())
{
LogError << jvRequest.toStyledString()
<< " response fail:" << strResponse;
return false;
}
LogInfo << jvRequest.toStyledString()
<< " post success";
return true;
}
APP_ERROR DeviceStatusUpSerEngine::Process()
{
int iRet = APP_ERR_OK;
if (0 == MyYaml::GetIns()->GetIntValue("gc_http_open"))
{
LogDebug << " gc_http_open value is 0";
return APP_ERR_OK;
}
while (!isStop_)
{
std::shared_ptr<void> pVoidData0 = nullptr;
inputQueMap_[strPort0_]->pop(pVoidData0);
if (nullptr == pVoidData0)
{
usleep(1000); //1ms
//无数据大于1分钟
iNoDataCnt_++;
if (iNoDataCnt_ > (60 * 1000))
{
iNoDataCnt_ = 0;
}
continue;
}
iNoDataCnt_ = 0;
std::shared_ptr<std::string> pWarn = std::static_pointer_cast<std::string>(pVoidData0);
ai_matrix::DataSourceConfig dataSourceConfig = MyYaml::GetIns()->GetDataSourceConfigById(0); //获取摄像机参数
//组装post信息
Json::Value jvRequest;
jvRequest["tainsModule"] = "2"; // 传输模块:0=装车模块,1=超偏载模块,2=车号识别模块,3=web 模块
jvRequest["networkStatus"] = "异常"; //网络状态: 正常/异常
jvRequest["devName"] = "摄像头";// 设备名称
jvRequest["devSn"] = strPoundNo_+"股道";// 设备编码
jvRequest["cpuData"] = "";// CPU 情况
jvRequest["memoryUsage"] = "";// 内存使用情况
jvRequest["devRunningStatus"] = "异常";// 设备运行状态:正常/异常
jvRequest["devCheckResult"] = *pWarn;// 检测结果
jvRequest["devIp"] = dataSourceConfig.strUrl;// 设备 IP
jvRequest["devAccount"] = "";// 设备账号
if (!ResultToHttpSrv(jvRequest))
{
LogError << "摄像头异常状态上传服务器失败!";
}
}
return APP_ERR_OK;
}