chenshijun
2019-04-22 291dbcd9331cd0df41addef74defa4654ee034fb
QiaoJiaSystem/DataManagerServer/http_configserver.cpp
@@ -22,12 +22,14 @@
#include <time.h>
#include <dirent.h>
#include "basic/pipe_element/ffmpeg/basic_struct_for_video_image.h"
#include <basic/timer_counter/Clocktimer.h>
#include "vss/controller/VssDevTblController.h"
#include "vss/controller/VssChannelTblController.h"
#include "vss/controller/VssDomainUnitTblController.h"
#include "vss/controller/VssLocalSettingTblController.h"
#include "vss/controller/VssUpperSvrTblController.h"
#include "vss/controller/CamDevController.h"
using namespace std;
@@ -72,6 +74,10 @@
void devHttpServer_c::init(void) {
    std::string strDevId = appConfig.getStringProperty("DEV_ID");
    //nsq
    nsqMsgProducer = new BasicMsg::Nsq::NsqMsgProducer("127.0.0.1", "4150");
    nsqMsgProducer->init();
//    DSVAD010120181119
    m_batch = strDevId.substr(5, 2);
@@ -250,12 +256,16 @@
    BaseDao::initConnection();
    VssLocalSettingTblSqliteDao::instance()->setLDBTool(&db_c);
    BaseSqliteDao::setLDBTool(&db_c);
    VssDevTblController::instance()->registerHttpServices(_HttpSrvRetRecieve);
    VssChannelTblController::instance()->registerHttpServices(_HttpSrvRetRecieve);
    VssDomainUnitTblController::instance()->registerHttpServices(_HttpSrvRetRecieve);
    VssLocalSettingTblController::instance()->registerHttpServices(_HttpSrvRetRecieve);
    CamDevController::instance()->registerHttpServices(_HttpSrvRetRecieve);
    //todo
    CamDevController::instance()->nsqMsgProducerSet(nsqMsgProducer);
    VssUpperSvrTblController::instance()->registerHttpServices(_HttpSrvRetRecieve);
    _HttpSrvRetRecieve.start();
    _HttpSrvRetRecieve.waitForShutDown();
@@ -289,10 +299,10 @@
        elem["n_duration"] = iter->n_duration;
        elem["str_brand"] = iter->str_brand.toStdString();
        elem["str_reserved"] = iter->str_reserved.toStdString();
        cout << elem.toStyledString() << endl;
        DBG(elem.toStyledString());
        value.append(elem);
    }
    cout << value.toStyledString() << endl;
    DBG(value.toStyledString());
//    std::string out = value.toStyledString();
    std::string out = value.size() > 0 ? value.toStyledString() : "[]";
@@ -693,7 +703,7 @@
        }
        dev_rec.str_storage_dev_id = QString::fromLatin1((const char *) serialnumber);//获取磁盘阵列的设备id
        std::cout << dev_rec.str_storage_dev_id.toStdString() << std::endl;
        DBG(dev_rec.str_storage_dev_id.toStdString());
        ret = db_c.updateDeviceTable(dev_rec);
    } else {
        return "{\"ret_status\": \"传输错误,请检查!\"}";
@@ -740,7 +750,7 @@
    std::string str_result;
    std::string str_tmp;
    for (int i = 0; i < lvecUsefulChans.size(); i++) {
        std::cout << lvecUsefulChans.at(i) << std::endl;
        DBG(lvecUsefulChans.at(i));
        str_tmp = std::to_string(lvecUsefulChans.at(i));
        str_result += str_tmp;
        str_result += ",";
@@ -885,17 +895,17 @@
                }
            }
            cout << elem.toStyledString() << endl;
            DBG(elem.toStyledString());
            value.append(elem);
        }
        for (std::vector<int>::iterator it1 = chns.begin(); it1 != chns.end(); it1++) {
            chn_unused["n_chn"] = *it1;
            cout << "*it1" << *it1 << endl;
            DBG("*it1" << *it1);
            value.append(chn_unused);
        }
        cout << value.toStyledString() << endl;
        DBG(value.toStyledString());
//        std::string out = value.toStyledString();
        std::string out = value.size() > 0 ? value.toStyledString() : "[]";
        return out;
@@ -1000,22 +1010,35 @@
        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();
//        elem["str_cmp_thr"] = rec_sdk.str_cmp_thr.toStdString();
        cout << elem.toStyledString() << endl;
        DBG(elem.toStyledString());
        value.append(elem);
    }
    cout << value.toStyledString() << endl;
    DBG(value.toStyledString());
    std::string out = value.size() > 0 ? value.toStyledString() : "[]";
    return out;
}
@@ -1049,7 +1072,7 @@
        if ((!ret) || (serialnumber[0] == 0)) {
            return "{\"ret_status\": \"内容有误,请检查!\"}";
        }
        rec.type = 0;
        rec.str_cam_dev_id = QString::fromLatin1((const char *) serialnumber);//摄像机id cam_mac
        rec.str_name = QString::fromStdString(value["str_name"].asString());
        rec.str_addr = QString::fromStdString(value["str_addr"].asString());
@@ -1060,6 +1083,7 @@
        rec.str_username = QString::fromStdString(value["str_username"].asString());
        rec.str_password = QString::fromStdString(value["str_password"].asString());
        rec.str_brand = QString::fromStdString(value["str_brand"].asString());
        rec.str_reserved = QString::fromStdString(value["str_reserved"].asString());
        type = value["n_type"].asInt();
//        rec_sdk_old = db_c.searchCamSdkTableByCamId(rec.str_cam_dev_id);
@@ -1097,6 +1121,17 @@
    if (DEV_NO_TYPE == dev_type) {//add new camera
        db_c.updateConfigTableByDevType(DEV_CAMERA);
        {
            //#todo
//            std::string topic = "VideoToImageMulth";
//            std::string topic1 = "VideoAnalysFromHC";
//            Json::Value json_cfg;
//            json_cfg["cam_edit"] = content;
//            std::string msg = json_cfg.toStyledString();
//            DBG("msg:" << msg);
//            nsqMsgProducer->Publish(topic, (void *) (&msg));
//            nsqMsgProducer->Publish(topic1, (void *) (&msg));
        }
        runAllApp();
    }
        //edit camera's sdks
@@ -1104,9 +1139,20 @@
             (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();
        //#todo sendMessage To haikang&VideoToImage
        {
            std::string topic = "VideoToImageMulth";
            std::string topic1 = "VideoAnalysFromHC";
            Json::Value json_cfg;
            json_cfg["cam_edit"] = content;
            std::string msg = json_cfg.toStyledString();
            DBG("msg:" << msg);
            nsqMsgProducer->Publish(topic, (void *) (&msg));
            nsqMsgProducer->Publish(topic1, (void *) (&msg));
        }
//        killVideoAnalysFromHCApp();
//        sleep(1);
//        runAllApp();
    }
    Json::Value value_out;
@@ -1120,11 +1166,11 @@
                                        std::string brand) const {
    if (brand == "haikang") {
        bool ret = getHKDevSerialNumber(ip.c_str(), port, username.c_str(), passwd.c_str());
        if (!ret) {
            ERR("getHKDevSerialNumber ERR");
            return false;
        }
//        bool ret = getHKDevSerialNumber(ip.c_str(), port, username.c_str(), passwd.c_str());
//        if (!ret) {
//            ERR("getHKDevSerialNumber ERR");
//            return false;
//        }
        //调用rtsp流rtsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream
        port = 554;//TODO
//        std::string rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
@@ -1150,8 +1196,8 @@
        std::string publish_basepath = rtmpAddr + "cam" + str_uuid;
        DBG("publish_basepath:" << publish_basepath);
        appPref.setStringData("publish.basepath", publish_basepath);
        appPref.setIntData("pulish.width", 640);
        appPref.setIntData("pulish.height", 360);
//        appPref.setIntData("pulish.width", 1920);
//        appPref.setIntData("pulish.height", 1080);
        if (m_rtmp.find(ip) != m_rtmp.end()) {
            if (m_rtmp[ip].appPC == nullptr) {
@@ -1174,11 +1220,11 @@
        return false;//TODO
    } else if (brand == "yushi") {
//        rtsp://admin:admin@192.168.8.8:554/video1
        bool ret = getUVDevSerialNumber(ip.c_str(), username.c_str(), passwd.c_str());
        if (!ret) {
            ERR("getUVDevSerialNumber ERR");
            return false;
        }
//        bool ret = getUVDevSerialNumber(ip.c_str(), username.c_str(), passwd.c_str());
//        if (!ret) {
//            ERR("getUVDevSerialNumber ERR");
//            return false;
//        }
        port = 554;
//        std::string rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
@@ -1203,8 +1249,8 @@
        std::string publish_basepath = rtmpAddr + "cam" + str_uuid;
        DBG("publish_basepath:" << publish_basepath);
        appPref.setStringData("publish.basepath", publish_basepath);
        appPref.setIntData("pulish.width", 640);
        appPref.setIntData("pulish.height", 360);
//        appPref.setIntData("pulish.width", 1920);
//        appPref.setIntData("pulish.height", 1080);
        if (m_rtmp.find(ip) != m_rtmp.end()) {
            if (m_rtmp[ip].appPC == nullptr) {
@@ -1250,6 +1296,7 @@
            if (m_rtmp[ip].userCounter == 0) {
                m_rtmp[ip].appPC->stop();
                m_rtmp[ip].appPC->wait();
                delete m_rtmp[ip].appPC;
                m_rtmp.erase(ip);
            }
        }
@@ -1268,26 +1315,48 @@
    Json::Reader reader;
    Json::Value value_reader;
    std::string out;
    if (!reader.parse(content, value_reader)) {
        return "{\"ret_status\": \"传输错误,请检查!\"}";
    }
    //TODO
    //调用rtsp流rtsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream
    Json::Value value;
    if (value_reader.isMember("id")) {
        if (value_reader["id"].isNull()) {
            //本地视频源 第一次测试连接
            //TODO
            //调用rtsp流rtsp://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) {
            if (!ret) {
                return "{\"ret_status\": \"内容有误,请检查!\"}";
            }
            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();
        } else if (!value_reader["type"].isNull()) {
            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();
            {
                std::string topic = "VideoToImageMulth";
                Json::Value json_cfg;
                json_cfg["cam_startPublish"] = content;
                std::string msg = json_cfg.toStyledString();
                DBG("msg:" << msg);
                nsqMsgProducer->Publish(topic, (void *) (&msg));
            }
        } else {
            return "{\"ret_status\": \"内容有误,请检查!\"}";
        }
    } else {
        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();
    return out;
}
@@ -1304,19 +1373,32 @@
    if (!reader.parse(content, value_reader)) {
        return "{\"ret_status\": \"传输错误,请检查!\"}";
    }
    //TODO
    //调用rtsp流rtsp://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";
    DBG("cam_connect_video_stop begin");
    bool ret = cam_connect_video_stop(value_reader["str_ip"].asString());
    if (!ret) {
        return "{\"ret_status\": \"传输错误,请检查!\"}";
    }
    DBG("cam_connect_video_stop end");
    Json::Value value;
    value["ret_status"] = "ok_ack";
    if (value_reader.isMember("id")) {
        value["ret_status"] = "ok_ack";
        cam_connect_video_stop(value_reader["str_ip"].asString());
        {
            std::string topic = "VideoToImageMulth";
            Json::Value json_cfg;
            json_cfg["cam_stopPublish"] = content;
            std::string msg = json_cfg.toStyledString();
            DBG("msg:" << msg);
            nsqMsgProducer->Publish(topic, (void *) (&msg));
        }
    } else {
        //TODO
        //调用rtsp流rtsp://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";
        DBG("cam_connect_video_stop begin");
        bool ret = cam_connect_video_stop(value_reader["str_ip"].asString());
        if (!ret) {
            return "{\"ret_status\": \"传输错误,请检查!\"}";
        }
        DBG("cam_connect_video_stop end");
        value["ret_status"] = "ok_ack";
    }
    std::string out = value.toStyledString();
@@ -1377,12 +1459,22 @@
        QString cam_id = QString::fromStdString(value_reader["str_cam_dev_id"].asString());
        int ret = db_c.deleteCamDevandSdkByCamID(cam_id);
        if (ret) {
            killVideoAnalysFromHCApp();
//            killVideoAnalysFromHCApp();
            int dev_record = db_c.searchCamDevNumber();
            if (dev_record == 0) {
                db_c.updateConfigTableByDevType(DEV_NO_TYPE);
            } else {
                runAllApp();
//                runAllApp();
            }
            {
                std::string topic = "VideoToImageMulth";
                std::string topic1 = "VideoAnalysFromHC";
                Json::Value json_cfg;
                json_cfg["cam_del"] = content;
                std::string msg = json_cfg.toStyledString();
                DBG("msg:" << msg);
                nsqMsgProducer->Publish(topic, (void *) (&msg));
                nsqMsgProducer->Publish(topic1, (void *) (&msg));
            }
            return "{\"ret_status\": \"ok_ack\"}";
        } else {
@@ -1421,7 +1513,7 @@
                "sed -i '/tracker_server=/d' ./WebFDSClient.conf  && sed -i  '/\\\"host:port\\\"/atracker_server=" + \
                              value["web_pic_ip"].asString() + ":" + std::to_string(value["web_pic_port"].asInt()) + \
                              "' ./WebFDSClient.conf";//
            std::cout << "cmd_web:" << cmd_web << std::endl;
            DBG("cmd_web:" << cmd_web);
            system(cmd_web.c_str());
            //#todo fastDfsClient
@@ -1430,7 +1522,7 @@
                "sed -i '/tracker_server=/d' ./fastDfsClient.conf  && sed -i  '/\\\"host:port\\\"/atracker_server=" + \
                              value["es_pic_ip"].asString() + ":" + std::to_string(value["es_pic_port"].asInt()) + \
                              "' ./fastDfsClient.conf";
            std::cout << "cmd_es:" << cmd_es << std::endl;
            DBG("cmd_es:" << cmd_es);
            system(cmd_es.c_str());
            //#todo config
@@ -1443,12 +1535,12 @@
                fdfsClient.rwLock.unlock();
            }
            //# http client 127.0.0.1:9999/resetFdfs
            std::string http_cmd = "http://127.0.0.1:9999/resetFdfs";
            HttpRequestWithCrul httpRequestWithCrul;
            std::string response_bak = "";
            std::string postParams_bak = "";
            httpRequestWithCrul.curl_post_req("http://127.0.0.1:9999/resetFdfs", postParams_bak, response_bak);
//            //# http client 127.0.0.1:9999/resetFdfs
//            std::string http_cmd = "http://127.0.0.1:9999/resetFdfs";
//            HttpRequestWithCrul httpRequestWithCrul;
//            std::string response_bak = "";
//            std::string postParams_bak = "";
//            httpRequestWithCrul.curl_post_req("http://127.0.0.1:9999/resetFdfs", postParams_bak, response_bak);
        }
    } else {
        return "{\"ret_status\": \"传输错误,请检查!\"}";
@@ -1503,9 +1595,15 @@
    }
    if (ret) {
        killVideoAnalysFromHCApp();
        sleep(1);
        runAllApp();
        //todo VideoToImageMulth
        {
            std::string topic = "VideoToImageMulth";
            Json::Value json_cfg;
            json_cfg["cut_dura_edit"] = content;
            std::string msg = json_cfg.toStyledString();
            DBG("msg:" << msg);
            nsqMsgProducer->Publish(topic, (void *) (&msg));
        }
        return "{\"ret_status\": \"ok_ack\"}";
    } else {
        return "{\"ret_status\": \"内容有误,请检查!\"}";
@@ -1585,7 +1683,7 @@
//            system("sed -i 's/address .*$/address 192.168.1.111/g' test");
            std::string cmd_ip =
                "sed -i 's/address .*$/address " + ip_addr + "/g' /etc/network/interfaces";
            std::cout << "cmd_ip:" << cmd_ip << std::endl;
            DBG("cmd_ip:" << cmd_ip);
            system(cmd_ip.c_str());
            //修改config.json
@@ -1665,6 +1763,13 @@
    return out;
}
//{
//   "cookie": "abc",                        //集群cookie
//   "fatherNodeName": "main@192.168.1.186", //引导节点名称,添加引导节点时该值为" "(内为空格)
//   "culID" : "uuid",                       //集群id
//   "culName" : "name",                     //集群名称
//   "devID" : "uuid"                        //设备id
//}
std::string devHttpServer_c::addNode(std::string ip, unsigned int port, std::string content, PResponse &response) {
    DBG("ip:" << ip << "; port:" << port);
    DBG("content: " << content);
@@ -1677,25 +1782,32 @@
        //#todo nodes have counter?
        //#todo nodeName Automatic generated?
        //#todo devId+num
        // 生成节点id - uuid
        std::string uuid = GetUUId::getUUID();
        // 获取当前机器ip
        unsigned char ip_old[15] = {0};
        std::string str_netIfName = appConfig.getStringProperty("netIfName");
        GetIpAddress(str_netIfName.c_str(), ip_old);
        std::string str_ip((char *) ip_old);
        // 节点名称
        std::string nodeName = uuid.append("@" + str_ip);
        std::string cookie = value["cookie"].asString();
        // 引导节点
        std::string FatherNodeName = value["fatherNodeName"].asString();
        //#todo ClusterID ClusterName
        // 集群id
        std::string clusterID = value["culID"].asString();
        // 为空则生成,否则直接使用
        clusterID = clusterID.size() > 0 ? clusterID : GetUUId::getUUID();
        std::string clusterName = value["culName"].asString();
        std::string devID = value["devID"].asString();
        std::string devName = value["devName"].asString();
        // erlang节点保存路径/opt/erlang/${uuid}
        std::string path = std::string("/opt/erlang/").append(nodeName.substr(0, nodeName.find("@")));
        if (erlangDbTool != nullptr) {
            //gaunbi node
@@ -1707,6 +1819,7 @@
        if (cookie.size() > 0 && (clusterID.size() > 0 || clusterName.size() > 0)) {
//            erlangDbTool = new ErlangTool::ErlangDbTool(path, nodeName, cookie);
            // #todo 进程名 -> get from argv[0]
            string str_tmp = "DataWebserver";
            erlangDbTool = new ErlangTool::ErlangDbTool(path, nodeName, cookie, clusterID, clusterName, str_tmp);
            bool ret = erlangDbTool->initErlang();
@@ -1715,6 +1828,7 @@
            ret = erlangDbTool->startNodeDb(FatherNodeName, devID);
            if (ret) {
                //如果成功则更新配置文件
                appConfig.setStringProperty("erlNode", nodeName);
                appConfig.setStringProperty("erlCookie", cookie);
                appConfig.setStringProperty("erlPath", path);
@@ -1727,6 +1841,7 @@
                runAllApp();
//                sleep(4);
            } else {
                // 否则则置空配置文件
                appConfig.setStringProperty("erlNode", "");
                appConfig.setStringProperty("erlCookie", "");
                appConfig.setStringProperty("erlPath", "");
@@ -1759,6 +1874,7 @@
        ret = erlangDbTool->removeNode();
        // 置空配置文件
        appConfig.setStringProperty("erlNode", "");
        appConfig.setStringProperty("erlCookie", "");
        appConfig.setStringProperty("erlPath", "");
@@ -1859,7 +1975,8 @@
}
std::string devHttpServer_c::createDatabase(std::string ip, unsigned int port, std::string content,
                                            PResponse &response) {    DBG("ip:" << ip << "; port:" << port);
                                            PResponse &response) {
    DBG("ip:" << ip << "; port:" << port);
    DBG("content: " << content);
    if (erlangDbTool == nullptr) {
        response->write(SimpleWeb::StatusCode::server_error_not_implemented, "{\"error\":\"节点不存在 \"}");
@@ -1875,15 +1992,20 @@
        std::string Uuid = value["uuid"].asString();
        std::string TableType = value["TableType"].asString();
        std::string TableName = value["TableName"].asString();
        //  集群内同步
        int SyncType = atoi(value["SyncType"].asCString());
        std::string BwType = value["BwType"].asString();
        std::string StartTime = value["StartTime"].asString();
        std::string EndTime = value["EndTime"].asString();
        // 是否上传
        std::string UploadFlag = value["IsSync"].asString();
        UploadFlag = UploadFlag.empty() ? "0" : UploadFlag;
        // 底库阈值
        std::string CmpThreshold = value["threshold"].asString();
        CmpThreshold = CmpThreshold.empty() ? "60" : CmpThreshold;
        // 是否启用
        std::string Enabled = value["enabled"].asString();
        Enabled = Enabled.empty() ? "1" : Enabled;
@@ -1915,9 +2037,7 @@
        fieldValues.insert(std::make_pair("bwType", BwType));
        fieldValues.insert(std::make_pair("startTime", StartTime));
        fieldValues.insert(std::make_pair("endTime", EndTime));
//        #todo
        fieldValues.insert(std::make_pair("create_by", createBy));
        fieldValues.insert(std::make_pair("uploadFlag", UploadFlag));
        fieldValues.insert(std::make_pair("cmpThreshold", CmpThreshold));
        fieldValues.insert(std::make_pair("enabled", Enabled));
@@ -1929,6 +2049,7 @@
                ret = erlangDbTool->createDatabase(Uuid, fieldValues);
            } else if (SyncType == 0) {
                TableName.insert(0, "lt_");
                fieldValues["tableName"] = TableName;
                //本地库
                ret = m_SqliteFaceEncap.createTable(TableName, fieldValues);
            }
@@ -1941,7 +2062,6 @@
            return "";
        }
////            #todo 上传。仅黑名单。
////            #TODO 根据createBy判断是否需要上传
//        if (createBy == "analyDev" && BwType == "1") {
@@ -1952,7 +2072,7 @@
//                                      Enabled);
//        }
        // send message to other CNode
        erlangDbTool->sendMessage();
        std::string str_result = std::string("{\"result\":").append("\"" + std::to_string(ret) + "\"}");
        return str_result;
@@ -2022,9 +2142,12 @@
//        auto resType = erlangDbTool->findAllTypeInfo();
        string json = "[";
        for (auto &item : resDB) {
            //-------------------maybe delete ?------------------------
            if (item.second.tableName.find("lt_") == 0) {
                continue;
            }
            //-------------------maybe delete end----------------------
            string subJson = "{ ";
            subJson.append("\"uuid\":\"" + item.second.uuid + "\",");
            subJson.append("\"tableName\":\"" + item.second.tableName + "\",");
@@ -2245,7 +2368,7 @@
                fieldValues.insert(std::make_pair("uuid", strUUID));
                fieldValues.insert(std::make_pair("idCard", idcard));
                m_SqliteFaceEncap.updateFace(TableName, addFaceData, fieldValues);
                ret_addPerson = m_SqliteFaceEncap.updateFace(TableName, addFaceData, fieldValues);
            }
        } else {
@@ -2403,26 +2526,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);
        }
@@ -2642,6 +2766,7 @@
            std::string strSelectTemplate = R"#( -vf "select=eq(n\,%d)")#";
            sprintf(selectExpBuff, strSelectTemplate.c_str(), frameIdDiff - 1);
            if (videoSt.Valid() && imgSt.Valid()) {
                ClockTimer clockTimer1("ffmpeg getpic");
                std::string cmd("ffmpeg -i '" + videoPath + "'" + std::string(selectExpBuff) + " -vframes 1" + " -y '" +
                                str_imgName + "'");
                INFO("Video To Image Cmd: " << cmd);
@@ -2651,17 +2776,20 @@
                return "{\"error\":\"未查到视频路径\"}";
            }
            ClockTimer clockTimer2("cv::imread(str_imgName)");
            cv::Mat img = cv::imread(str_imgName);
            if (img.empty()) {
                ERR("{\"error\":\"Video File error\"}");
                return "{\"error\":\"视频文件错误\"}";
            }
            ClockTimer clockTimer3("CvUtil::cvMat2Buffer(img, buffer)");
            std::vector<unsigned char> buffer;
            CvUtil::cvMat2Buffer(img, buffer);
            std::string img_url = "http://";
            fdfsClient.rwLock.rdlock();
            if (fdfsClient.fastFds != nullptr) {
                ClockTimer clockTimer4("fdfsClient.fastFds->uploadFile");
                std::string t_strImg = "";
                if (!fdfsClient.fastFds->uploadFile(buffer, t_strImg, "jpg")) {
                    img_url = "upload image fail";
@@ -2805,7 +2933,7 @@
    appConfig.setStringProperty("DEV_ID", dev_id);
    appConfig.save();
    //std::cout<<dev_id<<std::endl;
    return true;
}
@@ -2904,8 +3032,19 @@
        }
    }
    if (videoStVec.size() >= 1) {
        std::string strVideoName = strPath + videoStVec[0].ToVideoName();
    std::vector<VideoName_s_t> videoStVec_;
    auto imgTm_ = AppUtil::ParseFromHypenTimeStr(imgSt.m_timeStamp);
    for (auto &item : videoStVec) {
        auto resTime_ = AppUtil::ParseFromHypenTimeStr(item.m_timeStamp);
        auto timeRes = difftime(mktime(&resTime_), mktime(&imgTm_));
        if ((timeRes < 0 && difftime(mktime(&imgTm_), mktime(&resTime_)) >= 30) || (timeRes / 60 >= 3)) {
            continue;
        }
        videoStVec_.emplace_back(item);
    }
    if (videoStVec_.size() >= 1) {
        std::string strVideoName = strPath + videoStVec_[0].ToVideoName();
        INFO("ImageName: " << imgKey << "  SingleMatchVideo: " << strVideoName);
        return strVideoName;
    } else {
@@ -3210,6 +3349,10 @@
        rule.strExAreas = value["strExAreas"].asCString();
        rule.strLine = value["strLine"].asCString();
        rule.strExLine = value["strExLine"].asCString();
        if (!value["strPerimeterObjType"].empty()) {
            rule.strPerimeterObjType = value["strPerimeterObjType"].asCString();
        }
        if (rule.strCamId.isEmpty()) {
            return "{\"ret_status\":\"内容有误,请检查!\"}";
        }
@@ -3233,11 +3376,19 @@
        if (db_c.updateSdkRule(rule)) {
//            if(rule.nIsRun==1)
            killVideoAnalysFromHCApp();
            sleep(1);
            runAllApp();
//            killVideoAnalysFromHCApp();
//            sleep(1);
//            runAllApp();
            {
                std::string topic = "VideoAnalysFromHC";
                Json::Value json_cfg;
                json_cfg["editSdkRule"] = content;
                std::string msg = json_cfg.toStyledString();
                DBG("msg:" << msg);
                usleep(1000);
                nsqMsgProducer->Publish(topic, (void *) (&msg));
            }
            return "{\"ret_status\": \"ok_ack\"}";
        } else {
            return "{\"ret_status\":\"内容有误,请检查!\"}";
@@ -3278,6 +3429,7 @@
                obj["strExAreas"] = rule.second.strExAreas.toStdString();
                obj["strLine"] = rule.second.strLine.toStdString();
                obj["strExLine"] = rule.second.strExLine.toStdString();
                obj["strPerimeterObjType"] = rule.second.strPerimeterObjType.toStdString();
                Json::Value weekRuleArray;
@@ -3309,21 +3461,28 @@
}
std::string devHttpServer_c::getSnapshot(std::string ip, unsigned int port, std::string content, PResponse &response) {
    DBG("ip:" << ip << "; port:" << port);
    DBG("content: " << content);
    Json::Reader reader;
    Json::Value value;
    if (reader.parse(content, value)) {
        std::string ip = value["str_ip"].asString();
        std::string str_imgName = "";
        std::string rtsp_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 rtsp_url = rtspAddrBuild(rtsp_ip, port, username, pass, brand);
        if (value.isMember("id")) {
            if (value["id"].isNull()) return "{\"ret_status\": \"id内容有误,请检查!\"}";
            str_imgName.append("./").append(value["id"].asString()).append(".jpg");
        } else {
            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);
@@ -3335,20 +3494,22 @@
//        std::string str_cam_dev_id = std::string((char *) serialnumber);//摄像机id 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 += rtsp_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);
@@ -3370,7 +3531,11 @@
        fdfsClient.rwLock.unlock();
        Json::Value result;
        result["imgUrl"] = strImgUrl;
        db_c.updateCamDevSnapshot(QString::fromStdString(ip), QString::fromStdString(strImgUrl));
        if (value.isMember("id")) {
            db_c.updateCamDevSnapshotbyID(value["id"].asString().c_str(), QString::fromStdString(strImgUrl));
        } else {
            db_c.updateCamDevSnapshot(QString::fromStdString(rtsp_ip), QString::fromStdString(strImgUrl));
        }
        return result.toStyledString();