From 684b55231257011c11caacc5ae72b0f0977c6114 Mon Sep 17 00:00:00 2001
From: chenshijun <chenshijun@aiotlink.com>
Date: 星期五, 15 三月 2019 15:14:22 +0800
Subject: [PATCH] 整合代码

---
 QiaoJiaSystem/DataManagerServer/vss/dao/VssLocalSettingTblSqliteDao.h       |   15 
 QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h                             |    2 
 QiaoJiaSystem/DataManagerServer/vss/controller/VssChannelTblController.h    |    6 
 QiaoJiaSystem/build/FaceSearchServer                                        |    0 
 QiaoJiaSystem/DataManagerServer/vss/controller/VssDomainUnitTblController.h |    4 
 QiaoJiaSystem/build/runAll.sh                                               |  143 +++++++-
 QiaoJiaSystem/DataManagerServer/vss/dao/VssDevTblDao.h                      |   15 
 QiaoJiaSystem/build/TestCilent                                              |    0 
 QiaoJiaSystem/DataManagerServer/vss/dao/BaseSqliteDao.h                     |   56 +++
 QiaoJiaSystem/build/syncDBClient                                            |    0 
 QiaoJiaSystem/DataManagerServer/vss/controller/CamDevController.h           |   26 +
 QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp                       |    5 
 QiaoJiaSystem/build/DataWebServer                                           |    0 
 QiaoJiaSystem/FaceSearchServer/main.cpp                                     |    2 
 QiaoJiaSystem/VideoToImageMulth/CMakeLists.txt                              |    2 
 QiaoJiaSystem/DataManagerServer/vss/controller/VssDevTblController.h        |   19 +
 QiaoJiaSystem/build/scpToSer.sh                                             |   11 
 QiaoJiaSystem/FaceSearchServer/AlarmServer.hpp                              |   23 +
 QiaoJiaSystem/build/YoloServer                                              |    0 
 QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h                        |   15 
 QiaoJiaSystem/build/YoloDetectClientTest                                    |    0 
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp            |   84 +++--
 QiaoJiaSystem/VideoToImage/CMakeLists.txt                                   |    2 
 QiaoJiaSystem/build/FaceDetectServer                                        |    0 
 QiaoJiaSystem/DataManagerServer/vss/dao/BaseDao.h                           |    5 
 QiaoJiaSystem/DataManagerServer/vss/controller/VssUpperSvrTblController.h   |    4 
 QiaoJiaSystem/build/FaceDetectResourcesTest                                 |    0 
 /dev/null                                                                   |    4 
 QiaoJiaSystem/build/FaceExtractServer                                       |    0 
 QiaoJiaSystem/DataManagerServer/http_configserver.cpp                       |  125 ++++--
 QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp                            |    2 
 QiaoJiaSystem/FaceSearchServer/CMakeLists.txt                               |    1 
 QiaoJiaSystem/build/VideoAnalysFromHC                                       |    0 
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h              |    1 
 QiaoJiaSystem/DataManagerServer/vss/dao/CamDevSqliteDao.h                   |   24 +
 QiaoJiaSystem/DataManagerServer/HttpSrvRetRecieve.hpp                       |    6 
 QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h                        |    3 
 QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp                      |  300 +++++++++++-------
 QiaoJiaSystem/StructureApp/FaceExtractElement.cpp                           |    5 
 39 files changed, 647 insertions(+), 263 deletions(-)

diff --git a/QiaoJiaSystem/DataManagerServer/HttpSrvRetRecieve.hpp b/QiaoJiaSystem/DataManagerServer/HttpSrvRetRecieve.hpp
index cbff042..da91454 100644
--- a/QiaoJiaSystem/DataManagerServer/HttpSrvRetRecieve.hpp
+++ b/QiaoJiaSystem/DataManagerServer/HttpSrvRetRecieve.hpp
@@ -43,7 +43,11 @@
             std::string strInfo =  request->path;
             auto func = m_map_TASKFUNC[strInfo];
             if(func != nullptr){
-                std::string strRet = func(request->remote_endpoint_address(),request->remote_endpoint_port(),request->content.string(),response);
+                std::cout << "url "<< strInfo << std::endl;
+                std::string content = request->content.string();
+                std::cout << "content " << content << std::endl;
+                std::string strRet = func(request->remote_endpoint_address(),request->remote_endpoint_port(),content,response);
+                std::cout << "strRet " << strRet << std::endl;
                 if(strRet.size() > 0){
                     DBG("strRet.size() > 0");
                     response->write(strRet);
diff --git a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
index f93e4e0..0750366 100644
--- a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
+++ b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
@@ -1003,11 +1003,24 @@
         elem["str_latitude"] = iter->str_latitude.toStdString();
         elem["str_ip"] = iter->str_ip.toStdString();
         elem["n_port"] = iter->n_port;
+        elem["type"] = iter->type;
         elem["str_username"] = iter->str_username.toStdString();
         elem["str_password"] = iter->str_password.toStdString();
         elem["str_brand"] = iter->str_brand.toStdString();
         elem["str_reserved"] = iter->str_reserved.toStdString();
 
+        SdkRuleMap ruleMap = db_c.searchSdkRuleByCamId(iter->str_cam_dev_id);
+
+        int count = ruleMap.size();
+        elem["nSdkTypes"] = Json::arrayValue;
+
+        if (count > 0) {
+            for (auto rule:ruleMap) {
+                if (rule.second.nIsRun == 1) {
+                    elem["nSdkTypes"].append(rule.second.nSdkType);
+                }
+            }
+        }
 //        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();
@@ -1052,7 +1065,7 @@
         if ((!ret) || (serialnumber[0] == 0)) {
             return "{\"ret_status\": \"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
         }
-
+        rec.type = 0;
         rec.str_cam_dev_id = QString::fromLatin1((const char *) serialnumber);//鎽勫儚鏈篿d cam_mac
         rec.str_name = QString::fromStdString(value["str_name"].asString());
         rec.str_addr = QString::fromStdString(value["str_addr"].asString());
@@ -1272,26 +1285,35 @@
 
     Json::Reader reader;
     Json::Value value_reader;
-
+    std::string out;
     if (!reader.parse(content, value_reader)) {
         return "{\"ret_status\": \"浼犺緭閿欒锛岃妫�鏌ワ紒\"}";
     }
+    Json::Value value;
+    if (value_reader.isMember("id")) {
+        if (value_reader["id"].isNull()) return "{\"ret_status\": \"id鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+        value["connect_status"] = "True";
+        std::string rtmp_url = appConfig.getStringProperty("srsAddr");
+        rtmp_url.append("cam").append(value_reader["id"].asCString());
+        value["video_url"] = rtmp_url;
+        out = value.toStyledString();
 
-    //TODO
-    //璋冪敤rtsp娴乺tsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream
+    } else {
+        //TODO
+        //璋冪敤rtsp娴乺tsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream
 //    std::string rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":"  + std::to_string(port) + "/h264/ch1/main/av_stream";
-    bool ret = cam_connect_video_start(value_reader["str_ip"].asString(), value_reader["n_port"].asInt(), \
+        bool ret = cam_connect_video_start(value_reader["str_ip"].asString(), value_reader["n_port"].asInt(), \
                             value_reader["str_username"].asString(), value_reader["str_password"].asString(), \
                             value_reader["str_brand"].asString());
-    if (!ret) {
-        return "{\"ret_status\": \"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
-    }
+        if (!ret) {
+            return "{\"ret_status\": \"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+        }
 
-    std::string rtmp_url = m_rtmp[value_reader["str_ip"].asCString()].appPC->getRtmp();
-    Json::Value value;
-    value["connect_status"] = "True";
-    value["video_url"] = rtmp_url;
-    std::string out = value.toStyledString();
+        std::string rtmp_url = m_rtmp[value_reader["str_ip"].asCString()].appPC->getRtmp();
+        value["connect_status"] = "True";
+        value["video_url"] = rtmp_url;
+        out = value.toStyledString();
+    }
 
     return out;
 }
@@ -1934,6 +1956,7 @@
                 ret = erlangDbTool->createDatabase(Uuid, fieldValues);
             } else if (SyncType == 0) {
                 TableName.insert(0, "lt_");
+                fieldValues["tableName"] = TableName;
                 //鏈湴搴�
                 ret = m_SqliteFaceEncap.createTable(TableName, fieldValues);
             }
@@ -2408,26 +2431,27 @@
         std::string BwType = value["BwType"].asString();
         std::string StartTime = value["StartTime"].asString();
         std::string EndTime = value["EndTime"].asString();
-
+        //#鏇存柊搴曞簱绠$悊琛�
+        FieldValues fieldValues;
+        fieldValues.insert(std::make_pair("uuid", Uuid));
+        fieldValues.insert(std::make_pair("tableName", TableName));
+//            fieldValues.insert(std::make_pair("tableDesc", "ceshi2"));
+        fieldValues.insert(std::make_pair("tableType", TableType));
+        fieldValues.insert(std::make_pair("bwType", BwType));
+        fieldValues.insert(std::make_pair("startTime", StartTime));
+        fieldValues.insert(std::make_pair("endTime", EndTime));
+//            fieldValues.insert(std::make_pair("create_by", "who"));
         bool ret = false;
         if (SyncType == 1) {
             //鍚屾搴�
-            ret = erlangDbTool->updateDatabase(Uuid, TableType, TableName, SyncType, BwType, StartTime, EndTime);
+            ret = erlangDbTool->updateDatabase("sys_o_tables", fieldValues);
         } else if (SyncType == 0) {
             //鏈湴搴�
-            //#鏇存柊搴曞簱绠$悊琛�
-            FieldValues fieldValues;
-            fieldValues.insert(std::make_pair("uuid", Uuid));
             if (TableName.find("lt_") != 0) {
                 TableName.insert(0, "lt_");
             }
-            fieldValues.insert(std::make_pair("tableName", TableName));
-//            fieldValues.insert(std::make_pair("tableDesc", "ceshi2"));
-            fieldValues.insert(std::make_pair("tableType", TableType));
-            fieldValues.insert(std::make_pair("bwType", BwType));
-            fieldValues.insert(std::make_pair("startTime", StartTime));
-            fieldValues.insert(std::make_pair("endTime", EndTime));
-//            fieldValues.insert(std::make_pair("create_by", "who"));
+            fieldValues["tableName"] = TableName;
+
             ret = m_SqliteFaceEncap.updateTable("sys_o_tables", fieldValues);
         }
 
@@ -3318,17 +3342,22 @@
     Json::Value value;
 
     if (reader.parse(content, value)) {
+        std::string str_imgName = "";
 
-        std::string ip = value["str_ip"].asString();
+        if (value.isMember("id")) {
+            if (value["id"].isNull()) return "{\"ret_status\": \"id鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+            str_imgName.append("./").append(value["id"].asString()).append(".jpg");
+        } else {
+            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\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
-        }
+            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\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+            }
 //        unsigned char serialnumber[SERIALNO_LEN] = {0};
 //        int ret = getDevSerialNumber(ip.c_str(), port,username.c_str(),pass.c_str(),brand.c_str(),serialnumber);
 
@@ -3340,20 +3369,22 @@
 
 //        std::string str_cam_dev_id = std::string((char *) serialnumber);//鎽勫儚鏈篿d cam_mac
 
-        std::string str_imgName = appConfig.getStringProperty("cutPath");
-        if (str_imgName.back() != '/') {
-            str_imgName.push_back('/');
-        }
-        str_imgName += ip;
-        str_imgName += "-";
-        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 + " -vf select='eq(pict_type\\,I)',setpts='N/(25*TB)' -f image2 -s 1920*1080 -y " +
-            str_imgName);
+            str_imgName = appConfig.getStringProperty("cutPath");
+            if (str_imgName.back() != '/') {
+                str_imgName.push_back('/');
+            }
+            str_imgName += ip;
+            str_imgName += "-";
+            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 +
+                " -vf select='eq(pict_type\\,I)',setpts='N/(25*TB)' -f image2 -s 1920*1080 -y " +
+                str_imgName);
 //        std::string cmd("ffmpeg -i " + rtsp_url + " -r 1/25  -f image2 -s 1920*1080 -y " + str_imgName);
-        DBG(cmd);
-        system(cmd.c_str());
+            DBG(cmd);
+            system(cmd.c_str());
+        }
 
         cv::Mat img = cv::imread(str_imgName);
 
diff --git a/QiaoJiaSystem/DataManagerServer/vss/controller/CamDevController.h b/QiaoJiaSystem/DataManagerServer/vss/controller/CamDevController.h
index a8675c4..22aa644 100755
--- a/QiaoJiaSystem/DataManagerServer/vss/controller/CamDevController.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/controller/CamDevController.h
@@ -18,15 +18,17 @@
 private:
     /** 鎽勫儚澶磋澶囨瀯閫犲嚱鏁� */
     CamDevController() {}
+
 public:
     /** 鎽勫儚澶磋澶囧崟渚嬫ā寮� */
-    static CamDevController* instance() {
+    static CamDevController *instance() {
         static CamDevController instance;
         return &instance;
     }
+
 public:
     /** 娉ㄥ唽{label}http鏈嶅姟 */
-    void registerHttpServices(HttpSrvRetRecieve& _HttpSrvRetRecieve) {
+    void registerHttpServices(HttpSrvRetRecieve &_HttpSrvRetRecieve) {
 
         _HttpSrvRetRecieve.setInfo("^/addCamDev$", "POST",
                                    std::bind(&CamDevController::addCamDev, this,
@@ -54,6 +56,7 @@
                                              std::placeholders::_3, std::placeholders::_4));
 
     }
+
 public:
     /** 娣诲姞鎽勫儚澶磋澶� */
     std::string addCamDev(std::string ip, unsigned int port, std::string content, PResponse &response) {
@@ -68,11 +71,17 @@
             Json::Value idJsonValue = requestJsonValue[CamDev_id];
             if (idJsonValue.type() != Json::ValueType::nullValue) {
                 camDevBuilder.addid(std::stoi((idJsonValue.asString())));
+            } else {
+                ERR("CamDev_id is null " << " is null");
+//                return responseJsonValue.toStyledString();
             }
 
             Json::Value cam_dev_idJsonValue = requestJsonValue[CamDev_cam_dev_id];
             if (cam_dev_idJsonValue.type() != Json::ValueType::nullValue) {
                 camDevBuilder.addcam_dev_id((cam_dev_idJsonValue.asString()));
+            } else {
+                ERR(CamDev_cam_dev_id << " is null");
+                return responseJsonValue.toStyledString();
             }
 
             Json::Value nameJsonValue = requestJsonValue[CamDev_name];
@@ -128,6 +137,8 @@
             Json::Value typeJsonValue = requestJsonValue[CamDev_type];
             if (typeJsonValue.type() != Json::ValueType::nullValue) {
                 camDevBuilder.addtype((typeJsonValue.asString()));
+            } else {
+                camDevBuilder.addtype("1");
             }
             auto keyValuesToAdd = camDevBuilder.buildCamDevMap();
             if (keyValuesToAdd.size() > 0) {
@@ -230,7 +241,8 @@
                 camDevBuilder.addtype((typeJsonValue.asString()));
             }
             if (idJsonValue.type() != Json::ValueType::nullValue) {
-                responseJsonValue = CamDevSqliteDao::instance()->updateCamDev(camDevBuilder.buildCamDevMap(), "id", idJsonValue.asString());
+                responseJsonValue = CamDevSqliteDao::instance()->updateCamDev(camDevBuilder.buildCamDevMap(), "id",
+                                                                              idJsonValue.asString());
             }
         }
         return responseJsonValue.toStyledString();
@@ -309,6 +321,8 @@
             Json::Value typeJsonValue = requestJsonValue[CamDev_type];
             if (typeJsonValue.type() != Json::ValueType::nullValue) {
                 camDevBuilder.addtype((typeJsonValue.asString()));
+            } else {
+                camDevBuilder.addtype("1");
             }
             responseJsonValue["message"] = "鏌ヨ鎴愬姛锛�";
             responseJsonValue["success"] = "true";
@@ -390,6 +404,8 @@
             Json::Value typeJsonValue = requestJsonValue[CamDev_type];
             if (typeJsonValue.type() != Json::ValueType::nullValue) {
                 camDevBuilder.addtype((typeJsonValue.asString()));
+            } else {
+                camDevBuilder.addtype("1");
             }
             responseJsonValue["message"] = "鏌ヨ鎴愬姛锛�";
             responseJsonValue["success"] = "true";
@@ -399,10 +415,6 @@
         return responseJsonValue.toStyledString();
     }
 };
-
-
-
-
 
 
 #endif //CAMDEV_CONTROLLER_H
diff --git a/QiaoJiaSystem/DataManagerServer/vss/controller/VssChannelTblController.h b/QiaoJiaSystem/DataManagerServer/vss/controller/VssChannelTblController.h
index 57c0021..bbaa231 100755
--- a/QiaoJiaSystem/DataManagerServer/vss/controller/VssChannelTblController.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/controller/VssChannelTblController.h
@@ -473,7 +473,7 @@
             }
             responseJsonValue["message"] = "鏌ヨ鎴愬姛锛�";
             responseJsonValue["success"] = "true";
-            responseJsonValue["data"] = VssChannelTblDao::instance()->findJsonArray(string("select * from ") + VSSChannelTbl_TABLE_NAME + " where 1 = 1 limit 1");
+            responseJsonValue["data"] = VssChannelTblDao::instance()->findJsonArray(string("select * from ") + VSSChannelTbl_TABLE_NAME + " where 1 = 1 limit 1", vssChannelTblBuilder.buildVssChannelTblMap());
         }
         return responseJsonValue.toStyledString();
     }
@@ -604,7 +604,9 @@
             }
             responseJsonValue["message"] = "鏌ヨ鎴愬姛锛�";
             responseJsonValue["success"] = "true";
-            responseJsonValue["data"] = VssChannelTblDao::instance()->findJsonArray(string("select * from ") + VSSChannelTbl_TABLE_NAME + " where 1 = 1");
+            responseJsonValue["data"] = VssChannelTblDao::instance()->findJsonArray(string("select * from ") +
+                                                                                    VSSChannelTbl_TABLE_NAME + " where 1 = 1"
+                                                                                    , vssChannelTblBuilder.buildVssChannelTblMap());
 
         }
         return responseJsonValue.toStyledString();
diff --git a/QiaoJiaSystem/DataManagerServer/vss/controller/VssDevTblController.h b/QiaoJiaSystem/DataManagerServer/vss/controller/VssDevTblController.h
index c8d7c94..586f0a1 100755
--- a/QiaoJiaSystem/DataManagerServer/vss/controller/VssDevTblController.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/controller/VssDevTblController.h
@@ -293,7 +293,7 @@
             }
             responseJsonValue["message"] = "鏌ヨ鎴愬姛锛�";
             responseJsonValue["success"] = "true";
-            responseJsonValue["data"] = VssDevTblDao::instance()->findJsonArray(string("select * from ") + VSSDevTbl_TABLE_NAME + " where 1 = 1 limit 1");
+            responseJsonValue["data"] = VssDevTblDao::instance()->findJsonArray(string("select * from ") + VSSDevTbl_TABLE_NAME + " where 1 = 1 limit 1", vssDevTblBuilder.buildVssDevTblMap());
         }
         return responseJsonValue.toStyledString();
     }
@@ -364,7 +364,22 @@
             }
             responseJsonValue["message"] = "鏌ヨ鎴愬姛锛�";
             responseJsonValue["success"] = "true";
-            responseJsonValue["data"] = VssDevTblDao::instance()->findJsonArray(string("select * from ") + VSSDevTbl_TABLE_NAME + " where 1 = 1");
+            auto devDataList = VssDevTblDao::instance()->findJsonArray(string("select * from ") + VSSDevTbl_TABLE_NAME
+                                                                       + " where 1 = 1", vssDevTblBuilder.buildVssDevTblMap());
+            for (int i = 0; i < devDataList.size(); i++) {
+                auto& devData = devDataList[i];
+                auto DevPubID = devData[VssDevTbl_DevPubID];
+                std::map<std::string, std::string> whereKeyValues;
+                whereKeyValues[CamDev_cam_dev_id] = DevPubID.asString();
+                auto camDevDataList = CamDevSqliteDao::instance()->findCamDevList(whereKeyValues)["data"];
+                devData["RemarkName"] = "";
+                if (camDevDataList.size() > 0) {
+                    auto camDevData = camDevDataList[0];
+                    devData["RemarkName"] = camDevData[CamDev_name].asString();
+                }
+            }
+            responseJsonValue["data"] = devDataList;
+
 
         }
         return responseJsonValue.toStyledString();
diff --git a/QiaoJiaSystem/DataManagerServer/vss/controller/VssDomainUnitTblController.h b/QiaoJiaSystem/DataManagerServer/vss/controller/VssDomainUnitTblController.h
index c9674ab..a136776 100755
--- a/QiaoJiaSystem/DataManagerServer/vss/controller/VssDomainUnitTblController.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/controller/VssDomainUnitTblController.h
@@ -248,7 +248,7 @@
             }
             responseJsonValue["message"] = "鏌ヨ鎴愬姛锛�";
             responseJsonValue["success"] = "true";
-            responseJsonValue["data"] = VssDomainUnitTblDao::instance()->findJsonArray(string("select * from ") + VSSDomainUnitTbl_TABLE_NAME + " where 1 = 1 limit 1");
+            responseJsonValue["data"] = VssDomainUnitTblDao::instance()->findJsonArray(string("select * from ") + VSSDomainUnitTbl_TABLE_NAME + " where 1 = 1 limit 1", vssDomainUnitTblBuilder.buildVssDomainUnitTblMap());
         }
         return responseJsonValue.toStyledString();
     }
@@ -304,7 +304,7 @@
             }
             responseJsonValue["message"] = "鏌ヨ鎴愬姛锛�";
             responseJsonValue["success"] = "true";
-            responseJsonValue["data"] = VssDomainUnitTblDao::instance()->findJsonArray(string("select * from ") + VSSDomainUnitTbl_TABLE_NAME + " where 1 = 1");
+            responseJsonValue["data"] = VssDomainUnitTblDao::instance()->findJsonArray(string("select * from ") + VSSDomainUnitTbl_TABLE_NAME + " where 1 = 1", vssDomainUnitTblBuilder.buildVssDomainUnitTblMap());
 
         }
         return responseJsonValue.toStyledString();
diff --git a/QiaoJiaSystem/DataManagerServer/vss/controller/VssUpperSvrTblController.h b/QiaoJiaSystem/DataManagerServer/vss/controller/VssUpperSvrTblController.h
index 156c4e7..25e2a79 100755
--- a/QiaoJiaSystem/DataManagerServer/vss/controller/VssUpperSvrTblController.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/controller/VssUpperSvrTblController.h
@@ -368,7 +368,7 @@
             }
             responseJsonValue["message"] = "鏌ヨ鎴愬姛锛�";
             responseJsonValue["success"] = "true";
-            responseJsonValue["data"] = VssUpperSvrTblDao::instance()->findJsonArray(string("select * from ") + VSSUpperSvrTbl_TABLE_NAME + " where 1 = 1 limit 1");
+            responseJsonValue["data"] = VssUpperSvrTblDao::instance()->findJsonArray(string("select * from ") + VSSUpperSvrTbl_TABLE_NAME + " where 1 = 1 limit 1", vssUpperSvrTblBuilder.buildVssUpperSvrTblMap());
         }
         return responseJsonValue.toStyledString();
     }
@@ -464,7 +464,7 @@
             }
             responseJsonValue["message"] = "鏌ヨ鎴愬姛锛�";
             responseJsonValue["success"] = "true";
-            responseJsonValue["data"] = VssUpperSvrTblDao::instance()->findJsonArray(string("select * from ") + VSSUpperSvrTbl_TABLE_NAME + " where 1 = 1");
+            responseJsonValue["data"] = VssUpperSvrTblDao::instance()->findJsonArray(string("select * from ") + VSSUpperSvrTbl_TABLE_NAME + " where 1 = 1", vssUpperSvrTblBuilder.buildVssUpperSvrTblMap());
 
         }
         return responseJsonValue.toStyledString();
diff --git a/QiaoJiaSystem/DataManagerServer/vss/dao/BaseDao.h b/QiaoJiaSystem/DataManagerServer/vss/dao/BaseDao.h
index aaf3865..bfffec3 100644
--- a/QiaoJiaSystem/DataManagerServer/vss/dao/BaseDao.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/dao/BaseDao.h
@@ -77,7 +77,8 @@
         return rowDataList;
     }
 
-    static Json::Value findJsonArray(string sql) {
+    static Json::Value findJsonArray(string sql, std::map<std::string, std::string>& whereColumns) {
+        sql = sql + getWhereColumnNameValuePair(whereColumns);
         initConnection();
         mysqlpp::Query query = conn->query(sql);
         Json::Value rowList;
@@ -97,6 +98,7 @@
                 rowList.append(row);
             }
         } else {
+            cout << "error " <<query.error() << endl;
             cout << "query failed" << endl;
         }
         return rowList;
@@ -130,6 +132,7 @@
         return updateSql;
     }
     static void doConnect() {
+        cout << "db_host=" << appConfig.getStringProperty("db_host").c_str() << endl;
         if (conn->connect(
             appConfig.getStringProperty("database").c_str(),
             appConfig.getStringProperty("db_host").c_str(),
diff --git a/QiaoJiaSystem/DataManagerServer/vss/dao/BaseSqliteDao.h b/QiaoJiaSystem/DataManagerServer/vss/dao/BaseSqliteDao.h
index 88ae76a..e30ed59 100644
--- a/QiaoJiaSystem/DataManagerServer/vss/dao/BaseSqliteDao.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/dao/BaseSqliteDao.h
@@ -18,6 +18,62 @@
         BaseSqliteDao::m_pModel = lDBTool->get_m_pModel();
         BaseSqliteDao::m_mutexVisit = lDBTool->get_m_mutexVisit();
     }
+    static string getColumnNames(std::map<std::string, std::string>& columns) {
+        string columnNames;
+        auto size = columns.size();
+        int i = 0;
+        for (auto column : columns) {
+            columnNames.append(column.first);
+            if (i != size - 1) {
+                columnNames.append(",");
+            }
+            i++;
+        }
+        return columnNames;
+    }
+    static string getColumnValues(std::map<std::string, std::string>& columns) {
+        string columnValues;
+        auto size = columns.size();
+        int i = 0;
+        for (auto column : columns) {
+            columnValues.append("'"+column.second+"'");
+            if (i != columns.size() - 1) {
+                columnValues.append(",");
+            }
+            i++;
+        }
+        return columnValues;
+    }
+    static string getColumnNameValuePair(std::map<std::string, std::string>& columns) {
+        string columnNameValuePair;
+        auto size = columns.size();
+        int i = 0;
+        for (auto column : columns) {
+            columnNameValuePair.append(column.first);
+            columnNameValuePair.append("=");
+            columnNameValuePair.append("'"+column.second+"'");
+
+            if (i != size - 1) {
+                columnNameValuePair.append(",");
+            }
+            i++;
+        }
+        return columnNameValuePair;
+    }
+    static string getWhereColumnNameValuePair(std::map<std::string, std::string>& columns) {
+        string columnNameValuePair;
+        auto size = columns.size();
+        int i = 0;
+        for (auto column : columns) {
+            columnNameValuePair.append(" and ");
+            columnNameValuePair.append(column.first);
+            columnNameValuePair.append("=");
+            columnNameValuePair.append("'"+column.second+"' ");
+
+            i++;
+        }
+        return columnNameValuePair;
+    }
 };
 
 LDBTool* BaseSqliteDao::lDBTool = nullptr;
diff --git a/QiaoJiaSystem/DataManagerServer/vss/dao/CamDevSqliteDao.h b/QiaoJiaSystem/DataManagerServer/vss/dao/CamDevSqliteDao.h
index d264b87..93aba70 100755
--- a/QiaoJiaSystem/DataManagerServer/vss/dao/CamDevSqliteDao.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/dao/CamDevSqliteDao.h
@@ -4,6 +4,7 @@
 
 #include "../model/CamDev.h"
 #include "BaseSqliteDao.h"
+#include <qsqlfield.h>
 
 #define CamDev_TABLE_NAME "cam_dev"
 
@@ -26,6 +27,14 @@
         Json::Value responseJsonValue;
         responseJsonValue["message"] = "娣诲姞澶辫触锛�";
         responseJsonValue["success"] = "false";
+
+        std::map<std::string, std::string> whereKeyValues;
+        whereKeyValues["cam_dev_id"] = keyValuesToAdd["cam_dev_id"];
+        if (this->findCamDevList(whereKeyValues)["data"].size() > 0) {
+            responseJsonValue["message"] = "cam_dev_id exist锛�";
+            return responseJsonValue;
+        }
+
         QMutexLocker mutexLocker(m_mutexVisit);//TODO
         QSqlTableModel pModel(NULL, *m_db);
 
@@ -71,8 +80,9 @@
         QMutexLocker mutexLocker(m_mutexVisit);//TODO
         QSqlTableModel pModel(NULL, *m_db);
         pModel.setTable(CamDev_TABLE_NAME);
-        for (auto whereKeyValue : whereKeyValues ) {
-            pModel.setFilter(QObject::tr((string(whereKeyValue.first)+" = '%1'").c_str()).arg(QString::fromUtf8(whereKeyValue.second.c_str())));
+        if (whereKeyValues.size() > 0) {
+            auto filter = QObject::tr((string(" 1=1 ")+getWhereColumnNameValuePair(whereKeyValues)).c_str());
+            pModel.setFilter(filter);
         }
         pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
         pModel.select();
@@ -110,8 +120,9 @@
         QMutexLocker mutexLocker(m_mutexVisit);//TODO
         QSqlTableModel pModel(NULL, *m_db);
         pModel.setTable(CamDev_TABLE_NAME);
-        for (auto whereKeyValue : whereKeyValues) {
-            pModel.setFilter(QObject::tr((whereKeyValue.first + " = '%1'").c_str()).arg(QString::fromStdString(whereKeyValue.second)));
+        if (whereKeyValues.size() > 0) {
+            auto filter = QObject::tr((string(" 1=1 ")+getWhereColumnNameValuePair(whereKeyValues)).c_str());
+            pModel.setFilter(filter);
         }
         pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
         pModel.select();
@@ -172,8 +183,9 @@
         std::list<Record_Cut_Video_info> lst;
         QSqlTableModel pModel(NULL, *m_db);
         pModel.setTable(CamDev_TABLE_NAME);;
-        for (auto whereKeyValue : whereKeyValues ) {
-            pModel.setFilter(QObject::tr((string(whereKeyValue.first)+" = '%1'").c_str()).arg(QString::fromUtf8(whereKeyValue.second.c_str())));
+        if (whereKeyValues.size() > 0) {
+            auto filter = QObject::tr((string(" 1=1 ")+getWhereColumnNameValuePair(whereKeyValues)).c_str());
+            pModel.setFilter(filter);
         }
         pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
         pModel.select();
diff --git a/QiaoJiaSystem/DataManagerServer/vss/dao/VssDevTblDao.h b/QiaoJiaSystem/DataManagerServer/vss/dao/VssDevTblDao.h
index 87b5963..ad688f8 100755
--- a/QiaoJiaSystem/DataManagerServer/vss/dao/VssDevTblDao.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/dao/VssDevTblDao.h
@@ -3,7 +3,9 @@
 #define VSSDEVTBL_MANAGER_H
 
 #include "../model/VssDevTbl.h"
+#include "VssChannelTblDao.h"
 #include "BaseDao.h"
+#include "CamDevSqliteDao.h"
 
 #define VSSDevTbl_TABLE_NAME "VSSDevTbl"
 
@@ -37,6 +39,19 @@
     /** 鍒犻櫎鍒涘缓涓�绾ц澶囪〃 whereColumnNameValues 鍒楀悕鍜屽垪鍊煎鏉′欢 */
     bool deleteVssDevTbl(std::map<std::string, std::string>& whereKeyValues) {
         QMutexLocker mutexLocker(&m_mutexVisit);
+        vector<map<string, string>> devRowDataList = findList(string("select * from ")
+                                                          + VSSDevTbl_TABLE_NAME + " where 1=1 "
+                                                                                   + getWhereColumnNameValuePair(whereKeyValues));
+        if (devRowDataList.size() > 0) {
+            auto DevPubID = devRowDataList.at(0)[VssDevTbl_DevPubID];
+            vector<map<string, string>> channelRowDataList = findList(string("select * from ")
+                                                                 + VSSChannelTbl_TABLE_NAME + " where 1=1 AND DevPubID='"+DevPubID+"'");
+            for (auto channelRowData : channelRowDataList) {
+                auto ChanPubID = channelRowData[VssChannelTbl_ChanPubID];
+                CamDevSqliteDao::instance()->deleteByColumn(CamDev_cam_dev_id, ChanPubID);
+            }
+            CamDevSqliteDao::instance()->deleteByColumn(CamDev_cam_dev_id, DevPubID);
+        }
         return del(VSSDevTbl_TABLE_NAME, whereKeyValues);
     }
     
diff --git a/QiaoJiaSystem/DataManagerServer/vss/dao/VssLocalSettingTblSqliteDao.h b/QiaoJiaSystem/DataManagerServer/vss/dao/VssLocalSettingTblSqliteDao.h
index 4096fa0..990265b 100755
--- a/QiaoJiaSystem/DataManagerServer/vss/dao/VssLocalSettingTblSqliteDao.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/dao/VssLocalSettingTblSqliteDao.h
@@ -73,8 +73,9 @@
         QMutexLocker mutexLocker(m_mutexVisit);//TODO
         QSqlTableModel pModel(NULL, *m_db);
         pModel.setTable(VSSLocalSettingTbl_Sqlite_TABLE_NAME);
-        for (auto whereKeyValue : whereKeyValues ) {
-            pModel.setFilter(QObject::tr((string(whereKeyValue.first)+" = '%1'").c_str()).arg(QString::fromUtf8(whereKeyValue.second.c_str())));
+        if (whereKeyValues.size() > 0) {
+            auto filter = QObject::tr((string(" 1=1 ")+getWhereColumnNameValuePair(whereKeyValues)).c_str());
+            pModel.setFilter(filter);
         }
         pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
         pModel.select();
@@ -112,8 +113,9 @@
         QMutexLocker mutexLocker(m_mutexVisit);//TODO
         QSqlTableModel pModel(NULL, *m_db);
         pModel.setTable(VSSLocalSettingTbl_Sqlite_TABLE_NAME);
-        for (auto whereKeyValue : whereKeyValues) {
-            pModel.setFilter(QObject::tr((whereKeyValue.first + " = '%1'").c_str()).arg(QString::fromStdString(whereKeyValue.second)));
+        if (whereKeyValues.size() > 0) {
+            auto filter = QObject::tr((string(" 1=1 ")+getWhereColumnNameValuePair(whereKeyValues)).c_str());
+            pModel.setFilter(filter);
         }
         pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
         pModel.select();
@@ -174,8 +176,9 @@
         std::list<Record_Cut_Video_info> lst;
         QSqlTableModel pModel(NULL, *m_db);
         pModel.setTable(VSSLocalSettingTbl_Sqlite_TABLE_NAME);;
-        for (auto whereKeyValue : whereKeyValues ) {
-            pModel.setFilter(QObject::tr((string(whereKeyValue.first)+" = '%1'").c_str()).arg(QString::fromUtf8(whereKeyValue.second.c_str())));
+        if (whereKeyValues.size() > 0) {
+            auto filter = QObject::tr((string(" 1=1 ")+getWhereColumnNameValuePair(whereKeyValues)).c_str());
+            pModel.setFilter(filter);
         }
         pModel.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
         pModel.select();
diff --git a/QiaoJiaSystem/FaceSearchServer/AlarmServer.hpp b/QiaoJiaSystem/FaceSearchServer/AlarmServer.hpp
index 1fe1b9c..811f78a 100644
--- a/QiaoJiaSystem/FaceSearchServer/AlarmServer.hpp
+++ b/QiaoJiaSystem/FaceSearchServer/AlarmServer.hpp
@@ -1,4 +1,5 @@
 //
+// 瀵规瘮鎶ヨ鐨勫熀绫�
 // Created by ps on 2/26/18.
 //
 
@@ -13,6 +14,9 @@
 #include <basic/util/thread/MultiThread.h>
 #include <basic/util/BASE64/Base64.h>
 
+/***
+ * 闇�瑕佸姣旂殑涓�鏉¤褰�
+ */
 struct AlarmData {
     int num;
     std::string tableName;
@@ -20,6 +24,9 @@
     float threshold;
 };
 
+/***
+ * 鏁版嵁搴撲腑鏌ヨ鐨勪竴鏉¤褰�
+ */
 struct FeatureData {
     long face_id;
     std::string uuid;
@@ -29,6 +36,11 @@
     std::string idcard;
 };
 
+/***
+ * 瀛楃涓叉牴鎹鍙峰垎鍓插苟杩斿洖鏁版嵁
+ * @param str_list
+ * @return
+ */
 static std::vector<std::string> AlarmServerPropertyAnalyseByComma(std::string str_list) {
     std::vector<std::string> result;
     char *property_list = const_cast<char *>(str_list.c_str());
@@ -60,6 +72,9 @@
     CPU_Number = 1
 };
 
+/***
+ * 鎶ヨ鏈嶅姟鍩虹被
+ */
 class AlarmServer {
 
 public:
@@ -77,11 +92,19 @@
         dataRemoveBuffer.clear();
     }
 
+    /***
+     * 鍒濆鍖栨椂浣跨敤绾跨▼鍔犺浇鏁版嵁搴�
+     * @param str_config
+     */
     void initDB(std::string str_config) {
         std::thread thd(loadDBCahce, this, str_config);
         thd.detach();
     }
 
+    /***
+     * 绉婚櫎鏁版嵁
+     * @param key
+     */
     void removeData(std::string key) {
         std::lock_guard<std::mutex> guard(dataRemoveBufferMtx);
         dataRemoveBuffer.insert(key);
diff --git a/QiaoJiaSystem/FaceSearchServer/CMakeLists.txt b/QiaoJiaSystem/FaceSearchServer/CMakeLists.txt
index 26f313c..5860601 100644
--- a/QiaoJiaSystem/FaceSearchServer/CMakeLists.txt
+++ b/QiaoJiaSystem/FaceSearchServer/CMakeLists.txt
@@ -89,7 +89,6 @@
 add_executable(${PROJECT_NAME}
     main.cpp
     rpc/FaceSearchServer.cpp
-    FaceSearchServerResources.cpp
     FaceFeatureSearchServerI.cpp
     FaceFeatureSearchServerI.h
     CasiaFaceWrapper/CasiaFaceWrapperN.cpp
diff --git a/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h b/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h
index 7940970..da4bb96 100644
--- a/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h
+++ b/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h
@@ -54,11 +54,10 @@
 static bool getRet(std::string startTime, std::string endTime) {
     auto crrentTime = AppUtil::getTimeSecString();
 
-    if (crrentTime.compare(startTime) > 0 && crrentTime.compare(endTime) < 0) {
+    if (crrentTime.compare(startTime) > 0 && (crrentTime.compare(endTime) < 0 || endTime == "0000-00-00 00:00:00")) {
         return true;
     }
     return false;
-
 }
 
 #endif //COMPARETEST_FACEDBCOMPARESERVER_H
diff --git a/QiaoJiaSystem/FaceSearchServer/FaceSearchServerResources.cpp b/QiaoJiaSystem/FaceSearchServer/FaceSearchServerResources.cpp
deleted file mode 100644
index b82cdeb..0000000
--- a/QiaoJiaSystem/FaceSearchServer/FaceSearchServerResources.cpp
+++ /dev/null
@@ -1,4 +0,0 @@
-//
-// Created by pans on 4/27/18.
-//
-
diff --git a/QiaoJiaSystem/FaceSearchServer/main.cpp b/QiaoJiaSystem/FaceSearchServer/main.cpp
index 054bd16..06d46ae 100644
--- a/QiaoJiaSystem/FaceSearchServer/main.cpp
+++ b/QiaoJiaSystem/FaceSearchServer/main.cpp
@@ -14,7 +14,7 @@
 using namespace std;
 
 int main(int argc, char **argv) {
-    std::cout<<__DATE__<<" "<<__TIME__<<std::endl;
+    std::cout << __DATE__ << " " << __TIME__ << std::endl;
     SAVE_APP_ARGS;
     ENABLEGLOG(GET_STR_CONFIG("logPath").c_str());
     auto ich = Ice::initialize(argc, argv);
diff --git a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
index c353675..e17ee5b 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
@@ -143,135 +143,198 @@
  */
 void BASICGB28181::FFmpegDecoderJPG::BareFlowDecoderThd(FFmpegDecoderJPG *p_this) {
     DBG(p_this->m_camIdx << "  BareFlowDecoderThd ok ... gpuIdx is " << p_this->m_gpuIdx);
-    p_this->m_running = true;
-    av_register_all();
-    avformat_network_init();
-    AVFormatContext *ic = avformat_alloc_context();
+    while (!p_this->m_running) {
 
-    unsigned char *iobuffer = (unsigned char *) av_malloc(p_this->m_buf_size);
-    AVIOContext *avio = avio_alloc_context(iobuffer, p_this->m_buf_size, 0, p_this, p_this->read_data, NULL, NULL);
-    ic->pb = avio;
+        p_this->m_running = true;
+//    av_register_all();
+//    avformat_network_init();
+        p_this->ic = avformat_alloc_context();
 
-    int err = av_probe_input_buffer(ic->pb, &ic->iformat, nullptr, nullptr, 0, p_this->m_buf_size);
-    int err1 = avformat_open_input(&ic, "", NULL, NULL);
-    int err2 = avformat_find_stream_info(ic, nullptr);
-    int vi = -1;
-    for (int i = 0; i < ic->nb_streams; ++i) {
-        if (ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
-            vi = i;
-            break;
+        p_this->iobuffer = (unsigned char *) av_malloc(p_this->m_buf_size);
+        if (!p_this->iobuffer) {
+            ERR("av_malloc: err======" << p_this->m_camIdx);
+            p_this->m_running = false;
+            continue;
         }
-    }
-    AVStream *stream = ic->streams[vi];
-    p_this->video_st = stream;
-    AVCodecContext *ctx = avcodec_alloc_context3(nullptr);
-    int err3 = avcodec_parameters_to_context(ctx, stream->codecpar);
+        p_this->avio = avio_alloc_context(p_this->iobuffer, p_this->m_buf_size, 0, p_this, p_this->read_data, NULL,
+                                          NULL);
+        if (!p_this->avio) {
+            ERR("avio_alloc_context: err======" << p_this->m_camIdx);
+            p_this->m_running = false;
+            continue;
+        }
+        p_this->ic->pb = p_this->avio;
 
-    AVCodec *codec = avcodec_find_decoder(ctx->codec_id);
-    //鏄惁鍚敤GPU
-    if (p_this->m_gpuIdx >= 0) {
-        if (codec != NULL) {
-            char cuvidName[40] = {0};
-            sprintf(cuvidName, "%s_cuvid", codec->name);
-            if (!strcmp(codec->name, "h264") || !strcmp(codec->name, "h265") || !strcmp(codec->name, "hevc")) {
-                AVCodec *codec_cuvid = avcodec_find_decoder_by_name(cuvidName);
-                if (codec_cuvid != NULL) {
-                    codec = codec_cuvid;
-                } else {
+        int err = av_probe_input_buffer(p_this->ic->pb, &p_this->ic->iformat, nullptr, nullptr, 0, p_this->m_buf_size);
+        if (err) {
+            ERR("av_probe_input_buffer: err======" << err << p_this->m_camIdx);
+            p_this->m_running = false;
+            continue;
+        }
+        err = avformat_open_input(&p_this->ic, "", NULL, NULL);
+        if (err) {
+            ERR("avformat_open_input: err======" << err << p_this->m_camIdx);
+            p_this->m_running = false;
+            continue;
+        }
+//    int err2 = avformat_find_stream_info(ic, nullptr);
+        err = avformat_find_stream_info(p_this->ic, NULL);
+        if (err) {
+            ERR("avformat_find_stream_info: err======" << err << p_this->m_camIdx);
+//        avformat_close_input(&p_this->ic);
+//        DBG("avformat_close_input(&p_this->ic);");
+            p_this->m_running = false;
+            continue;
+        }
+        int vi = -1;
+        for (int i = 0; i < p_this->ic->nb_streams; ++i) {
+            if (p_this->ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
+                vi = i;
+                break;
+            }
+        }
+        p_this->stream = p_this->ic->streams[vi];
+        p_this->video_st = p_this->stream;
+        p_this->ctx = avcodec_alloc_context3(nullptr);
+        err = avcodec_parameters_to_context(p_this->ctx, p_this->stream->codecpar);
+        if (err) {
+            ERR("avcodec_parameters_to_context: err======" << err << p_this->m_camIdx);
+//        avformat_close_input(&p_this->ic);
+//        DBG("avformat_close_input(&p_this->ic);");
+            p_this->m_running = false;
+            continue;
+        }
+
+        p_this->codec = avcodec_find_decoder(p_this->ctx->codec_id);
+        //鏄惁鍚敤GPU
+        if (p_this->m_gpuIdx >= 0) {
+            if (p_this->codec != NULL) {
+                char cuvidName[40] = {0};
+                sprintf(cuvidName, "%s_cuvid", p_this->codec->name);
+                if (!strcmp(p_this->codec->name, "h264") || !strcmp(p_this->codec->name, "h265") ||
+                    !strcmp(p_this->codec->name, "hevc")) {
+                    p_this->codec_cuvid = avcodec_find_decoder_by_name(cuvidName);
+                    if (p_this->codec_cuvid != NULL) {
+                        p_this->codec = p_this->codec_cuvid;
+                    } else {
 //                    return false;
-                    ERR("codec_cuvid is NULL");
+                        ERR("codec_cuvid is NULL" << p_this->m_camIdx);
+                    }
                 }
             }
         }
-    }
-    int err4 = avcodec_open2(ctx, codec, nullptr);
-
-    AVPacket pkt;
-    av_init_packet(&pkt);
-
-    AVFrame *frame = av_frame_alloc();
-    unsigned int usleepTime = (1000 / p_this->m_fps) - 12;
-    usleepTime *= 1000;
-    DBG(" before while <<usleepTime is " << usleepTime);
-    while (p_this->m_running) {
-#ifdef TestCode
-        ClockTimer Test("while time");
-#endif
-        int err5 = av_read_frame(ic, &pkt);
-        //# todo save package
-        p_this->frame_number++;
-
-        int err6 = avcodec_send_packet(ctx, &pkt);
-//        av_packet_unref(&pkt);
-        int err7 = avcodec_receive_frame(ctx, frame);
-        if ((err7 == AVERROR(EAGAIN)) || (err5 < 0) || (err6 < 0)) {
-            ERR(" error << err7:" << err7 << "  err5: " << err5 << " err6: " << err6);
-            usleep(40000);
+        err = avcodec_open2(p_this->ctx, p_this->codec, nullptr);
+        if (err) {
+            ERR("avcodec_open2: err======" << err << p_this->m_camIdx);
+//        avformat_close_input(&p_this->ic);
+//        DBG("avformat_close_input(&p_this->ic);");
+//        avcodec_free_context(&p_this->ctx);
+//        DBG("avcodec_free_context(&p_this->ctx);");
+            p_this->m_running = false;
             continue;
         }
-        //DBG("GotPicture "<<m_camId<<":"<<frame_number);
-        //鏀惧湪姝ゅ鏄洜涓轰箣鍓嶆斁鍦ㄥ墠闈�,鏀跺埌鐨勫抚涓嶅畬鎴�
-        p_this->SaveToPacketVector(pkt);
-        p_this->CheckSave();
+
+        av_init_packet(&p_this->pkt);
+
+        p_this->frame = av_frame_alloc();
+        unsigned int usleepTime = (1000 / p_this->m_fps) - 12;
+        usleepTime *= 1000;
+        DBG("===open ok, camid: " << p_this->m_camIdx);
+        while (p_this->m_running) {
+#ifdef TestCode
+            ClockTimer Test("while time");
+#endif
+            av_packet_unref(&p_this->pkt);
+            p_this->pkt.data = NULL;
+            p_this->pkt.size = 0;
+
+            int err5 = av_read_frame(p_this->ic, &p_this->pkt);
+            //# todo save package
+            p_this->frame_number++;
+
+            int err6 = avcodec_send_packet(p_this->ctx, &p_this->pkt);
+            int err7 = avcodec_receive_frame(p_this->ctx, p_this->frame);
+            if ((err7 == AVERROR(EAGAIN)) || (err5 < 0) || (err6 < 0)) {
+                ERR("  err======: err7" << err7 << "  err5: " << err5 << " err6: " << err6 << p_this->m_camIdx);
+                usleep(40000);
+                continue;
+            }
+            //DBG("GotPicture "<<m_camId<<":"<<frame_number);
+            //鏀惧湪姝ゅ鏄洜涓轰箣鍓嶆斁鍦ㄥ墠闈�,鏀跺埌鐨勫抚涓嶅畬鎴�
+            p_this->SaveToPacketVector(p_this->pkt);
+            p_this->CheckSave();
 
 //        BASICGB28181::avframe_to_cvmat(frame).copyTo(p_this->m_image);
-        p_this->m_image = std::move(BASICGB28181::avframe_to_cvmat(frame));
+            p_this->m_image = std::move(BASICGB28181::avframe_to_cvmat(p_this->frame));
 
-#ifdef TestCode
-        {
-//            TestCode 娴嬭瘯浠g爜淇濆瓨鍥剧墖鍒版湰鍦�
-            ClockTimer cl("TestCode");
-            std::string strNewTime2 = AppUtil::getTimeUSecString();
-            cv::putText(p_this->m_image, strNewTime2, cv::Point(408, 540), cv::HersheyFonts::FONT_HERSHEY_PLAIN,
-                        5, cv::Scalar(255, 255, 0), 2);
-            std::thread test([&](cv::Mat img, std::string strThing) {
+            if (p_this->m_SnapshotNotSaveRet && (p_this->pkt.flags & AV_PKT_FLAG_KEY)) {
                 try {
-                    std::string strNewTime = "tmpDec/";
-                    strNewTime.append(p_this->m_camIdx + "_").append(strThing).append(".jpg");
-//                    cv::imwrite(strNewTime, p_this->m_image);
+                    std::string strNewName = "./";
+                    strNewName.append(p_this->m_camIdx).append(".jpg");
+                    cv::imwrite(strNewName, p_this->m_image);
+                    p_this->m_SnapshotNotSaveRet = false;
                 } catch (std::exception ex) {
                     ERR(ex.what());
                 }
-            }, p_this->m_image, strNewTime2);
-            test.detach();
-        }
+            }
+
+
+#ifdef TestCode
+                {
+        //            TestCode 娴嬭瘯浠g爜淇濆瓨鍥剧墖鍒版湰鍦�
+                    ClockTimer cl("TestCode");
+                    std::string strNewTime2 = AppUtil::getTimeUSecString();
+                    cv::putText(p_this->m_image, strNewTime2, cv::Point(408, 540), cv::HersheyFonts::FONT_HERSHEY_PLAIN,
+                                5, cv::Scalar(255, 255, 0), 2);
+                    std::thread test([&](cv::Mat img, std::string strThing) {
+                        try {
+                            std::string strNewTime = "tmpDec/";
+                            strNewTime.append(p_this->m_camIdx + "_").append(strThing).append(".jpg");
+        //                    cv::imwrite(strNewTime, p_this->m_image);
+                        } catch (std::exception ex) {
+                            ERR(ex.what());
+                        }
+                    }, p_this->m_image, strNewTime2);
+                    test.detach();
+                }
 #endif
 
-        //#todo send to other thd
+                //#todo send to other thd
 #ifdef TestCode
-        DBG("emitSigal(\"DecoderImageOK\") begin");
+                DBG("emitSigal(\"DecoderImageOK\") begin");
 #endif
-        //瑙﹀彂淇″彿
-        gSignalLock.emitSigal(p_this->m_camIdx + "DecoderImageOK");
+            //瑙﹀彂淇″彿
+            gSignalLock.emitSigal(p_this->m_camIdx + "DecoderImageOK");
 //#ifdef TestCode
 //        DBG("emitSigal(\"DecoderImageOK\") after");
 //#endif
 
-        DBG("emitSigal(\"DecoderImageOK\") after");
-        DBG("p_this->m_camIdx is " << p_this->m_camIdx << " queue size is " << p_this->m_rtpQueue.count_queue());
+            DBG("emitSigal(\"DecoderImageOK\") after");
+            DBG("p_this->m_camIdx is " << p_this->m_camIdx << " queue size is " << p_this->m_rtpQueue.count_queue());
 
 #ifdef TestCode
-        {
-            ClockTimer cl("waitTime");
-            int loop = 0;
-            //#TODO
-//            while ((loop++ < 3000) && !(p_this->m_readData)) {
-//                usleep(10);
-//            }
+            {
+                ClockTimer cl("waitTime");
+                int loop = 0;
+                //#TODO
+    //            while ((loop++ < 3000) && !(p_this->m_readData)) {
+    //                usleep(10);
+    //            }
 
-            usleep(30000);
-            DBG("p_this->m_readData is " << p_this->m_readData << "  loop is " << loop << " queue size is "
-                                         << p_this->m_rtpQueue.count_queue());
-            p_this->m_readData = false;
-//        usleep(12000);
-        }
+                usleep(30000);
+                DBG("p_this->m_readData is " << p_this->m_readData << "  loop is " << loop << " queue size is "
+                                             << p_this->m_rtpQueue.count_queue());
+                p_this->m_readData = false;
+    //        usleep(12000);
+            }
 #else
-        usleep(usleepTime);
+//            usleep(usleepTime);
 #endif
 
+        }
+        DBG(" after while ");
+        av_frame_free(&p_this->frame);
     }
-    DBG(" after while ");
-    av_frame_free(&frame);
 }
 
 bool BASICGB28181::FFmpegDecoderJPG::startThd(const std::string &camIdx, const int &fps, const int &gpuIdx) {
@@ -283,6 +346,7 @@
             setenv("CUDA_VISIBLE_DEVICES", std::to_string(gpuIdx).c_str(), 0);
         }
         m_camIdx = camIdx;
+        DBG("BareFlowDecoderThd camIdx : " << camIdx);
         std::thread t_BareFlowDecoder(BareFlowDecoderThd, this);
         t_BareFlowDecoder.detach();
     );
@@ -375,7 +439,7 @@
             delete iter->m_packet.data;
             iter = m_packetsVec.erase(iter);
             while (!(iter->m_packet.flags & AV_PKT_FLAG_KEY)) {
-//                INFO("DropFrame: " << iter->m_frameId);
+                INFO("DropFrame: " << iter->m_frameId);
                 delete iter->m_packet.data;
                 iter = m_packetsVec.erase(iter);
             }
@@ -386,15 +450,18 @@
 
 bool BASICGB28181::FFmpegDecoderJPG::SaveVideo(std::string path, int64_t lastFrameId) {
     std::lock_guard<std::mutex> lock(g_mutex);
-    INFO("SaveVideo: " << path);
+    INFO("SaveVideo: " << path << "m_packetsVec.size : " << m_packetsVec.size());
     if (!m_packetsVec.empty()) {
         startWrite(path.c_str());
         int64_t firstKeyFramePts = m_packetsVec[0].m_packet.pts;
         int64_t firstKeyFrameDts = m_packetsVec[0].m_packet.dts;
+        unsigned long int frame_index = 0;
         for (const auto &item:m_packetsVec) {
             if (item.m_frameId < lastFrameId) {
                 DBG("item.m_frameId < lastFrameId   " << item.m_frameId << "  " << lastFrameId);
-                conversion(const_cast<AVPacket *> (&item.m_packet), firstKeyFramePts, firstKeyFrameDts, video_st);
+                conversion(const_cast<AVPacket *> (&item.m_packet), firstKeyFramePts, firstKeyFrameDts, video_st,
+                           frame_index);
+                frame_index++;
                 av_write_frame(m_pOutFmtCtx, &item.m_packet);
             } else {
                 DBG("item.m_frameId > lastFrameId   " << item.m_frameId << "  " << lastFrameId);
@@ -517,11 +584,12 @@
 int BASICGB28181::FFmpegDecoderJPG::stopWrite() {
     if (m_pOutFmtCtx == nullptr) return -1;
     av_write_trailer(m_pOutFmtCtx);
-    avio_close(m_pOutFmtCtx->pb);
+
     avcodec_close(m_pOutFmtCtx->streams[0]->codec);
     av_freep(&m_pOutFmtCtx->streams[0]->codec);
     av_freep(&m_pOutFmtCtx->streams[0]);
 
+    avio_close(m_pOutFmtCtx->pb);
     av_free(m_pOutFmtCtx);
     m_pOutFmtCtx = nullptr;
     m_bstartWrite = false;
@@ -530,23 +598,23 @@
 
 
 void BASICGB28181::FFmpegDecoderJPG::conversion(void *packet, const long int &firstKeyPts, const long int &firstKeyDts,
-                                                void *inVideoStream) {
+                                                void *inVideoStream, unsigned long int frame_index) {
     if ((packet != nullptr) && (inVideoStream != nullptr)) {
         AVStream *inStream = (AVStream *) inVideoStream;
         AVPacket *pkg = static_cast<AVPacket *>(packet);
-//            static int a = 0;
-//            pkg->dts = a++;
-//            pkg->pts = a;
-        pkg->pts -= firstKeyPts;
-        pkg->dts -= firstKeyDts;
-        pkg->pts = av_rescale_q_rnd(pkg->pts, inStream->time_base,
-                                    m_pOutVideo_stream->time_base,
-                                    (AVRounding) (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
-        pkg->dts = av_rescale_q_rnd(pkg->dts, inStream->time_base,
-                                    m_pOutVideo_stream->time_base,
-                                    (AVRounding) (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
-        pkg->duration = av_rescale_q(pkg->duration, inStream->time_base,
-                                     m_pOutVideo_stream->time_base);
-        pkg->pos = -1;
+
+
+        DBG("frame_index==%d\n" << frame_index);
+        //Write PTS
+        AVRational time_base1 = inStream->time_base;
+        //Duration between 2 frames (us)
+        int64_t calc_duration = (double) AV_TIME_BASE / av_q2d(inStream->r_frame_rate);
+        //Parameters
+        pkg->pts = (double) (frame_index * calc_duration) / (double) (av_q2d(time_base1) * AV_TIME_BASE);
+        pkg->dts = pkg->pts;
+        pkg->duration = (double) calc_duration / (double) (av_q2d(time_base1) * AV_TIME_BASE);
+
+//        DBG("pts:" << pkg->pts);
+//        DBG("dts:" << pkg->dts);
     }
 }
\ No newline at end of file
diff --git a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h
index a593baa..dcfa1d2 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h
+++ b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h
@@ -166,7 +166,18 @@
         //瀵规敹鍒扮殑甯ц繘琛岃鏁�
         int64_t m_frameIndex = 0;
 
+//*******************************************
+        AVFormatContext *ic;
+        unsigned char *iobuffer;
+        AVIOContext *avio;
+        AVStream *stream;
+        AVCodecContext *ctx;
+        AVCodec *codec;
+        AVCodec *codec_cuvid;
+        AVPacket pkt;
+        AVFrame *frame;
 
+        //*******************************************
         //灏嗗抚淇濆瓨鍒板抚鏁扮粍
         void SaveToPacketVector(AVPacket &packet);
 
@@ -188,7 +199,8 @@
         int stopWrite();
 
         //瀵筽acket鍋氳浆鎹�
-        void conversion(void *packet, const long int &firstKeyPts, const long int &firstKeyDts, void *inVideoStream);
+        void conversion(void *packet, const long int &firstKeyPts, const long int &firstKeyDts, void *inVideoStream,
+                        unsigned long int frame_index = 0);
 
         bool m_bstartWrite = {false};
         bool m_bFirstKeyFrame = {false};
@@ -215,6 +227,7 @@
         int m_gpuIdx;
         int m_fps;
         bool m_PackageState;
+        bool m_SnapshotNotSaveRet{true};
         std::string m_camIdx;
 
         MyQueue<frameBuffInfo *> m_rtpQueue;
diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
index bf433a6..8a1d652 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
@@ -35,6 +35,38 @@
 
 bool BASICGB28181::VideoCaptureElementWithRtp::startRtpStream(int streamTransType) {
 
+    std::thread waitSignalAndEmit([&](BASICGB28181::VideoCaptureElementWithRtp *p_this) {
+        p_this->m_waitSignal = true;
+        while (p_this->m_waitSignal) {
+//#TODO wait test
+#ifdef TestCode
+            DBG("waitSignal(\"DecoderImageOK\") begin");
+#endif
+            gSignalLock.waitSignal(p_this->m_chanPubID + "DecoderImageOK");
+#ifdef TestCode
+            DBG("waitSignal(\"DecoderImageOK\") after");
+#endif
+            p_this->m_picCount++;
+            //鍑犲紶閫変竴寮犳斁鍏edis
+            if (p_this->m_picCount % m_nPicsPickOne != 0) {
+                continue;
+            } else {
+                p_this->m_picCount.store(0);
+            }
+
+            p_this->m_fFmpegDecoderJPG.getImage().copyTo(p_this->m_image);
+            {
+                cv::Mat copyMat;
+                std::string imageName = p_this->m_fFmpegDecoderJPG.GetImageName();
+                p_this->m_image.copyTo(copyMat);
+                m_pManager->SaveImageToRedis(p_this->m_chanPubID, imageName, copyMat);
+            }
+            p_this->submit();
+        }
+        INFO("waitSignalAndEmit is exit...");
+    }, this);
+    waitSignalAndEmit.detach();
+
     TryCath(
     //--------------鍥芥爣璁惧鎴栧垯鍥芥爣涓嬬骇骞冲彴蹇呴』鏀寔GB28181-2016----------------------------------------------
         std::thread videoCaptureElementThd([&](VideoCaptureElementWithRtp *p_this, int streamType) {
@@ -69,12 +101,19 @@
                 p_this->m_running = true;
                 p_this->m_fFmpegDecoderJPG.startThd(p_this->m_chanPubID, p_this->m_fps, p_this->m_gpuIdx);
                 while (p_this->m_running) {
-                    usleep(300000);
+//                    if(p_this->m_fFmpegDecoderJPG.getRunning()) {
+                        usleep(300000);
+//                    }else{
+//                        p_this->m_running = false;
+//                        break;
+//                    }
                 }
                 DBG("videoCaptureElementThd stop ...");
                 C_RealVideoStop(lrealhandle);
+                p_this->m_waitSignal = false;
                 DBG("videoCaptureElementThd stop ok...");
             } else {
+                p_this->m_waitSignal = false;
                 p_this->m_running = false;
                 p_this->m_fFmpegDecoderJPG.stopThd();
                 ERR(p_this->m_chanPubID << " C_RealVideoStart is error lrealhandle is  " << lrealhandle);
@@ -124,42 +163,23 @@
 }
 
 void BASICGB28181::VideoCaptureElementWithRtp::threadFunc() {
+    if ((!m_running) || (!m_waitSignal)) {
+        if (reopenTime < 0) {
+            stop();
+            INFO("grabFrame faild, element stopping");
+            return;
+        } else {
+            usleep(reopenTime * 1000);
+            INFO("grabFrame faild, try reopen video: ");
+            startRtpStream(m_streamTransType);
+            return;
+        }
+    }
     fireConnectors();
 }
 
 void BASICGB28181::VideoCaptureElementWithRtp::threadInitial() {
 
-    std::thread waitSignalAndEmit([&](BASICGB28181::VideoCaptureElementWithRtp *p_this) {
-        p_this->m_waitSignal = true;
-        while (p_this->m_waitSignal) {
-//#TODO wait test
-#ifdef TestCode
-            DBG("waitSignal(\"DecoderImageOK\") begin");
-#endif
-            gSignalLock.waitSignal(p_this->m_chanPubID + "DecoderImageOK");
-#ifdef TestCode
-            DBG("waitSignal(\"DecoderImageOK\") after");
-#endif
-            p_this->m_picCount++;
-            //鍑犲紶閫変竴寮犳斁鍏edis
-            if (p_this->m_picCount % m_nPicsPickOne != 0) {
-                continue;
-            } else {
-                p_this->m_picCount.store(0);
-            }
-
-            p_this->m_fFmpegDecoderJPG.getImage().copyTo(p_this->m_image);
-            {
-                cv::Mat copyMat;
-                std::string imageName = p_this->m_fFmpegDecoderJPG.GetImageName();
-                p_this->m_image.copyTo(copyMat);
-                m_pManager->SaveImageToRedis(p_this->m_chanPubID, imageName, copyMat);
-            }
-            p_this->submit();
-        }
-        INFO("waitSignalAndEmit is exit...");
-    }, this);
-    waitSignalAndEmit.detach();
     startRtpStream(m_streamTransType);
 }
 
diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
index 77751c3..cc6b4b9 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
@@ -40,6 +40,7 @@
         std::string MakeDir(const std::string &timeStamp);
 
     private:
+        int reopenTime{1000};
         int m_gpuIdx;
         int m_fps;
         int m_streamTransType;
diff --git a/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp b/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
index 85c5d4b..b6cbc28 100644
--- a/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
+++ b/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
@@ -139,8 +139,11 @@
                 Json::Value t_json;
                 t_json["Id"] = str_uuid; //涓婚敭
 
+                std::string feature_base64;
+                feature_base64 = base64.Encode(feature.data(), feature.size());
+
                 //#鍦ㄥ姣斾腑娣诲姞鐗瑰緛鍊�
-                t_json["FaceFeature"] = "base64";
+                t_json["FaceFeature"] = feature_base64;
                 t_json["personId"] = "";//鍏宠仈搴曞簱浜哄憳id,浜鸿劯id
                 t_json["BaseName"] = "";//鍏宠仈搴曞簱琛ㄥ悕
                 //#end
diff --git a/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h b/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h
index 0ae7935..44e7822 100644
--- a/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h
+++ b/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h
@@ -61,6 +61,7 @@
         str_brand = "";
         str_reserved = "";
         n_type = -1;
+        type = -1;
     }
 
     int n_id;//鑷id
@@ -76,6 +77,7 @@
     QString str_brand;//鎽勫儚鏈哄搧鐗�
     QString str_reserved;//棰勭暀
     int n_type;//棰勭暀
+    int type;// 0 rtsp, 1 gb28181
 };
 
 struct Record_Cam_Chn {
diff --git a/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp b/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
index 8070b13..f1a6d89 100644
--- a/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
+++ b/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
@@ -332,6 +332,7 @@
     rec.setValue("password", channelRec.str_password);
     rec.setValue("brand", channelRec.str_brand);
     rec.setValue("reserved", channelRec.str_reserved);
+    rec.setValue("type", channelRec.type);
 
     pModel.insertRecord(-1, rec);//TODO
 
@@ -510,6 +511,7 @@
             Record_Cam_Dev lChannelRec;
             QSqlRecord rec = pModel.record(i);
             lChannelRec.n_id = rec.value("id").toInt();
+            lChannelRec.type = rec.value("type").toInt();
             lChannelRec.str_cam_dev_id = rec.value("cam_dev_id").toString();
             lChannelRec.str_name = rec.value("name").toString();
             lChannelRec.str_addr = rec.value("addr").toString();
diff --git a/QiaoJiaSystem/VideoToImage/CMakeLists.txt b/QiaoJiaSystem/VideoToImage/CMakeLists.txt
index 1fe405c..6ca2f70 100644
--- a/QiaoJiaSystem/VideoToImage/CMakeLists.txt
+++ b/QiaoJiaSystem/VideoToImage/CMakeLists.txt
@@ -68,7 +68,7 @@
     /usr/include/x86_64-linux-gnu/qt5/QtCore/
     /usr/include/x86_64-linux-gnu/qt5/QtSql/
 
-    ../../BasicPlatForm/libs/hiredis-master/include
+    ../../../BasicPlatForm/libs/hiredis-master/include
     ../../../BasicPlatForm/basic/timer_counter/
 )
 
diff --git a/QiaoJiaSystem/VideoToImageMulth/CMakeLists.txt b/QiaoJiaSystem/VideoToImageMulth/CMakeLists.txt
index f6648c5..1a0c06c 100644
--- a/QiaoJiaSystem/VideoToImageMulth/CMakeLists.txt
+++ b/QiaoJiaSystem/VideoToImageMulth/CMakeLists.txt
@@ -93,7 +93,7 @@
 
     ../../../BasicPlatForm/libs/hiredis-master/lib
     ../../../BasicPlatForm/libs/mysqlpp/lib
-        ../../../BasicPlatForm/libs/mysql/lib
+    ../../../BasicPlatForm/libs/mysql/lib
 )
 
 add_executable(${PROJECT_NAME}
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
index 9eee39c..cbc7dfa 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
@@ -58,9 +58,10 @@
 //                                                 item.str_password.toStdString(), item.str_brand.toStdString());
                 INFO("cam add is " << item.str_addr.toStdString());
                 addCamera(t_camIdex, rtsp_url);
+                sleep(1);
             }
         } else {
-            ERR("searchCamDevTableAll size is 0");
+            ERR("searchCamDevTableByType size is 0");
         }
 
     } else {
@@ -115,7 +116,7 @@
 //
 //        }
         } else {
-            ERR("searchCamDevTableAll size is 0");
+            ERR("searchCamDevTableByType size is 0");
         }
     }
 }
diff --git a/QiaoJiaSystem/build/DataWebServer b/QiaoJiaSystem/build/DataWebServer
index 01f43df..664c46a 100755
--- a/QiaoJiaSystem/build/DataWebServer
+++ b/QiaoJiaSystem/build/DataWebServer
Binary files differ
diff --git a/QiaoJiaSystem/build/FaceDetectResourcesTest b/QiaoJiaSystem/build/FaceDetectResourcesTest
index 1afe23e..f9ddeb1 100755
--- a/QiaoJiaSystem/build/FaceDetectResourcesTest
+++ b/QiaoJiaSystem/build/FaceDetectResourcesTest
Binary files differ
diff --git a/QiaoJiaSystem/build/FaceDetectServer b/QiaoJiaSystem/build/FaceDetectServer
index 8822702..0bc5e41 100755
--- a/QiaoJiaSystem/build/FaceDetectServer
+++ b/QiaoJiaSystem/build/FaceDetectServer
Binary files differ
diff --git a/QiaoJiaSystem/build/FaceExtractServer b/QiaoJiaSystem/build/FaceExtractServer
index 3dcfee4..e2aeb11 100755
--- a/QiaoJiaSystem/build/FaceExtractServer
+++ b/QiaoJiaSystem/build/FaceExtractServer
Binary files differ
diff --git a/QiaoJiaSystem/build/FaceSearchServer b/QiaoJiaSystem/build/FaceSearchServer
index 3953b34..5a2e1ea 100755
--- a/QiaoJiaSystem/build/FaceSearchServer
+++ b/QiaoJiaSystem/build/FaceSearchServer
Binary files differ
diff --git a/QiaoJiaSystem/build/TestCilent b/QiaoJiaSystem/build/TestCilent
index fdebc81..eb84aef 100755
--- a/QiaoJiaSystem/build/TestCilent
+++ b/QiaoJiaSystem/build/TestCilent
Binary files differ
diff --git a/QiaoJiaSystem/build/VideoAnalysFromHC b/QiaoJiaSystem/build/VideoAnalysFromHC
index 9e1015b..6343aa6 100755
--- a/QiaoJiaSystem/build/VideoAnalysFromHC
+++ b/QiaoJiaSystem/build/VideoAnalysFromHC
Binary files differ
diff --git a/QiaoJiaSystem/build/YoloDetectClientTest b/QiaoJiaSystem/build/YoloDetectClientTest
index 7d376dd..216cd5e 100755
--- a/QiaoJiaSystem/build/YoloDetectClientTest
+++ b/QiaoJiaSystem/build/YoloDetectClientTest
Binary files differ
diff --git a/QiaoJiaSystem/build/YoloServer b/QiaoJiaSystem/build/YoloServer
index 662587b..43d76f7 100755
--- a/QiaoJiaSystem/build/YoloServer
+++ b/QiaoJiaSystem/build/YoloServer
Binary files differ
diff --git a/QiaoJiaSystem/build/runAll.sh b/QiaoJiaSystem/build/runAll.sh
index ca3a136..56b4abe 100644
--- a/QiaoJiaSystem/build/runAll.sh
+++ b/QiaoJiaSystem/build/runAll.sh
@@ -1,18 +1,17 @@
 #!/usr/bin/env bash
 
-MYLDPATH="~/Apps"
-MY3RDLIBSPATH="~/Apps/BasicPlatForm/libs/"
-MYLOGPATH="~/work/log/"
+MYLDPATH="/home/basic/Apps"
+MY3RDLIBSPATH="/home/basic/Apps/BasicPlatForm/libs/"
+MYLOGPATH="/home/basic/work/log/"
 
 #todo
-#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/media/basic/cdbfb548-3100-4738-b9c1-0a7e1e002170/c++/Qt/BasicPlatForm/libs/hcTool/HCNetSDK64/lib:/media/basic/cdbfb548-3100-4738-b9c1-0a7e1e002170/c++/Qt/BasicPlatForm/libs/hcTool/HCNetSDK64/lib/HCNetSDKCom
-export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${MY3RDLIBSPATH}/hcTool/HCNetSDK64/lib:${MY3RDLIBSPATH}/hcTool/HCNetSDK64/lib/HCNetSDKCom:${MY3RDLIBSPATH}/ffmpeg/lib:${MY3RDLIBSPATH}/opencv/lib:${MY3RDLIBSPATH}/Casia_Face/FaceSdk/lib/gpu:${MY3RDLIBSPATH}/FastDFS/lib:${MY3RDLIBSPATH}/Ice-3.7.0/lib64:${MY3RDLIBSPATH}/DarkNet/lib:${MY3RDLIBSPATH}/libopenssl/lib:${MY3RDLIBSPATH}/uniview/lib
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${MY3RDLIBSPATH}/hcTool/HCNetSDK64/lib:${MY3RDLIBSPATH}/hcTool/HCNetSDK64/lib/HCNetSDKCom:${MY3RDLIBSPATH}/ffmpeg/lib:${MY3RDLIBSPATH}/opencv/lib:${MY3RDLIBSPATH}/Casia_Face/FaceSdk/lib/gpu:${MY3RDLIBSPATH}/FastDFS/lib:${MY3RDLIBSPATH}/Ice-3.7.0/lib64:${MY3RDLIBSPATH}/DarkNet/lib:${MY3RDLIBSPATH}/libopenssl/lib:${MY3RDLIBSPATH}/uniview/lib:${MY3RDLIBSPATH}/libboost/lib/:${MY3RDLIBSPATH}/sqlite/lib/:${MY3RDLIBSPATH}/glog/lib/:${MY3RDLIBSPATH}/hiredis-master/lib:${MY3RDLIBSPATH}/mysql/lib:${MY3RDLIBSPATH}/mysqlpp/lib:${MY3RDLIBSPATH}/GB28181/libs
 
 startFunc() {
     PROC=`ps aux | grep "$1" | grep -v grep | grep -v tail`
     if [ -z "${PROC}" ]; then
         date +%D-%T" $1 start"
-        nohup ./$1 > ${MYLOGPATH}/Log$1`date +%Y-%m-%d_%T` &
+        nohup ./$1 1> ${MYLOGPATH}/Log$1`date +%Y-%m-%d_%T` 2>&1  &
         return 1
     else
         echo "$1 is exists"
@@ -20,33 +19,137 @@
     fi
 }
 
-#start FaceExtractServer
-startFunc FaceExtractServer
+#$1:funcName; $2:GB28181_Enable,en:1,dis:0;
+#$3:gpu.index; $4:CamStartNO; $5:CamEndNO; $6:RpcYOLOPort;
+#$7:RpcFDPort; $8:RpcFEPort; $9:RpcFSPort $10:RpcVTIMPort;
+startVAHK() {
+	date +%D-%T" $1 start"
+	nohup ./$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} 1> ${MYLOGPATH}/Log$1`date +%Y-%m-%d_%T`_${10} 2>&1  &
+	return 1
+}
 
-#start FaceDetectServer
-startFunc FaceDetectServer
+#$1:funcName; $2:GB28181_Enable,en:1,dis:0;
+#$3:gpu.index; $4:CamStartNO; $5:CamEndNO; $6:RpcVTIMPort
+startVTIM() {
+	date +%D-%T" $1 start"
+	nohup ./$1 $2 $3 $4 $5 $6 1> ${MYLOGPATH}/Log$1`date +%Y-%m-%d_%T`_$6 2>&1  &
+	return 1
+}
 
-#start YoloServer
-startFunc YoloServer
+#$1:funcName; $2:gpu.index; $3:RpcYOLOPort; $4:thresh.detect;
+startYOLO() {
+	date +%D-%T" $1 start"
+	nohup ./$1 $2 $3 $4 1> ${MYLOGPATH}/Log$1`date +%Y-%m-%d_%T`_$3 2>&1  &
+	return 1
+}
 
-#start FaceSearchServer
-startFunc FaceSearchServer
+#$1:funcName; $2:gpu.index; $3:RpcFDPort; $4:thread.max;
+startFD() {
+	date +%D-%T" $1 start"
+	nohup ./$1 $2 $3 $4 1> ${MYLOGPATH}/Log$1`date +%Y-%m-%d_%T`_$3 2>&1  &
+	return 1
+}
 
-#start RecordVideo
-startFunc RecordVideo
+#$1:funcName; $2:gpu.index; $3:RpcFEPort; $4:thread.max;
+startFE() {
+	date +%D-%T" $1 start"
+	nohup ./$1 $2 $3 $4 1> ${MYLOGPATH}/Log$1`date +%Y-%m-%d_%T`_$3 2>&1  &
+	return 1
+}
 
-#start DataWebServer
-#startFunc DataWebServer
+#$1:funcName; $2:RpcFSPort; $3:thread.max;
+startFS() {
+	date +%D-%T" $1 start"
+	nohup ./$1 $2 $3 1> ${MYLOGPATH}/Log$1`date +%Y-%m-%d_%T`_$2 2>&1  &
+	return 1
+}
+
+
+startFunc test_cpu_mem.sh
+
 sh runWebSer.sh
 
+#start FaceExtractServer
+#$1:funcName; $2:gpu.index; $3:RpcFEPort; $4:thread.max;
+FaceExtractServerPROC=`ps aux | grep "FaceExtractServer" | grep -v grep | grep -v tail`
+if [ -z "${FaceExtractServerPROC}" ]; then
+	startFE FaceExtractServer 0 10021 2
+	startFE FaceExtractServer 1 10022 2
+#	startFE FaceExtractServer 0 10023 4
+#    startFE FaceExtractServer 1 10024 4
+else
+    echo "FaceExtractServer is exists"
+fi
+
+#start FaceDetectServer
+#$1:funcName; $2:gpu.index; $3:RpcFDPort; $4:thread.max;
+FaceDetectServerPROC=`ps aux | grep "FaceDetectServer" | grep -v grep | grep -v tail`
+if [ -z "${FaceDetectServerPROC}" ]; then
+	startFD FaceDetectServer 1 10011 2
+	sleep 3
+	startFD FaceDetectServer 0 10012 2
+#	startFD FaceDetectServer 1 10013 4
+#    startFD FaceDetectServer 0 10014 4
+else
+    echo "FaceDetectServer is exists"
+fi
+
+#start YoloServer
+#$1:funcName; $2:gpu.index; $3:RpcYOLOPort; $4:thresh.detect;
+YoloServerPROC=`ps aux | grep "YoloServer" | grep -v grep | grep -v tail`
+if [ -z "${YoloServerPROC}" ]; then
+	startYOLO YoloServer 0 10001 0.85
+	startYOLO YoloServer 1 10002 0.85
+#	startYOLO YoloServer 0 10003 0.85
+#    startYOLO YoloServer 1 10004 0.85
+else
+    echo "YoloServer is exists"
+fi
+
+#start FaceSearchServer
+#$1:funcName; $2:RpcFSPort; $3:thread.max;
+FaceSearchServerPROC=`ps aux | grep "FaceSearchServer" | grep -v grep | grep -v tail`
+if [ -z "${FaceSearchServerPROC}" ]; then
+	startFS FaceSearchServer 10031 2
+	sleep 3
+	startFS FaceSearchServer 10032 2
+#	startFS FaceSearchServer 10033 4
+#    startFS FaceSearchServer 10034 4
+else
+    echo "FaceSearchServer is exists"
+fi
+
+#start VideoToImageMulth
+#$1:funcName; $2:GB28181_Enable,en:1,dis:0;
+#$3:gpu.index; $4:CamStartNO; $5:CamEndNO; $6:RpcVTIMPort
+VideoToImageMulthPROC=`ps aux | grep "VideoToImageMulth" | grep -v grep | grep -v tail`
+if [ -z "${VideoToImageMulthPROC}" ]; then
+	startVTIM VideoToImageMulth 0 0 0 1 10041
+	startVTIM VideoToImageMulth 0 1 2 3 10042
+#	startVTIM VideoToImageMulth 0 0 8 11 10043
+#	startVTIM VideoToImageMulth 0 1 12 15 10044
+else
+    echo "VideoToImageMulth is exists"
+fi
 
 #start VideoAnalysFromHC
+#$1:funcName; $2:GB28181_Enable,en:1,dis:0;
+#$3:gpu.index; $4:CamStartNO; $5:CamEndNO; $6:RpcYOLOPort;
+#$7:RpcFDPort; $8:RpcFEPort; $9:RpcFSPort $10:RpcVTIMPort;
 VideoAnalysPROC=`ps aux | grep "VideoAnalysFromHC" | grep -v grep | grep -v tail`
 if [ -z "${VideoAnalysPROC}" ]; then
-    date +%D-%T" VideoAnalysFromHC start"
-   nohup ./VideoAnalysFromHC 2> /dev/null > ${MYLOGPATH}/LogVideoAnalysFromHC`date +%Y-%m-%d_%T` &
+	startVAHK VideoAnalysFromHC 0 1 0 1 10001 10011 10021 10031 10041
+	startVAHK VideoAnalysFromHC 0 0 2 3 10002 10012 10022 10032 10042
+#	startVAHK VideoAnalysFromHC 0 1 8 11 10003 10013 10023 10033 10043
+#	startVAHK VideoAnalysFromHC 0 0 12 15 10004 10014 10024 10034 10044
 else
     echo "VideoAnalysFromHC is exists"
 fi
 
 
+cd /home/basic/Apps/BasicPlatForm/libs/srs
+nohup ./runRtmpServer.sh &
+
+cd /usr/local/redis/bin
+nohup ./redis-server ../redis.conf &
+
diff --git a/QiaoJiaSystem/build/scpToSer.sh b/QiaoJiaSystem/build/scpToSer.sh
old mode 100644
new mode 100755
index fda9895..b726b31
--- a/QiaoJiaSystem/build/scpToSer.sh
+++ b/QiaoJiaSystem/build/scpToSer.sh
@@ -10,7 +10,7 @@
     des_pass=123
     expect -c "
 #    spawn scp -P41100 ${CUR_PATH}"/"$1 basic@58.118.225.79:/home/basic/Apps/QiaoJiaSystem/build 
-    spawn scp  ${CUR_PATH}"/"$1 basic@192.168.1.203:/home/basic/Apps/QiaoJiaSystem/build 
+    spawn scp  ${CUR_PATH}"/"$1 basic@192.168.1.182:/home/basic/Apps/QiaoJiaSystem/build 
     expect \"password:\"
     send \"${des_pass}\r\"
     expect eof
@@ -29,12 +29,13 @@
     sendFile FaceExtractServer
     sendFile FaceSearchServer
     sendFile syncDBClient
-    sendFile RecordVideo
+    #sendFile RecordVideo
     sendFile VideoAnalysFromHC
+    sendFile VideoToImageMulth
     sendFile YoloServer
-    sendFile EncodeServer
-    sendFile killAll.sh
-    #sendFile runAll.sh
+    #sendFile EncodeServer
+    #sendFile killAll.sh
+    sendFile runAll.sh
     #sendFile runWebSer.sh
 else
     SENDFILE=$1
diff --git a/QiaoJiaSystem/build/syncDBClient b/QiaoJiaSystem/build/syncDBClient
index 5584639..32115d0 100755
--- a/QiaoJiaSystem/build/syncDBClient
+++ b/QiaoJiaSystem/build/syncDBClient
Binary files differ

--
Gitblit v1.8.0