| | |
| | | std::bind(&devHttpServer_c::editDevId, this, |
| | | std::placeholders::_1, std::placeholders::_2, |
| | | std::placeholders::_3, std::placeholders::_4)); |
| | | _HttpSrvRetRecieve.setInfo("^/findSdkRule$", "POST", |
| | | std::bind(&devHttpServer_c::findSdkRule, this, |
| | | std::placeholders::_1, std::placeholders::_2, |
| | | std::placeholders::_3, std::placeholders::_4)); |
| | | _HttpSrvRetRecieve.setInfo("^/editSdkRule$", "POST", |
| | | std::bind(&devHttpServer_c::editSdkRule, this, |
| | | std::placeholders::_1, std::placeholders::_2, |
| | | std::placeholders::_3, std::placeholders::_4)); |
| | | _HttpSrvRetRecieve.setInfo("^/getSnapshot$", "POST", |
| | | std::bind(&devHttpServer_c::getSnapshot, this, |
| | | std::placeholders::_1, std::placeholders::_2, |
| | | std::placeholders::_3, std::placeholders::_4)); |
| | | |
| | | |
| | | _HttpSrvRetRecieve.start(); |
| | | _HttpSrvRetRecieve.waitForShutDown(); |
| | | } |
| | |
| | | elem["str_brand"] = iter->str_brand.toStdString(); |
| | | elem["str_reserved"] = iter->str_reserved.toStdString(); |
| | | |
| | | Record_Cam_Sdk rec_sdk = db_c.searchCamSdkTableByCamId(iter->str_cam_dev_id); |
| | | elem["str_sdks"] = rec_sdk.str_sdks.toStdString(); |
| | | elem["str_det_thr"] = rec_sdk.str_det_thr.toStdString(); |
| | | elem["str_cmp_thr"] = rec_sdk.str_cmp_thr.toStdString(); |
| | | // Record_Cam_Sdk rec_sdk = db_c.searchCamSdkTableByCamId(iter->str_cam_dev_id); |
| | | // elem["str_sdks"] = rec_sdk.str_sdks.toStdString(); |
| | | // elem["str_det_thr"] = rec_sdk.str_det_thr.toStdString(); |
| | | // elem["str_cmp_thr"] = rec_sdk.str_cmp_thr.toStdString(); |
| | | |
| | | cout << elem.toStyledString() << endl; |
| | | |
| | |
| | | rec.str_password = QString::fromStdString(value["str_password"].asString()); |
| | | rec.str_brand = QString::fromStdString(value["str_brand"].asString()); |
| | | |
| | | rec_sdk_old = db_c.searchCamSdkTableByCamId(rec.str_cam_dev_id); |
| | | // rec_sdk_old = db_c.searchCamSdkTableByCamId(rec.str_cam_dev_id); |
| | | |
| | | rec_sdk.str_cam_dev_id = rec.str_cam_dev_id; |
| | | rec_sdk.str_sdks = QString::fromStdString(value["str_sdks"].asString()); |
| | | rec_sdk.str_det_thr = QString::fromStdString(value["str_det_thr"].asString()); |
| | | rec_sdk.str_cmp_thr = QString::fromStdString(value["str_cmp_thr"].asString()); |
| | | // rec_sdk.str_cam_dev_id = rec.str_cam_dev_id; |
| | | // rec_sdk.str_sdks = QString::fromStdString(value["str_sdks"].asString()); |
| | | // rec_sdk.str_det_thr = QString::fromStdString(value["str_det_thr"].asString()); |
| | | // rec_sdk.str_cmp_thr = QString::fromStdString(value["str_cmp_thr"].asString()); |
| | | |
| | | ret = db_c.updateCamAndSdkTable(rec, rec_sdk); |
| | | if (!ret) { |
| | |
| | | db_c.updateConfigTableByDevType(DEV_CAMERA); |
| | | runAllApp(); |
| | | } |
| | | //edit camera's sdks |
| | | else/* if ((rec_sdk_old.str_sdks != rec_sdk.str_sdks) || |
| | | (rec_sdk_old.str_det_thr != rec_sdk.str_det_thr) || |
| | | (rec_sdk_old.str_cmp_thr != rec_sdk.str_cmp_thr)) */{ |
| | | killVideoAnalysFromHCApp(); |
| | | sleep(1); |
| | | runAllApp(); |
| | | } |
| | | //edit camera's sdks |
| | | // else/* if ((rec_sdk_old.str_sdks != rec_sdk.str_sdks) || |
| | | // (rec_sdk_old.str_det_thr != rec_sdk.str_det_thr) || |
| | | // (rec_sdk_old.str_cmp_thr != rec_sdk.str_cmp_thr)) */{ |
| | | // killVideoAnalysFromHCApp(); |
| | | // sleep(1); |
| | | // runAllApp(); |
| | | // } |
| | | |
| | | Json::Value value_out; |
| | | value_out["str_cam_dev_id"] = rec.str_cam_dev_id.toStdString(); |
| | |
| | | |
| | | if (reader.parse(content, value)) { |
| | | int cut_max_duration = value["cut_max_duration"].asInt(); |
| | | |
| | | ret = db_c.updateConfigTableByCutDuration(cut_max_duration); |
| | | int cut_min_duration = value["cut_min_duration"].asInt(); |
| | | ret = db_c.updateConfigTableByCutDuration(cut_max_duration, cut_min_duration); |
| | | |
| | | } else { |
| | | return "{\"ret_status\": \"传输错误,请检查!\"}"; |
| | |
| | | |
| | | Json::Value value; |
| | | |
| | | int cut_max_duration = db_c.searchConfigTableWithinCutDuration(); |
| | | |
| | | value["cut_max_duration"] = cut_max_duration; |
| | | Record_Config rec = db_c.searchConfigTableWithinServerInfo(); |
| | | |
| | | value["cut_max_duration"] = rec.n_cut_max_duration; |
| | | value["cut_min_duration"] = rec.n_cut_min_duration; |
| | | std::string out = value.toStyledString(); |
| | | |
| | | return out; |
| | |
| | | auto t_results = m_curlDownloadImg.download_jpeg(const_cast<char *>(img_url.c_str())); |
| | | cvutil.buffer2CvMat(t_results.buffer, image); |
| | | } else if (img_base64.size() > 0) { |
| | | img_url = "http://"; |
| | | auto str_img = base64.Decode(img_base64.c_str(), img_base64.size()); |
| | | std::vector<unsigned char> buffer(str_img.size()); |
| | | memcpy(buffer.data(), str_img.data(), str_img.size()); |
| | | cvutil.buffer2CvMat(buffer, image); |
| | | |
| | | |
| | | fdfsClient.rwLock.rdlock(); |
| | | if (fdfsClient.fastFds != nullptr) { |
| | | img_url.append(fdfsClient.fastFds->getIp() + "/"); |
| | | std::string t_strImg = ""; |
| | | if (!fdfsClient.fastFds->uploadFile(buffer, t_strImg, "jpg")) { |
| | | img_url = "upload image fail"; |
| | | } else { |
| | | img_url.append(t_strImg); |
| | | img_url.clear(); |
| | | img_url = t_strImg; |
| | | // img_url.append("/").append(t_strImg); |
| | | } |
| | | } |
| | | fdfsClient.rwLock.unlock(); |
| | | } else { |
| | | response->write(SimpleWeb::StatusCode::server_error_not_implemented, "{\"error\":\"not found img\"}"); |
| | | return ""; |
| | |
| | | // cv::imwrite(str_path, image); |
| | | return ""; |
| | | // return "{\"error\":\"not found face\"}"; |
| | | } else if (faceResults.size() > 1) { |
| | | response->write(SimpleWeb::StatusCode::server_error_not_implemented, "{\"error\":\" 仅支持单人脸图片 \"}"); |
| | | return ""; |
| | | } |
| | | |
| | | for (auto &item : faceResults) { |
| | | feature_base64 = base64.Encode(item.feature.data(), item.feature.size()); |
| | | |
| | | |
| | | int x = item.left; |
| | | int y = item.top; |
| | | int w = item.width; |
| | | int h = item.height; |
| | | cv::Rect t_rect = {x, y, w, h}; |
| | | auto t_image = image(CvUtil::zoomRect(t_rect, 1.5, 1.5) & cv::Rect(0, 0, image.cols, image.rows)).clone(); |
| | | std::vector<uchar> buffer; |
| | | cvutil.cvMat2Buffer(t_image, buffer); |
| | | img_url = "http://"; |
| | | fdfsClient.rwLock.rdlock(); |
| | | if (fdfsClient.fastFds != nullptr) { |
| | | img_url.append(fdfsClient.fastFds->getIp() + "/"); |
| | | std::string t_strImg = ""; |
| | | if (!fdfsClient.fastFds->uploadFile(buffer, t_strImg, "jpg")) { |
| | | img_url = "upload image fail"; |
| | | } else { |
| | | img_url.append(t_strImg); |
| | | img_url.clear(); |
| | | img_url = t_strImg; |
| | | // img_url.append("/").append(t_strImg); |
| | | } |
| | | } |
| | | fdfsClient.rwLock.unlock(); |
| | | |
| | | } |
| | | auto size = feature_base64.size(); |
| | | // std::string uuid = ""; |
| | |
| | | // sub = sub > 3000 ? sub - 3000 : 0000; |
| | | //shijian yuejie buchang |
| | | // sub = sub < 0 ? 0000 : sub; |
| | | int haomiao = sub % 1000; |
| | | int haomiao = (sub % 1000) > 50 ? ((sub % 1000) - 50) : 0; |
| | | sub /= 1000; |
| | | int m = sub; |
| | | int shi, fen, miao; |
| | |
| | | shi = m / 3600; |
| | | fen = m / 60 % 60; |
| | | miao = m % 60; |
| | | sprintf(ch_time, "%02d:%02d:%02d.%03d", shi, fen, miao, haomiao); |
| | | cout << ch_time << endl; |
| | | } else printf("输入数值太大"); |
| | | sprintf(ch_time, "%02d:%02d:%02d.%02d", shi, fen, miao, haomiao / 10); |
| | | |
| | | } else printf("输入数值太大"); |
| | | DBG("ch_time" << ch_time); |
| | | std::string str_time(ch_time); |
| | | //#todo 按照时间命名 |
| | | std::string str_imgName(AppUtil::getTimeString() + ".jpg");// = "test.jpg"; |
| | |
| | | |
| | | std::string str_tmpTime = AppUtil::getCmdResult(cmd_getVideoFileTime); |
| | | |
| | | |
| | | |
| | | if (str_time > str_tmpTime) { |
| | | ERR("{\"error\":\"Time error\"}" << str_time << " str_tmpTime " << str_tmpTime); |
| | | str_time = str_tmpTime.size() > 0 ? str_tmpTime.substr(0, str_tmpTime.rfind(".")) : str_time; |
| | | |
| | | //str_time = str_tmpTime.size() > 0 ? str_tmpTime : str_time; |
| | | qint64 v_time=getVideoTime(str_tmpTime)-1000; |
| | | int haomiao = (v_time % 1000) > 50 ? ((v_time % 1000) - 50) : 0; |
| | | v_time /= 1000; |
| | | int m = v_time; |
| | | int shi, fen, miao; |
| | | char ch_time[128]; |
| | | if (m / 3600 < 24) { |
| | | shi = m / 3600; |
| | | fen = m / 60 % 60; |
| | | miao = m % 60; |
| | | sprintf(ch_time, "%02d:%02d:%02d.%02d", shi, fen, miao, haomiao / 10); |
| | | |
| | | } else printf("输入数值太大"); |
| | | |
| | | str_time=ch_time; |
| | | ERR("{\"error\":\"Time error\"}" << str_time << " str_tmpTime " << str_tmpTime<<" ch_time="<<ch_time); |
| | | // return "{\"error\":\"Time error\"}"; |
| | | } |
| | | |
| | |
| | | std::string devHttpServer_c::getVideoPathByTime(const std::string &time, const std::string &camId, qint64 &sub) { |
| | | std::string t_FilePath = appConfig.getStringProperty("cutPath"); |
| | | |
| | | bool find = false;; |
| | | bool find = false; |
| | | if (t_FilePath.back() != '/') { |
| | | t_FilePath.push_back('/'); |
| | | } |
| | |
| | | qint64 t = dt.toMSecsSinceEpoch(); |
| | | std::vector<std::string> vec = forEachFile(t_FilePath); |
| | | std::sort(vec.begin(), vec.end()); |
| | | DBG("t_FilePath" << t_FilePath); |
| | | DBG("vec.size()" << vec.size()); |
| | | // DBG("t_FilePath" << t_FilePath); |
| | | // DBG("vec.size()" << vec.size()); |
| | | int size = vec.size(); |
| | | for (int i = 0; i < size; ++i) { |
| | | qint64 t1 = QDateTime::fromString(QString::fromStdString(vec[i]), |
| | |
| | | DBG("path=" << vec[i]); |
| | | t_FilePath += vec[i] + ".mp4"; |
| | | sub = t - t1; |
| | | find = true; |
| | | // find = sub < getVideoTime(t_FilePath); |
| | | break; |
| | | } |
| | | |
| | | } else { |
| | | sub = t - t1; |
| | | if (t >= t1 && sub <= 3000) { |
| | | if (t >= t1) { |
| | | DBG("path=" << vec[i]); |
| | | t_FilePath += vec[i] + ".mp4"; |
| | | find = true; |
| | | |
| | | // find = sub < getVideoTime(t_FilePath); |
| | | |
| | | DBG("find:" << find); |
| | | break; |
| | | } |
| | | } |
| | |
| | | |
| | | } |
| | | DBG("sub=" << sub); |
| | | if (!find) { |
| | | t_FilePath = ""; |
| | | } |
| | | // if (!find) { |
| | | // t_FilePath = ""; |
| | | // } |
| | | return t_FilePath; |
| | | |
| | | } |
| | | |
| | | qint64 devHttpServer_c::getVideoTime(/*const std::string &videoPath,*/std::string& str_tmpTime) { |
| | | // std::string cmd_getVideoFileTime( |
| | | // " ffmpeg -i '" + videoPath + "' 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//"); |
| | | |
| | | // str_tmpTime = AppUtil::getCmdResult(cmd_getVideoFileTime); |
| | | DBG("str_tmpTime:" << str_tmpTime);//00:00:06.89 |
| | | qint64 len_ms = 0; |
| | | |
| | | QStringList list = QString::fromStdString(str_tmpTime).split(":"); |
| | | if (list.size() == 3) { |
| | | len_ms = list[0].toInt() * 60 * 60 * 1000; |
| | | len_ms += list[1].toInt() * 60 * 1000; |
| | | |
| | | QStringList s = list[2].split("."); |
| | | if (s.size() == 2) { |
| | | len_ms += s[0].toInt() * 1000; |
| | | len_ms += s[1].toInt() * 10; |
| | | } |
| | | |
| | | } |
| | | DBG("len_ms:" << len_ms); |
| | | return len_ms; |
| | | } |
| | | |
| | | std::vector<std::string> devHttpServer_c::forEachFile(const std::string &dir_name) { |
| | |
| | | return ""; |
| | | // return "{\"error\":\"传输错误,请检查!\"}"; |
| | | } |
| | | } |
| | | } |
| | | |
| | | std::string devHttpServer_c::editSdkRule(std::string ip, unsigned int port, std::string content, PResponse &response) { |
| | | Json::Reader reader; |
| | | Json::Value value; |
| | | Json::FastWriter writer; |
| | | if (reader.parse(content, value)) { |
| | | SdkRule rule; |
| | | rule.nSdkType = value["nSdkType"].asInt(); |
| | | rule.nAlarmNumLowerLimit = value["nAlarmNumLowerLimit"].asInt(); |
| | | rule.nAlarmNumUpperLimit = value["nAlarmNumUpperLimit"].asInt(); |
| | | rule.nTriggerDelay = value["nTriggerDelay"].asInt(); |
| | | rule.nTriggerTolerance = value["nTriggerTolerance"].asInt(); |
| | | rule.nThreshold = value["nThreshold"].asInt(); |
| | | rule.nQuality = value["nQuality"].asInt(); |
| | | rule.nIsRun = value["nIsRun"].asInt(); |
| | | rule.strBroadcast = value["nIsBroadcast"].asCString(); |
| | | rule.strAreas = value["strAreas"].asCString(); |
| | | rule.strCamId = value["strCamId"].asCString(); |
| | | rule.strExAreas = value["strExAreas"].asCString(); |
| | | rule.strLine = value["strLine"].asCString(); |
| | | rule.strExLine = value["strExLine"].asCString(); |
| | | if (rule.strCamId.isEmpty()) { |
| | | return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | } |
| | | if (rule.nSdkType <= SdkTypeStart || rule.nSdkType >= SdkTypeEnd) { |
| | | return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | } |
| | | |
| | | for (int i = 0; i < value["weekRuleArray"].size(); ++i) { |
| | | Json::Value item = value["weekRuleArray"][i]; |
| | | LActRuleWeekRecord weekRule; |
| | | weekRule.m_nSdkType = rule.nSdkType; |
| | | weekRule.m_nType = item["nType"].asInt(); |
| | | weekRule.m_strCamId = rule.strCamId; |
| | | weekRule.m_strBegin = item["strBegin"].asCString(); |
| | | weekRule.m_strEnd = item["strEnd"].asCString(); |
| | | //rule.weekRuleVec.push_back(weekRule); |
| | | db_c.updateCameraWeekRule(weekRule); |
| | | } |
| | | |
| | | |
| | | if (db_c.updateSdkRule(rule)) { |
| | | // if(rule.nIsRun==1) |
| | | |
| | | killVideoAnalysFromHCApp(); |
| | | sleep(1); |
| | | runAllApp(); |
| | | |
| | | |
| | | return "{\"ret_status\": \"ok_ack\"}"; |
| | | } else { |
| | | return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | } |
| | | } else { |
| | | return "{\"error\":\"传输错误,请检查!\"}"; |
| | | } |
| | | } |
| | | |
| | | std::string devHttpServer_c::findSdkRule(std::string ip, unsigned int port, std::string content, PResponse &response) { |
| | | Json::Reader reader; |
| | | Json::Value value; |
| | | |
| | | if (reader.parse(content, value)) { |
| | | |
| | | QString strCamId = value["strCamId"].asCString(); |
| | | |
| | | SdkRuleMap ruleMap = db_c.searchSdkRuleByCamId(strCamId); |
| | | |
| | | int count = ruleMap.size(); |
| | | |
| | | if (count > 0) { |
| | | Json::Value objs; |
| | | Json::Value obj; |
| | | |
| | | for (auto rule:ruleMap) { |
| | | obj["nSdkType"] = rule.second.nSdkType; |
| | | obj["nAlarmNumLowerLimit"] = rule.second.nAlarmNumLowerLimit; |
| | | obj["nAlarmNumUpperLimit"] = rule.second.nAlarmNumUpperLimit; |
| | | obj["nTriggerDelay"] = rule.second.nTriggerDelay; |
| | | obj["nTriggerTolerance"] = rule.second.nTriggerTolerance; |
| | | obj["nThreshold"] = rule.second.nThreshold; |
| | | obj["nQuality"] = rule.second.nQuality; |
| | | obj["nIsRun"] = rule.second.nIsRun; |
| | | obj["nIsBroadcast"] = rule.second.strBroadcast.toStdString(); |
| | | obj["strAreas"] = rule.second.strAreas.toStdString(); |
| | | obj["strCamId"] = rule.second.strCamId.toStdString(); |
| | | obj["strExAreas"] = rule.second.strExAreas.toStdString(); |
| | | obj["strLine"] = rule.second.strLine.toStdString(); |
| | | obj["strExLine"] = rule.second.strExLine.toStdString(); |
| | | Json::Value weekRuleArray; |
| | | |
| | | |
| | | Json::Value weekRule; |
| | | std::vector<LActRuleWeekRecord> weekRuleVec = db_c.searchCameraWeekRuleByCamId(strCamId, rule.first); |
| | | for (int k = 0; k < weekRuleVec.size(); ++k) { |
| | | Json::Value weekRuleObj; |
| | | weekRuleObj["nSdkType"] = weekRuleVec[k].m_nSdkType; |
| | | weekRuleObj["strCamId"] = weekRuleVec[k].m_strCamId.toStdString(); |
| | | weekRuleObj["strBegin"] = weekRuleVec[k].m_strBegin.toStdString(); |
| | | weekRuleObj["strEnd"] = weekRuleVec[k].m_strEnd.toStdString(); |
| | | weekRuleObj["nType"] = weekRuleVec[k].m_nType; |
| | | weekRule.append(weekRuleObj); |
| | | } |
| | | //weekRuleArray[j]=weekRule; |
| | | |
| | | |
| | | obj["weekRuleArray"] = weekRule; |
| | | objs.append(obj); |
| | | } |
| | | return objs.toStyledString(); |
| | | } else { |
| | | // return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | return "[]"; |
| | | } |
| | | } else { |
| | | return "{\"error\":\"传输错误,请检查!\"}"; |
| | | } |
| | | } |
| | | |
| | | std::string devHttpServer_c::getSnapshot(std::string ip, unsigned int port, std::string content, PResponse &response) { |
| | | Json::Reader reader; |
| | | Json::Value value; |
| | | |
| | | if (reader.parse(content, value)) { |
| | | |
| | | std::string ip = value["str_ip"].asString(); |
| | | // int port= value["n_port"].asInt(); |
| | | int port = 554; |
| | | std::string username = value["str_username"].asString(); |
| | | std::string pass = value["str_password"].asString(); |
| | | std::string brand = value["str_brand"].asString(); |
| | | std::string rtsp_url = rtspAddrBuild(ip, port, username, pass, brand); |
| | | if (rtsp_url.empty()) { |
| | | return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | } |
| | | std::string str_imgName = appConfig.getStringProperty("cutPath"); |
| | | if (str_imgName.back() != '/') { |
| | | str_imgName.push_back('/'); |
| | | } |
| | | str_imgName += "snapshot.jpg"; |
| | | //admin:a1234567@192.168.1.201:554/h264/ch1/main/av_stream -r 1/25 -f image2 -s 1920*1080 /home/basic/work_src/a.jpg |
| | | std::string cmd("ffmpeg -i " + rtsp_url + " -r 1/25 -f image2 -s 1920*1080 -y " + str_imgName); |
| | | DBG(cmd); |
| | | system(cmd.c_str()); |
| | | |
| | | cv::Mat img = cv::imread(str_imgName); |
| | | |
| | | if (img.empty()) { |
| | | |
| | | return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | } |
| | | fdfsClient.rwLock.rdlock(); |
| | | std::string strImgUrl = "http://"; |
| | | if (fdfsClient.fastFds != nullptr) { |
| | | std::vector<unsigned char> buffer; |
| | | CvUtil::cvMat2Buffer(img, buffer); |
| | | std::string strImgUrlTmp = ""; |
| | | fdfsClient.fastFds->uploadFile(buffer, strImgUrlTmp, "jpg"); |
| | | strImgUrl.append(fdfsClient.fastFds->getIp() + "/" + strImgUrlTmp); |
| | | strImgUrl.clear(); |
| | | strImgUrl = strImgUrlTmp; |
| | | } |
| | | fdfsClient.rwLock.unlock(); |
| | | Json::Value result; |
| | | result["imgUrl"] = strImgUrl; |
| | | |
| | | return result.toStyledString(); |
| | | |
| | | |
| | | } else { |
| | | return "{\"error\":\"传输错误,请检查!\"}"; |
| | | } |
| | | } |
| | | |