// // Created by ps on 18-9-26. // #include "RtspAnalysElement.h" #include using std::string; //RtspAnalysElement::RtspAnalysElement() {} std::string RtspAnalysElement::resetFdfs(std::string ip, unsigned int port, std::string content) { std::thread reset([&]() { fdfsClient.rwLock.rdlock(); if (fdfsClient.fastFds != nullptr) { delete fdfsClient.fastFds; } fdfsClient.fastFds = new FastFds("fastDfsClient.conf"); fdfsClient.rwLock.unlock(); }); reset.detach(); return ""; } RtspAnalysElement::RtspAnalysElement(LDBTool *_dbTool) : m_lDBTool(_dbTool), maxCount(50), currentCount(0) { resetFdfs(); init(); { IMPORT_APP_ARGS; //nsq set callback func DBG("NsqMsgConsumer Init"); string pName(argv[0]); if(argv[0][0] == '.' && argv[0][1] == '/') { string pName(argv[0]+2, argv[0]+strlen(argv[0])); DBG("pName(argv[0]) :" << pName); nsqMsgConsumer = new BasicMsg::Nsq::NsqMsgConsumer("127.0.0.1", "4150", pName, to_string(appPref.getIntData("RpcVTIMPort"))); }else{ string pName(argv[0]); DBG("pName(argv[0]) :" << pName); nsqMsgConsumer = new BasicMsg::Nsq::NsqMsgConsumer("127.0.0.1", "4150", pName, to_string(appPref.getIntData("RpcVTIMPort"))); } nsqMsgConsumer->setMessageCallback(std::bind(&OnMsgFunc, std::placeholders::_1, this)); nsqMsgConsumer->init(); DBG("NsqMsgConsumer Init END!!"); } { // std::thread httpServer([&]() { // //#todo port // HttpSrvRetRecieve httpSrvRetRecieve("0.0.0.0", 12306, 1); // httpSrvRetRecieve.setInfo("^/resetFdfs$", "POST", std::bind(&RtspAnalysElement::resetFdfs, this, // std::placeholders::_1, // std::placeholders::_2, // std::placeholders::_3)); // httpSrvRetRecieve.start(); // httpSrvRetRecieve.waitForShutDown(); // }); // httpServer.detach(); } } #define SETSCORE(VEC, POS, IDENT) appPref.setFloatData(IDENT, POS >= VEC.size() ? 80 : VEC[POS]); //#define GETSCORE(IDENT) appPref.getFloatData(IDENT) == -1 ? 0.1 : appPref.getFloatData(IDENT); static std::string rtspAddrBuild(std::string ip, const int port, std::string username, std::string passwd, std::string brand) { std::string rtsp_url; if (brand == "haikang") { rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) + "/h264/ch1/main/av_stream"; } else if (brand == "dahua") { //rtsp://username:password@ip:port/cam/realmonitor?channel=1&subtype=0 rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) + "/cam/realmonitor?channel=1&subtype=0"; //TODO } else if (brand == "yushi") { rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) + "/video1"; } else { //TODO } return rtsp_url; } void RtspAnalysElement::OnMsgFunc(void *msgPtr, void *pThisPtr) { evnsq::Message *msg = (evnsq::Message *) msgPtr; DBG("Received a message, id=" << msg->id << " message=[" << msg->body.ToString() << "]"); RtspAnalysElement *pthis = (RtspAnalysElement *) pThisPtr; Json::Reader reader; Json::Value value; if (reader.parse(msg->body.ToString(), value)) { auto itor_json_end = value.end(); Json::Value cfg_val; for (auto itor_json = value.begin(); itor_json != itor_json_end; ++itor_json) { //#todo 使用策略模式?发送端多个指令累积后发送? if (itor_json->isString() && reader.parse(itor_json->asString(), cfg_val)) { if (itor_json.name() == "cam_edit" || itor_json.name() == "editSdkRule") { string cam_idx = cfg_val["str_cam_dev_id"].asString(); if (pthis->controllers.find(cam_idx) != pthis->controllers.end()) { if (pthis->m_GB28181_Enable) { auto lst = pthis->m_lDBTool->searchCamDevTableByType(1); for (auto &item : lst) { if (item.str_cam_dev_id.toStdString() != cam_idx)continue; string rtsp_url = "GB28181"; pthis->addCamWithSearchRuleMap(item, rtsp_url); break; } } else { auto lst = pthis->m_lDBTool->searchCamDevTableByType(0); for (auto &item : lst) { if (item.str_cam_dev_id.toStdString() != cam_idx)continue; std::string rtsp_url = rtspAddrBuild(item.str_ip.toStdString(), 554, item.str_username.toStdString(), item.str_password.toStdString(), item.str_brand.toStdString()); pthis->addCamWithSearchRuleMap(item, rtsp_url); break; } } } } else if (itor_json.name() == "cam_del") { string cam_idx = cfg_val["str_cam_dev_id"].asString(); pthis->removeCamera(cam_idx); } } else { DBG("itor value is not string "); continue; } } } else { ERR("Error Message!!"); } } void RtspAnalysElement::init() { m_GB28181_Enable = appPref.getIntData("GB28181_Enable"); Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo(); //#todo GB28181 if (m_GB28181_Enable) { auto lst = m_lDBTool->searchCamDevTableByType(1); appPref.setIntData("n_cut_max_duration", lst_dev.n_cut_max_duration); appPref.setIntData("n_cut_min_duration", lst_dev.n_cut_min_duration); if (lst.size() > 0) { int startCamNO = appPref.getIntData("CamStartNO"); int CamCount = appPref.getIntData("CamEndNO") - appPref.getIntData("CamStartNO") + 1; auto itor = lst.begin(); if (startCamNO >= lst.size()) { ERR("startCamNO > lst.size()"); return; } for (int i = 0; i < startCamNO; i++) { itor++; } for (int i = 0; i < CamCount; i++) { if (itor == lst.end()) { ERR("itor == lst.end()"); return; } auto &item = *itor; string rtsp_url = "GB28181"; addCamWithSearchRuleMap(item, rtsp_url); itor++; } // for (auto &item : lst) { // std::string t_camIdex = item.str_cam_dev_id.toStdString(); // std::string rtsp_url = "GB28181"; // // SdkRuleMap ruleMap = m_lDBTool->searchSdkRuleByCamId(item.str_cam_dev_id); // for (auto &rule:ruleMap) { // // rule.second.strAddr = item.str_addr; // rule.second.weekRuleVec = m_lDBTool->searchCameraWeekRuleByCamId(item.str_cam_dev_id, rule.first); // // if (rule.second.nSdkType == PerStaticSdk) { // float temp = 1 - (float) (rule.second.nThreshold) / 100; // rule.second.fSensitivity = (75 + 25 * temp) / 100; // // } else if (rule.second.nSdkType != FaceSdk) { // float temp = 1 - (float) (rule.second.nThreshold) / 100; // rule.second.fSensitivity = (5 + 90 * temp) / 100; // } // DBG("fSensitivity" << rule.second.fSensitivity); // } // appPref.setStringData(t_camIdex + "rtsp", rtsp_url); // INFO("cam add is " << item.str_addr.toStdString()); // addCamera(t_camIdex, ruleMap); // } } else { ERR("searchCamDevTableAll size is 0"); } } else { auto lst = m_lDBTool->searchCamDevTableByType(0); appPref.setIntData("n_cut_max_duration", lst_dev.n_cut_max_duration); appPref.setIntData("n_cut_min_duration", lst_dev.n_cut_min_duration); if (lst.size() > 0) { int startCamNO = appPref.getIntData("CamStartNO"); int CamCount = appPref.getIntData("CamEndNO") - appPref.getIntData("CamStartNO") + 1; auto itor = lst.begin(); if (startCamNO >= lst.size()) { ERR("startCamNO > lst.size()"); return; } for (int i = 0; i < startCamNO; i++) { itor++; } for (int i = 0; i < CamCount; i++) { if (itor == lst.end()) { ERR("itor == lst.end()"); return; } auto &item = *itor; std::string rtsp_url = rtspAddrBuild(item.str_ip.toStdString(), 554, item.str_username.toStdString(), item.str_password.toStdString(), item.str_brand.toStdString()); addCamWithSearchRuleMap(item, rtsp_url); itor++; } } else { ERR("searchCamDevTableAll size is 0"); } } } void RtspAnalysElement::addCamWithSearchRuleMap(const Record_Cam_Dev &item, string rtsp_url) { string t_camIdex = item.str_cam_dev_id.toStdString(); SdkRuleMap ruleMap = m_lDBTool->searchSdkRuleByCamId(item.str_cam_dev_id); for (auto &rule:ruleMap) { rule.second.strAddr = item.str_addr; rule.second.weekRuleVec = m_lDBTool->searchCameraWeekRuleByCamId(item.str_cam_dev_id, rule.first); if (rule.second.nSdkType == PerStaticSdk) { float temp = 1 - (float) (rule.second.nThreshold) / 100; rule.second.fSensitivity = (75 + 25 * temp) / 100; } else if (rule.second.nSdkType != FaceSdk) { float temp = 1 - (float) (rule.second.nThreshold) / 100; rule.second.fSensitivity = (5 + 90 * temp) / 100; } DBG("fSensitivity" << rule.second.fSensitivity); } appPref.setStringData(t_camIdex + "rtsp", rtsp_url); INFO("cam add is " << item.str_addr.toStdString()); addCamera(t_camIdex, ruleMap); } RtspAnalysElement::~RtspAnalysElement() { for (auto controller: controllers) { delete controller.second; } controllers.clear(); } int RtspAnalysElement::addCamera(const std::string &index, const std::map &sdkRuleMap) { if (controllers.find(index) == controllers.end()) { if (currentCount >= maxCount) { ERR("addCamera faild, camera's num is full!") return -1; } controllers[index] = new AppPipeController(index, sdkRuleMap, true); controllers[index]->setfdfsClient(&fdfsClient); controllers[index]->start(); currentCount++; return 0; } else { removeCamera(index); DBG("removeCamera " << index) return addCamera(index, sdkRuleMap); } } int RtspAnalysElement::removeCamera(const std::string &index) { if (controllers.find(index) == controllers.end())return -1; auto controller = controllers[index]; controller->stop(); controller->wait(); delete controller; controllers.erase(index); currentCount--; return 0; } int RtspAnalysElement::removeAll() { for (auto controller: controllers) { controller.second->stop(); } for (auto controller: controllers) { controller.second->wait(); delete controller.second; } controllers.clear(); currentCount = 0; return 0; } int RtspAnalysElement::getMaxCamCount() { return maxCount; } int RtspAnalysElement::getCurrentCamCount() { return currentCount; } std::string RtspAnalysElement::getRtmp(std::string &index) { if (controllers.find(index) == controllers.end())return ""; auto controller = controllers[index]; return controller->getRtmp(); } std::vector RtspAnalysElement::chnString2Vec(std::string str_list) { std::vector result; char *property_list = const_cast(str_list.c_str()); const char *c_Analyse = ","; char *t_property; char *t_save = NULL; t_property = strtok_r(property_list, c_Analyse, &t_save); while (t_property) { std::string str_pro(t_property); result.push_back(atoi(str_pro.c_str())); t_property = strtok_r(t_save, c_Analyse, &t_save); } return result; } //void RtspAnalysElement::setDataByType(Json::Value& json,const SdkRule& rule) //{ // std::string camId=rule.strCamId.toStdString(); // sdkRuleMap[rule.nSdkType].weekRuleVec=m_lDBTool->searchCameraWeekRuleByCamId(rule.strCamId,rule.nSdkType); // switch (rule.nSdkType) // { // case FaceSdk: // { // json["face.enable"] = "1"; // appPref.setFloatData(camId+"face.det",rule.nQuality); // appPref.setFloatData(camId+"face.cmp",rule.nThreshold); // break; // } // case CarSdk: // { // // DBG("XX.enable " << "1"); // appPref.setFloatData(camId+"xx.det",rule.nQuality); // appPref.setFloatData(camId+"xx.cmp",rule.nThreshold); // break; // } // case YoloSdk: // { // json["yolo.enable"] = "1"; // appPref.setFloatData(camId+"yolo.det",rule.nQuality); // appPref.setFloatData(camId+"yolo.cmp",rule.nThreshold); // break; // } // case PerimeterSdk: // { // // auto rule=m_lDBTool->searchPerimeterRuleByCamId(camId); // json["perimeter.enable"] = 1; // json["perimeter.area"]=rule.strAreas.toStdString(); // json["perimeter.num"]=rule.nAlarmNumLowerLimit; // json["perimeter.delay"]=rule.nTriggerDelay; // json["perimeter.tolerance"]=rule.nTriggerTolerance; // appPref.setFloatData(camId+"perimeter.det",rule.nQuality); // appPref.setFloatData(camId+"perimeter.cmp",rule.nThreshold); // break; // } // case CrowdSdk: // { // json["crowd.enable"] = 1; // json["crowd.area"]=rule.strAreas.toStdString(); // json["crowd.num"]=rule.nAlarmNumLowerLimit; // json["crowd.delay"]=rule.nTriggerDelay; // json["crowd.tolerance"]=rule.nTriggerTolerance; // appPref.setFloatData(camId+"crowd.det",rule.nQuality); // appPref.setFloatData(camId+"crowd.cmp",rule.nThreshold); // break; // } // case KeepRightSdk: // { // json["keepRight.enable"] = 1; // json["keepRight.leftArea"]=rule.strAreas.toStdString(); // json["keepRight.leftLine"]=rule.strLine.toStdString(); // json["keepRight.rightArea"]=rule.strExAreas.toStdString(); // json["keepRight.rightLine"]=rule.strExLine.toStdString(); // json["keepRight.delay"]=rule.nTriggerDelay; // json["keepRight.tolerance"]=rule.nTriggerTolerance; // appPref.setFloatData(camId+"keepRight.det",rule.nQuality); // appPref.setFloatData(camId+"keepRight.cmp",rule.nThreshold); // break; // } // default: // break; // } //}