提交 b6eadb7d authored 作者: blu's avatar blu

init

上级 01b85e1c
{ {
"time":0, "code":0,
"code":0, "time":0,
"data":{ "data":{
"ILSEVMGR1":{ "ipc":"172.31.0.51",
"sn":"ILSEVMGR1", "username":"admin",
"addr":"172.31.0.76", "password":"FWBWTU",
"addr-cloud":"172.31.0.76", "services":{
"proto": "zmq", "evmgr":{
"port-cloud":5556, "sn":"ILS-1",
"port-router":5550, "addr":"0.0.0.0",
"status":1, "port-pub":5556,
"ipcs":[ "port-rep":5557,
{ "iid":1
"addr":"172.31.0.51", },
"proto":"rtsp", "evpuller":{
"user":"admin", "sn":"ILS-2",
"password":"FWBWTU", "addr":"0.0.0.0",
"status":1, "port-pub":5556,
"modules":{ "port-rep":5557,
"evpuller":[ "iid":2
{ },
"sn":"ILSEVPULLER1", "evpusher":[
"addr":"172.31.0.76", {
"iid":1, "sn":"ILS-2",
"port-pub":"5556", "addr":"localhost",
"status":1 "iid":2,
} "enabled":1,
], "urlDest":"rtsp://40.73.41.176:554/test1"
"evpusher":[ }
{ ],
"sn":"ILSEVPUSHER1", "evslicer":[
"iid":1, {
"proto":"rtsp", "sn":"ILS-3",
"addrDest":"40.73.41.176", "addr":"192.168.0.25",
"portDest":554, "iid":3,
"user":"", "path": "/var/lib/slices/"
"password":"", }
"token":"", ],
"enabled":1, "evml":[
"status":1 {
} "feature":"motion",
], "sn":"ILS-4",
"evslicer":[ "addr":"192.168.0.26",
{ "iid":4
"sn":"ILSEVSLICER1", }
"iid":1, ]
"path":"slices", }
"enabled":1, }
"status":1 }
} \ No newline at end of file
],
"evml":[
{
"type":"motion",
"sn":"ILSEVMLMOTION1",
"iid":1,
"enabled":1,
"status":1
}
]
}
}
]
}
}
}
\ No newline at end of file
...@@ -29,13 +29,6 @@ namespace fs = std::filesystem; ...@@ -29,13 +29,6 @@ namespace fs = std::filesystem;
using namespace std; using namespace std;
using namespace zmqhelper; using namespace zmqhelper;
/**
* functions:
* app update
* control msg
*
**/
class EvMgr:public TinyThread { class EvMgr:public TinyThread {
private: private:
void *pRouterCtx = NULL; void *pRouterCtx = NULL;
...@@ -129,7 +122,7 @@ private: ...@@ -129,7 +122,7 @@ private:
json jEvt; json jEvt;
jEvt["type"] = EV_MSG_TYPE_CONN_STAT; jEvt["type"] = EV_MSG_TYPE_CONN_STAT;
jEvt["gid"] = selfId; jEvt["gid"] = selfId;
jEvt['ts'] = chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count(); jEvt["ts"] = chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count();
if(eventConn) { if(eventConn) {
jEvt["event"] = EV_MSG_EVENT_CONN_CONN; jEvt["event"] = EV_MSG_EVENT_CONN_CONN;
} }
......
/* /*
module: evmlmotion module: evmlmotion
description: description:
author: Bruce.Lu <lzbgt@icloud.com> author: Bruce.Lu <lzbgt@icloud.com>
update: 2019/08/23 update: 2019/08/23
*/ */
...@@ -136,10 +136,11 @@ private: ...@@ -136,10 +136,11 @@ private:
urlRouter = string("tcp://") + evmgr["addr"].get<string>() + ":" + to_string(evmgr["port-router"]); urlRouter = string("tcp://") + evmgr["addr"].get<string>() + ":" + to_string(evmgr["port-router"]);
spdlog::info("evmlmotion {} {} will connect to {} for sub, {} for router", devSn, iid, urlPub, urlRouter); spdlog::info("evmlmotion {} {} will connect to {} for sub, {} for router", devSn, iid, urlPub, urlRouter);
// TODO: multiple protocols support // TODO: multiple protocols support
if(evmlmotion.count("path") == 0){ if(evmlmotion.count("path") == 0) {
spdlog::warn("evslicer {} {} no params for path, using default: {}", devSn, iid, URLOUT_DEFAULT); spdlog::warn("evslicer {} {} no params for path, using default: {}", devSn, iid, URLOUT_DEFAULT);
urlOut = URLOUT_DEFAULT; urlOut = URLOUT_DEFAULT;
}else{ }
else {
urlOut = evmlmotion["path"]; urlOut = evmlmotion["path"];
} }
...@@ -443,75 +444,79 @@ private: ...@@ -443,75 +444,79 @@ private:
// business logic for event // business logic for event
auto dura = chrono::duration_cast<chrono::seconds>(evtStartTm - evtStartTmLast).count(); auto dura = chrono::duration_cast<chrono::seconds>(evtStartTm - evtStartTmLast).count();
switch(evtState) { switch(evtState) {
case NONE: { case NONE: {
if(hasEvent) { if(hasEvent) {
evtState = PRE;
spdlog::info("state: NONE->PRE");
evtStartTmLast = evtStartTm;
}
break;
}
case PRE: {
if(hasEvent) {
if(dura > detPara.pre) {
spdlog::info("state: PRE->PRE");
evtState = PRE; evtState = PRE;
spdlog::info("state: NONE->PRE");
evtStartTmLast = evtStartTm;
} }
break; else {
} evtState = IN;
case PRE: { json p;
if(hasEvent) { spdlog::info("state: PRE->IN");
if(dura > detPara.pre) { p["type"] = EV_MSG_TYPE_AI_MOTION;
spdlog::info("state: PRE->PRE"); p["gid"] = selfId;
evtState = PRE; p["event"] = EV_MSG_EVENT_MOTION_START;
}else{ p["ts"] = chrono::duration_cast<chrono::seconds>(evtStartTmLast.time_since_epoch()).count();
evtState = IN; //p["frame"] = origin.clone();
json p; evtQueue->push(p.dump());
spdlog::info("state: PRE->IN"); if(evtQueue->size() > MAX_EVENT_QUEUE_SIZE * 2) {
p["type"] = EV_MSG_TYPE_AI_MOTION; evtQueue->pop();
p["gid"] = selfId;
p["event"] = EV_MSG_EVENT_MOTION_START;
p["ts"] = chrono::duration_cast<chrono::seconds>(evtStartTmLast.time_since_epoch()).count();
//p["frame"] = origin.clone();
evtQueue->push(p.dump());
if(evtQueue->size() > MAX_EVENT_QUEUE_SIZE * 2) {
evtQueue->pop();
}
}
}else{
if(dura > detPara.pre){
evtState= NONE;
spdlog::info("state: PRE->NONE");
} }
} }
break;
} }
case IN: { else {
if(!hasEvent){ if(dura > detPara.pre) {
if(dura > (int)(detPara.post/2)){ evtState= NONE;
evtState = POST; spdlog::info("state: PRE->NONE");
spdlog::info("state: IN->POST");
}
}else{
evtStartTmLast = evtStartTm;
spdlog::info("state: IN->IN");
} }
break;
} }
case POST: { break;
if(!hasEvent) { }
if(dura > detPara.post) { case IN: {
spdlog::info("state: POST->NONE"); if(!hasEvent) {
evtState = NONE; if(dura > (int)(detPara.post/2)) {
json p; evtState = POST;
p["type"] = EV_MSG_TYPE_AI_MOTION; spdlog::info("state: IN->POST");
p["gid"] = selfId; }
p["event"] = EV_MSG_EVENT_MOTION_END; }
p["ts"] = chrono::duration_cast<chrono::seconds>(evtStartTmLast.time_since_epoch()).count() + (int)(detPara.post/2); else {
evtQueue->push(p.dump()); evtStartTmLast = evtStartTm;
if(evtQueue->size() > MAX_EVENT_QUEUE_SIZE*2) { spdlog::info("state: IN->IN");
evtQueue->pop(); }
} break;
}
case POST: {
if(!hasEvent) {
if(dura > detPara.post) {
spdlog::info("state: POST->NONE");
evtState = NONE;
json p;
p["type"] = EV_MSG_TYPE_AI_MOTION;
p["gid"] = selfId;
p["event"] = EV_MSG_EVENT_MOTION_END;
p["ts"] = chrono::duration_cast<chrono::seconds>(evtStartTmLast.time_since_epoch()).count() + (int)(detPara.post/2);
evtQueue->push(p.dump());
if(evtQueue->size() > MAX_EVENT_QUEUE_SIZE*2) {
evtQueue->pop();
} }
}else{
spdlog::info("state: POST->IN");
evtState=IN;
evtStartTmLast = evtStartTm;
} }
break;
} }
else {
spdlog::info("state: POST->IN");
evtState=IN;
evtStartTmLast = evtStartTm;
}
break;
}
} }
} }
...@@ -526,13 +531,14 @@ protected: ...@@ -526,13 +531,14 @@ protected:
AVPacket packet; AVPacket packet;
//event thread //event thread
thEvent = thread([&,this](){ thEvent = thread([&,this]() {
json meta; meta["type"] = EV_MSG_META_EVENT; json meta;
meta["type"] = EV_MSG_META_EVENT;
string metaType = meta.dump(); string metaType = meta.dump();
int ret = 0; int ret = 0;
vector<vector<uint8_t> > v = {str2body(this->pullerGid), str2body(metaType), str2body("")}; vector<vector<uint8_t> > v = {str2body(this->pullerGid), str2body(metaType), str2body("")};
while(true){ while(true) {
if(!this->evtQueue->empty()){ if(!this->evtQueue->empty()) {
string evt = this->evtQueue->front(); string evt = this->evtQueue->front();
v[2] = str2body(evt); v[2] = str2body(evt);
this->evtQueue->pop(); this->evtQueue->pop();
...@@ -541,7 +547,8 @@ protected: ...@@ -541,7 +547,8 @@ protected:
if(ret < 0) { if(ret < 0) {
spdlog::error("evmlmotion {} {} failed to send event: {}, {}", this->devSn, this->iid, evt, zmq_strerror(zmq_errno())); spdlog::error("evmlmotion {} {} failed to send event: {}, {}", this->devSn, this->iid, evt, zmq_strerror(zmq_errno()));
} }
}else{ }
else {
this_thread::sleep_for(chrono::seconds(3)); this_thread::sleep_for(chrono::seconds(3));
} }
} }
...@@ -610,7 +617,8 @@ public: ...@@ -610,7 +617,8 @@ public:
getInputFormat(); getInputFormat();
setupStream(); setupStream();
}; };
~EvMLMotion() { ~EvMLMotion()
{
if(pSub != NULL) { if(pSub != NULL) {
zmq_close(pSub); zmq_close(pSub);
pSub = NULL; pSub = NULL;
...@@ -658,7 +666,8 @@ int main(int argc, const char *argv[]) ...@@ -658,7 +666,8 @@ int main(int argc, const char *argv[])
string p = evtQueue.front(); string p = evtQueue.front();
spdlog::info("event: {}", p); spdlog::info("event: {}", p);
evtQueue.pop(); evtQueue.pop();
}else{ }
else {
this_thread::sleep_for(chrono::duration(chrono::seconds(2))); this_thread::sleep_for(chrono::duration(chrono::seconds(2)));
} }
} }
......
/* /*
module: evpuller module: evpuller
description: description:
author: Bruce.Lu <lzbgt@icloud.com> author: Bruce.Lu <lzbgt@icloud.com>
update: 2019/08/23 update: 2019/08/23
*/ */
...@@ -111,7 +111,7 @@ protected: ...@@ -111,7 +111,7 @@ protected:
// }); // });
// thPing.detach(); // thPing.detach();
// init response msg // init response msg
while (true) { while (true) {
if(checkStop() == true) { if(checkStop() == true) {
......
/* /*
module: evpusher module: evpusher
description: description:
author: Bruce.Lu <lzbgt@icloud.com> author: Bruce.Lu <lzbgt@icloud.com>
update: 2019/08/23 update: 2019/08/23
*/ */
......
/* /*
module: evslicer module: evslicer
description: description:
author: Bruce.Lu <lzbgt@icloud.com> author: Bruce.Lu <lzbgt@icloud.com>
update: 2019/08/20 update: 2019/08/20
*/ */
...@@ -20,6 +20,7 @@ update: 2019/08/20 ...@@ -20,6 +20,7 @@ update: 2019/08/20
#include <filesystem> #include <filesystem>
namespace fs = std::filesystem; namespace fs = std::filesystem;
#endif #endif
#include <cstdlib> #include <cstdlib>
#include "zmqhelper.hpp" #include "zmqhelper.hpp"
#include "tinythread.hpp" #include "tinythread.hpp"
...@@ -128,7 +129,7 @@ private: ...@@ -128,7 +129,7 @@ private:
numSlices = 24 * days * 60 /minutes; numSlices = 24 * days * 60 /minutes;
// alloc memory // alloc memory
sliceIdxToName = new vector<int>(numSlices); sliceIdxToName = new vector<int>(numSlices);
// load db // TODO: load db
// DB::exec(NULL, "select id, ts, last from slices;", DB::get_slices, sliceIdxToName); // DB::exec(NULL, "select id, ts, last from slices;", DB::get_slices, sliceIdxToName);
spdlog::info("mkdir -p {}", urlOut); spdlog::info("mkdir -p {}", urlOut);
ret = system((string("mkdir -p ") + urlOut).c_str()); ret = system((string("mkdir -p ") + urlOut).c_str());
...@@ -443,13 +444,13 @@ protected: ...@@ -443,13 +444,13 @@ protected:
break; break;
} }
} }
end = chrono::system_clock::now(); end = chrono::system_clock::now();
}// while in slice }// while in slice
// write tail // write tail
// close output context // close output context
if (pAVFormatRemux != NULL){ if (pAVFormatRemux != NULL) {
if(pAVFormatRemux->pb != NULL){ if(pAVFormatRemux->pb != NULL) {
avio_closep(&pAVFormatRemux->pb); avio_closep(&pAVFormatRemux->pb);
} }
avformat_free_context(pAVFormatRemux); avformat_free_context(pAVFormatRemux);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论