提交 4fabe8c9 authored 作者: blu's avatar blu

new feature entropy filter to ignore gray frame without iframe

上级 263c2693
{ {
"code":0,
"time":0,
"data":{ "data":{
"ipc":"172.31.0.51", "T6L5N3KN":{
"username":"admin", "addr":"127.0.0.1",
"password":"FWBWTU", "api-cloud":"http://127.0.0.1:8089",
"services":{ "ipcs":[
"evmgr":{
"sn":"ILS-1",
"addr":"0.0.0.0",
"port-pub":5556,
"port-rep":5557,
"iid":1
},
"evpuller":{
"sn":"ILS-2",
"addr":"0.0.0.0",
"port-pub":5556,
"port-rep":5557,
"iid":2
},
"evpusher":[
{ {
"sn":"ILS-2", "addr":"172.31.0.51",
"addr":"localhost", "modules":{
"iid":2, "evml":[
"enabled":1, {
"urlDest":"rtsp://40.73.41.176:554/test1" "area":300,
"enabled":1,
"iid":1,
"post":30,
"pre":3,
"sn":"T6L5N3KN",
"status":0,
"thresh":80,
"type":"motion"
}
],
"evpuller":[
{
"addr":"127.0.0.1",
"iid":1,
"port-pub":5556,
"sn":"T6L5N3KN",
"status":0
}
],
"evpusher":[
{
"enabled":1,
"iid":1,
"password":"",
"sn":"T6L5N3KN",
"status":0,
"token":"",
"urlDest":"rtsp://40.73.41.176:554/test1",
"user":""
}
],
"evslicer":[
{
"enabled":1,
"iid":1,
"path":"slices",
"sn":"T6L5N3KN",
"status":0
}
]
},
"password":"FWBWTU",
"port":554,
"proto":"rtsp",
"status":0,
"user":"admin"
} }
], ],
"evslicer":[ "mqtt-cloud":"<cloud_addr>",
{ "port-cloud":5556,
"sn":"ILS-3", "port-router":5550,
"addr":"192.168.0.25", "proto":"zmq",
"iid":3, "sn":"T6L5N3KN",
"path": "/var/lib/slices/" "status":1
}
],
"evml":[
{
"feature":"motion",
"sn":"ILS-4",
"addr":"192.168.0.26",
"iid":4
}
]
} }
} },
"lastupdated":1567669674
} }
\ No newline at end of file
...@@ -27,116 +27,110 @@ class HttpSrv{ ...@@ -27,116 +27,110 @@ class HttpSrv{
// sn:module -> sn_of_evmgr // sn:module -> sn_of_evmgr
json configMap; json configMap;
json config(string body){ json config(json &newConfig){
json ret; json ret;
int iret; int iret;
json oldConfigMap = this->configMap; json oldConfigMap = this->configMap;
ret["code"] = 0; ret["code"] = 0;
ret["msg"] = "ok"; ret["msg"] = "ok";
ret["time"] = chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count(); ret["time"] = chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count();
spdlog::info(body); spdlog::info(newConfig.dump());
if(body.empty()){ try{
ret["code"] = 1; if(newConfig.count("data") == 0 || newConfig["data"].size() == 0) {
ret["msg"] = "no body payload"; ret["code"] = 1;
}else{ ret["msg"] = "evcloudsvc invalid config body received: " + newConfig.dump();
try{ spdlog::error(ret["msg"].get<string>());
json newConfig = json::parse(body); }else{
if(newConfig.count("data") == 0 || newConfig["data"].size() == 0) { json &data = newConfig["data"];
ret["code"] = 1; for(auto &[k, v]: data.items()) {
ret["msg"] = "evcloudsvc invalid config body received: " + body; // this is one evmgr
spdlog::error(ret["msg"].get<string>()); if(v.count("sn") == 0||v["sn"] != k) {
}else{ ret["code"] = 2;
json &data = newConfig["data"]; ret["msg"] = "evcloudsvc invalid value for key " + k;
for(auto &[k, v]: data.items()) { spdlog::error(ret["msg"].get<string>());
// this is one evmgr break;
if(v.count("sn") == 0||v["sn"] != k) { }else{
ret["code"] = 2; // find all modules
ret["msg"] = "evcloudsvc invalid value for key " + k; if(v.count("ipcs") == 0||v["ipcs"].size() == 0) {
spdlog::error(ret["msg"].get<string>()); spdlog::error("invalid ipcs in config body");
ret["code"] = 3;
break; break;
}else{ }else{
// find all modules json &ipcs = v["ipcs"];
if(v.count("ipcs") == 0||v["ipcs"].size() == 0) { for(auto &ipc : ipcs) {
spdlog::error("invalid ipcs in config body"); if(ipc.count("modules") == 0||ipc["modules"].size() == 0) {
ret["code"] = 3; spdlog::error("invalid modules in ipcs config body");
break; ret["code"] = 4;
}else{ break;
json &ipcs = v["ipcs"]; }else{
for(auto &ipc : ipcs) { json &modules = ipc["modules"];
if(ipc.count("modules") == 0||ipc["modules"].size() == 0) { for(auto &[mn, ma]: modules.items()) {
spdlog::error("invalid modules in ipcs config body"); for(auto &m:ma) {
ret["code"] = 4; if(m.count("sn") != 0 && m["sn"].size() != 0){
break; string modKey;
}else{ //ml
json &modules = ipc["modules"]; if(mn == "evml" && m.count("type") != 0 && m["type"].size() != 0) {
for(auto &[mn, ma]: modules.items()) { modKey = m["sn"].get<string>() +":evml:" + m["type"].get<string>();
for(auto &m:ma) {
if(m.count("sn") != 0 && m["sn"].size() != 0){
string modKey;
//ml
if(mn == "evml" && m.count("type") != 0 && m["type"].size() != 0) {
modKey = m["sn"].get<string>() +":evml:" + m["type"].get<string>();
}else{
modKey = m["sn"].get<string>() + ":" + mn;
}
// modkey -> sn_of_evmgr
this->configMap[modKey] = k;
}else{ }else{
string msg = "evcloudsvc invalid config: " + data.dump();; modKey = m["sn"].get<string>() + ":" + mn;
ret["code"] = -1;
ret["msg"] = msg;
spdlog::error(msg);
break;
} }
// modkey -> sn_of_evmgr
this->configMap[modKey] = k;
}else{
string msg = "evcloudsvc invalid config: " + data.dump();;
ret["code"] = -1;
ret["msg"] = msg;
spdlog::error(msg);
break;
} }
} // for modules
if(ret["code"] != 0) {
break;
} }
} // for ipc } // for modules
}
}
if(ret["code"] != 0) { if(ret["code"] != 0) {
break; break;
} }
} } // for ipc
// update evmgr config }
json evmgrData; }
evmgrData["data"] = data;
//evmgrData["lastupdated"] = newConfig["lastupdated"];
//save if(ret["code"] != 0) {
iret = LVDB::setLocalConfig(evmgrData, k); break;
if(iret < 0) { }
string msg = "failed to save config " + k + " -> " + evmgrData.dump(); }
spdlog::error(msg); // update evmgr config
ret["code"] = iret; json evmgrData;
ret["msg"] = msg; evmgrData["data"] = data;
}
} // for evmgr
// save configmap //save
if(ret["code"] == 0) { iret = LVDB::setLocalConfig(evmgrData, k);
iret = LVDB::setValue(this->configMap, KEY_CONFIG_MAP); if(iret < 0) {
if(iret >= 0) { string msg = "failed to save config " + k + " -> " + evmgrData.dump();
}else{ spdlog::error(msg);
ret["code"] = iret; ret["code"] = iret;
ret["msg"] = "failed to save configmap"; ret["msg"] = msg;
}
}else{
this->configMap = oldConfigMap;
} }
} // for evmgr
ret["data"] = newConfig["data"]; // save configmap
if(ret["code"] == 0) {
iret = LVDB::setValue(this->configMap, KEY_CONFIG_MAP);
if(iret >= 0) {
}else{
ret["code"] = iret;
ret["msg"] = "failed to save configmap";
}
}else{
this->configMap = oldConfigMap;
} }
}catch(exception &e) {
ret.clear(); ret["data"] = newConfig["data"];
ret["code"] = -1;
ret["msg"] = e.what();
} }
}catch(exception &e) {
ret.clear();
ret["code"] = -1;
ret["msg"] = e.what();
} }
return ret; return ret;
} }
...@@ -155,7 +149,9 @@ class HttpSrv{ ...@@ -155,7 +149,9 @@ class HttpSrv{
json ret; json ret;
try{ try{
string sn = req.get_param_value("sn"); string sn = req.get_param_value("sn");
string module = req.get_param_value("module"); string module = req.get_param_value("module");
bool force = (req.get_param_value("force") == "true") ? true: false;
if(sn.empty()||module.empty()){ if(sn.empty()||module.empty()){
throw StrException("no para sn/module"); throw StrException("no para sn/module");
} }
...@@ -177,7 +173,7 @@ class HttpSrv{ ...@@ -177,7 +173,7 @@ class HttpSrv{
modname = sn + ":" + modname; modname = sn + ":" + modname;
if(this->configMap.count(modname) == 0){ if(this->configMap.count(modname) == 0){
spdlog::info("evcloudsvc no such edge module registred: {}, create new entry", key); spdlog::info("evcloudsvc no such edge module registred: {}, create new entry", key);
ret = this->config(req.body); ret = this->config(cfg);
if(ret["code"] == 0) { if(ret["code"] == 0) {
}else{ }else{
spdlog::error("failed to config: {}", ret.dump()); spdlog::error("failed to config: {}", ret.dump());
...@@ -194,16 +190,15 @@ class HttpSrv{ ...@@ -194,16 +190,15 @@ class HttpSrv{
ret["msg"] = "diff"; ret["msg"] = "diff";
json data; json data;
r = LVDB::getLocalConfig(data, key); r = LVDB::getLocalConfig(data, key);
if(r < 0) { if(r < 0||force) {
ret["code"] = r; spdlog::error("failed to get localconfig or force to updaste. create new");
ret["msg"] = "failed to get config for: " + key; ret = this->config(cfg);
}else{ }else{
json diff = json::diff(data, cfg); json diff = json::diff(cfg, data);
spdlog::info("evcloudsvc diff: {}", diff.dump()); spdlog::info("evcloudsvc diff: {}", diff.dump());
ret["data"] = diff; ret["data"] = diff;
} }
} }
}catch(exception &e) { }catch(exception &e) {
ret.clear(); ret.clear();
ret["code"] = -1; ret["code"] = -1;
...@@ -260,7 +255,16 @@ class HttpSrv{ ...@@ -260,7 +255,16 @@ class HttpSrv{
}); });
svr.Post("/config", [this](const Request& req, Response& res){ svr.Post("/config", [this](const Request& req, Response& res){
auto ret = this->config(req.body); json ret;
string msg;
try{
json cfg = json::parse(req.body);
ret = this->config(cfg);
}catch (exception &e) {
msg = string("evcloudsvc exception on POST /config: ") + e.what();
ret["msg"] = msg;
ret["code"]= -1;
}
res.set_content(ret.dump(), "text/json"); res.set_content(ret.dump(), "text/json");
}); });
......
...@@ -72,6 +72,8 @@ private: ...@@ -72,6 +72,8 @@ private:
spdlog::error("failed to get local configuration"); spdlog::error("failed to get local configuration");
exit(1); exit(1);
} }
// set all module status to 0 // set all module status to 0
ret = LVDB::traverseConfigureModules(config, [](string modname, json &m, void* pUser)->int{ ret = LVDB::traverseConfigureModules(config, [](string modname, json &m, void* pUser)->int{
......
...@@ -8,89 +8,15 @@ ...@@ -8,89 +8,15 @@
#include <sstream> #include <sstream>
#include "json.hpp" #include "json.hpp"
#include "spdlog/spdlog.h" #include "spdlog/spdlog.h"
#include "httplib.h"
using namespace std; using namespace std;
using namespace nlohmann; using namespace nlohmann;
using namespace httplib;
// cloudutils // cloudutils
namespace cloudutils namespace cloudutils
{ {
/**
* scn:
* evpuller, evmgr, evmotion, evslicer
*
* */
/*
{
"time":0,
"lastupdated": 0,
"code":0,
"data":{
"ILSEVMGR1":{
"lastupdated": 0,
"sn":"ILSEVMGR1",
"addr":"172.31.0.76",
"addr-cloud":"172.31.0.76",RzMbCp5W6^ZS
"proto":"zmq",
"port-cloud":5556,
"port-router":5550,
"status":1,
"ipcs":[
{
"addr":"172.31.0.51",
"proto":"rtsp",
"user":"admin",
"password":"FWBWTU",
"port": 554,
"status":1,
"modules":{
"evpuller":[
{
"sn":"ILSEVPULLER1",
"addr":"172.31.0.76",
"iid":1,
"port-pub":5556,
"status":1
}
],
"evpusher":[
{
"sn":"ILSEVPUSHER1",
"iid":1,
"urlDest":"rtsp://40.73.41.176:554/test1",
"user":"",
"password":"",
"token":"",
"enabled":1,
"status":1
}
],
"evslicer":[
{
"sn":"ILSEVSLICER1",
"iid":1,
"path":"slices",
"enabled":1,
"status":1
}
],
"evml":[
{
"type":"motion",
"sn":"ILSEVMLMOTION1",
"iid":1,
"enabled":1,
"status":1
}
]
}
}
]
}
}
}
*/
// const char *config = "{\"time\":0,\"code\":0,\"data\":{\"ILSEVMGR1\":{\"sn\":\"ILSEVMGR1\",\"addr\":\"127.0.0.1\",\"addr-cloud\":\"127.0.0.1\",\"proto\":\"zmq\",\"port-cloud\":5556,\"port-router\":5550,\"status\":1,\"ipcs\":[{\"addr\":\"172.31.0.51\",\"proto\":\"rtsp\",\"user\":\"admin\",\"password\":\"iLabService\",\"status\":1,\"modules\":{\"evpuller\":[{\"sn\":\"ILSEVPULLER1\",\"addr\":\"127.0.0.1\",\"iid\":1,\"port-pub\":5556,\"status\":1}],\"evpusher\":[{\"sn\":\"ILSEVPUSHER1\",\"iid\":1,\"urlDest\":\"rtsp://40.73.41.176:554/test1\",\"user\":\"\",\"password\":\"\",\"token\":\"\",\"enabled\":1,\"status\":1}],\"evslicer\":[{\"sn\":\"ILSEVSLICER1\",\"iid\":1,\"path\":\"slices\",\"enabled\":1,\"status\":1}],\"evml\":[{\"type\":\"motion\",\"sn\":\"ILSEVMLMOTION1\",\"iid\":1,\"enabled\":1,\"status\":1}]}}]}}}";
vector<string> split(const std::string& s, char delimiter) vector<string> split(const std::string& s, char delimiter)
{ {
...@@ -104,6 +30,22 @@ vector<string> split(const std::string& s, char delimiter) ...@@ -104,6 +30,22 @@ vector<string> split(const std::string& s, char delimiter)
return tokens; return tokens;
} }
/// ref: ../config.json
json registry(json &conf, string sn, string module) {
json ret;
string api;
try{
api = conf.at(sn).at("api-cloud").get<string>() + "/register";
}catch(exception &e) {
}
// /Client cli;
return ret;
}
} // namespace cloudutils } // namespace cloudutils
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论