#include "VideoAuxiliaryEngine.h" using namespace ai_matrix; VideoAuxiliaryEngine::VideoAuxiliaryEngine() {} VideoAuxiliaryEngine::~VideoAuxiliaryEngine() {} APP_ERROR VideoAuxiliaryEngine::Init() { strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0"; strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1"; this->videoAuxiliaryConfig_ = Config::GetIns()->getVideoAuxiliaryConfig(); this->carType_ = "0"; LogInfo << "VideoAuxiliaryEngine Init ok"; return APP_ERR_OK; } APP_ERROR VideoAuxiliaryEngine::DeInit() { this->baseScoket_.Close(); LogInfo << "VideoAuxiliaryEngine DeInit ok"; return APP_ERR_OK; } APP_ERROR VideoAuxiliaryEngine::Process() { int iRet = APP_ERR_OK; if (!this->videoAuxiliaryConfig_.bUseVideoAuxiliary) { return APP_ERR_OK; } this->baseScoket_.Open(); this->baseScoket_.SetPort(this->videoAuxiliaryConfig_.iPort, this->videoAuxiliaryConfig_.strIp); this->baseScoket_.Init(); LogInfo << "视频辅助 服务端IP:" << this->videoAuxiliaryConfig_.strIp << " 端口:" << this->videoAuxiliaryConfig_.iPort; LogInfo << "视频辅助 开启通讯..."; while (!isStop_) { char chbuffer[AEI_COMM_BUFFER_SIZE] = {0}; int nRevSize = 0; memset(chbuffer, 0x00, sizeof(chbuffer)); if (!this->baseScoket_.bRuning()) { LogError << "TCP 连接失败,重启中 ..."; std::shared_ptr pDeviceStatus = std::make_shared(); pDeviceStatus->strDeviceName = "RFID程序"; pDeviceStatus->strDeviceRunningStatus = "正常"; pDeviceStatus->strNetworkStatus = "异常"; pDeviceStatus->strDeviceWarnInfo = "“RFID车号识别”同“视频车号识别”的通讯断开!"; outputQueMap_[strPort1_]->push(std::static_pointer_cast(pDeviceStatus)); usleep(20 * 1000 * 1000); // 20秒后重试 this->baseScoket_.Close(); this->baseScoket_.Open(); this->baseScoket_.Init(); if (this->baseScoket_.bRuning()) { LogInfo << "TCP 连接成功!"; std::shared_ptr pDeviceStatus = std::make_shared(); pDeviceStatus->strDeviceName = "RFID程序"; pDeviceStatus->strDeviceRunningStatus = "正常"; pDeviceStatus->strNetworkStatus = "正常"; pDeviceStatus->strDeviceWarnInfo = "“RFID车号识别”同“视频车号识别”的通讯连接成功!"; outputQueMap_[strPort1_]->push(std::static_pointer_cast(pDeviceStatus)); } continue; } nRevSize = this->baseScoket_.Read(); if (nRevSize <= 0) { this->baseScoket_.Monitor(); continue; } else { memcpy(chbuffer, this->baseScoket_.chbuffer, nRevSize); } this->dealSocketInfo(chbuffer); } return APP_ERR_OK; } bool VideoAuxiliaryEngine::getOrder(const std::string &recv, Json::Value &order) { Json::CharReaderBuilder readerBuilder; std::shared_ptr reader(readerBuilder.newCharReader()); JSONCPP_STRING errs; if (!reader->parse(recv.data(), recv.data() + recv.size(), &order, &errs)) return false; if (order.isArray()) { if (!order.empty()) order = order[0]; return true; } return true; } void VideoAuxiliaryEngine::dealSocketInfo(const std::string &info) { std::string vedioInfo = info; LogInfo << "接收到:" << vedioInfo; StringUtil::getins()->replace_all_distinct(vedioInfo, "}{", "}&{"); std::vector vecJson = StringUtil::getins()->split(vedioInfo, "&"); for (int i = 0; i < vecJson.size(); ++i) { Json::Value feedBack; if (!this->getOrder(vecJson[i], feedBack)) { LogWarn << "接收到视频识别反馈的来车状态信息,未能解析成JSON格式。"; continue; } std::shared_ptr pComeTrainInfo = std::make_shared(); std::string tmpCarType = feedBack.get("type", "").asString(); int iDirection = feedBack.get("direction", 0).asInt(); if (tmpCarType != this->carType_) { if (this->carType_ == "0") { // 来车 pComeTrainInfo->bComeTrain = true; pComeTrainInfo->iDirection = 0; if (iDirection != 0) pComeTrainInfo->iDirection = iDirection; outputQueMap_[strPort0_]->push(pComeTrainInfo); this->carType_ = tmpCarType; LogInfo << "视频辅助-来车了"; } else if (this->carType_ == "1") { // 无车 pComeTrainInfo->bComeTrain = false; pComeTrainInfo->iDirection = 0; outputQueMap_[strPort0_]->push(pComeTrainInfo); this->carType_ = tmpCarType; LogInfo << "视频辅助-火车离开了"; } else { LogWarn << "视频辅助检测来车状态,反馈的来车状态无法识别"; continue; } if (iDirection != 0) { pComeTrainInfo->bComeTrain = true; pComeTrainInfo->iDirection = iDirection; outputQueMap_[strPort0_]->push(pComeTrainInfo); LogInfo << "视频辅助-获得是否需要识别判定" << iDirection; } } else { if (iDirection != 0) { pComeTrainInfo->bComeTrain = true; pComeTrainInfo->iDirection = iDirection; outputQueMap_[strPort0_]->push(pComeTrainInfo); LogInfo << "视频辅助-获得是否需要识别判定" << iDirection; } } } }