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

init

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