提交 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",
"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", "password":"FWBWTU",
"status":1, "services":{
"modules":{ "evmgr":{
"evpuller":[ "sn":"ILS-1",
{ "addr":"0.0.0.0",
"sn":"ILSEVPULLER1", "port-pub":5556,
"addr":"172.31.0.76", "port-rep":5557,
"iid":1, "iid":1
"port-pub":"5556", },
"status":1 "evpuller":{
} "sn":"ILS-2",
], "addr":"0.0.0.0",
"port-pub":5556,
"port-rep":5557,
"iid":2
},
"evpusher":[ "evpusher":[
{ {
"sn":"ILSEVPUSHER1", "sn":"ILS-2",
"iid":1, "addr":"localhost",
"proto":"rtsp", "iid":2,
"addrDest":"40.73.41.176",
"portDest":554,
"user":"",
"password":"",
"token":"",
"enabled":1, "enabled":1,
"status":1 "urlDest":"rtsp://40.73.41.176:554/test1"
} }
], ],
"evslicer":[ "evslicer":[
{ {
"sn":"ILSEVSLICER1", "sn":"ILS-3",
"iid":1, "addr":"192.168.0.25",
"path":"slices", "iid":3,
"enabled":1, "path": "/var/lib/slices/"
"status":1
} }
], ],
"evml":[ "evml":[
{ {
"type":"motion", "feature":"motion",
"sn":"ILSEVMLMOTION1", "sn":"ILS-4",
"iid":1, "addr":"192.168.0.26",
"enabled":1, "iid":4
"status":1
}
]
}
} }
] ]
} }
} }
} }
\ No newline at end of file \ No newline at end of file
...@@ -18,20 +18,22 @@ using namespace std; ...@@ -18,20 +18,22 @@ using namespace std;
using json = nlohmann::json; using json = nlohmann::json;
namespace DB { namespace DB {
map<string, sqlite3 *> maphdb; map<string, sqlite3 *> maphdb;
map<string, mutex> mapMut; map<string, mutex> mapMut;
static bool bRand = false; static bool bRand = false;
//typedef int (*callback)(void*,int,char**,char**); //typedef int (*callback)(void*,int,char**,char**);
sqlite3* exec(void *pUserData, const char* fileName, const char* stmt, callback cb){ sqlite3* exec(void *pUserData, const char* fileName, const char* stmt, callback cb)
{
int ret = 0; int ret = 0;
if(fileName == NULL||strlen(fileName) == 0) { if(fileName == NULL||strlen(fileName) == 0) {
fileName = const_cast<char*>("default.db"); fileName = const_cast<char*>("default.db");
} }
sqlite3 *pdb = NULL; sqlite3 *pdb = NULL;
try{ try {
pdb = maphdb.at(string(fileName)); pdb = maphdb.at(string(fileName));
}catch(...){ }
catch(...) {
pdb = NULL; pdb = NULL;
} }
...@@ -40,8 +42,7 @@ namespace DB { ...@@ -40,8 +42,7 @@ namespace DB {
std::lock_guard<std::mutex> lock(mut); std::lock_guard<std::mutex> lock(mut);
if(pdb == NULL) { if(pdb == NULL) {
ret = sqlite3_open(fileName,&pdb); ret = sqlite3_open(fileName,&pdb);
if(ret != SQLITE_OK) if(ret != SQLITE_OK) {
{
spdlog::error("sqlite3_open: {}",sqlite3_errmsg(pdb)); spdlog::error("sqlite3_open: {}",sqlite3_errmsg(pdb));
exit(1); exit(1);
} }
...@@ -54,17 +55,17 @@ namespace DB { ...@@ -54,17 +55,17 @@ namespace DB {
if(stmt != NULL) { if(stmt != NULL) {
std::lock_guard<std::mutex> lock(mut); std::lock_guard<std::mutex> lock(mut);
ret = sqlite3_exec(pdb, stmt, cb, pUserData, NULL); ret = sqlite3_exec(pdb, stmt, cb, pUserData, NULL);
if(ret != SQLITE_OK) if(ret != SQLITE_OK) {
{
spdlog::error("sqlite3_exec: {}",sqlite3_errmsg(pdb)); spdlog::error("sqlite3_exec: {}",sqlite3_errmsg(pdb));
} }
} }
//sqlite3_close(pdb); //sqlite3_close(pdb);
return pdb; return pdb;
} }
string genStrRand(int length) { string genStrRand(int length)
{
if(!bRand) { if(!bRand) {
srand(time(NULL)); srand(time(NULL));
bRand = true; bRand = true;
...@@ -78,29 +79,34 @@ namespace DB { ...@@ -78,29 +79,34 @@ namespace DB {
result[i] = charset[rand() % charset.length()]; result[i] = charset[rand() % charset.length()];
return result; return result;
} }
int _getSn(void *pUser, int cc, char **cv, char **cn) { int _getSn(void *pUser, int cc, char **cv, char **cn)
{
int ret = SQLITE_OK; int ret = SQLITE_OK;
auto v = static_cast<string*>(pUser); auto v = static_cast<string*>(pUser);
if(cc == 1) { if(cc == 1) {
*v = string(cv[0]); *v = string(cv[0]);
}else{ }
else {
if(ret < 1) { if(ret < 1) {
ret = -1; ret = -1;
}else{ }
else {
ret = 1; ret = 1;
} }
} }
return ret; return ret;
} }
int setSn(const char *sn, const char *fileName) { int setSn(const char *sn, const char *fileName)
{
int ret = 0; int ret = 0;
return ret; return ret;
} }
int setLocalConfig(json config, const char* fileName) { int setLocalConfig(json config, const char* fileName)
{
int ret = 0; int ret = 0;
string stmt; string stmt;
sqlite3* pdb =NULL; sqlite3* pdb =NULL;
...@@ -126,99 +132,41 @@ namespace DB { ...@@ -126,99 +132,41 @@ namespace DB {
} }
return ret; return ret;
} }
int getLocalConfig(json config) { int getLocalConfig(json config)
{
int ret = 0; int ret = 0;
return ret; return ret;
} }
int _getSlices(void *pUser, int cc, char **cv, char **cn) { int _getSlices(void *pUser, int cc, char **cv, char **cn)
{
int ret = 0; int ret = 0;
auto v = static_cast< vector<int>* >(pUser); auto v = static_cast< vector<int>* >(pUser);
if(cc != v->size()) { if(cc != v->size()) {
return SQLITE_ERROR; return SQLITE_ERROR;
}else{ }
else {
for(int i = 0; i < v->size(); i ++) { for(int i = 0; i < v->size(); i ++) {
v->at(i) = atoi(cv[0]); v->at(i) = atoi(cv[0]);
} }
} }
return ret; return ret;
}
/*
{
"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
}
]
}
}
} }
*/
// tables: info, evmgr, evpuller, evpusher, evslice, evml, ipc, log // table and schema
// schemas:
// info: id, cls text, value text, version, update datetime // modules: id integer, pid integer, iid integer, cls text, sn text, config text, online integer, enabled integer, update
// ex: 1, sn, ILS112233, NULL, NULL // eg: 2, 0, NULL, evmgr, ILSEVMGR1, "xxxx", 1, 1, ts
// 2, evmgr, NULL, 1.2, 2019-09-02 // : 3, 2, NULL, ipc, NULL, "xxx", 1, 1, ts
// 3, evpuller, NULL, 1.2, 2019-09-02 // : 5, 3, 1, evpuller, "ILSEVPULLER1", "xxx", 1, 1, ts
// 4, evml-motion, NULL, 1.2, 2019-09-02 // cls = evmgr|ipc|evpuller|evpusher|evslicer|evmlmotion
// ipc: id, user, passwd, addr, status
// ex: 1, admin, FWBWTU, 172.31.0.51, 0 int getSlices(void *pUser, int iid, const char *fileName)
// evmgr: iid integer, sn, cid <id_of_ipc>, addr text, status {
// evpuller: iid, sn, cid <id_of_ipc>, addr, pub, rep, status;
// evpusher: iid, sn, pid <id_of_puller>, urldest, enabled, status;
// evslicer: iid, sn, pid, urldest, days, miniutes, status;
// evml: iid, sn, pid, cls, enabled, status
//
//
int getSlices(void *pUser, int iid, const char *fileName) {
int ret = 0; int ret = 0;
sqlite3 * pdb = NULL; sqlite3 * pdb = NULL;
auto v = static_cast< vector<int>* >(pUser); auto v = static_cast< vector<int>* >(pUser);
...@@ -231,7 +179,8 @@ namespace DB { ...@@ -231,7 +179,8 @@ namespace DB {
if(sqlite3_errcode(pdb) != SQLITE_OK) { if(sqlite3_errcode(pdb) != SQLITE_OK) {
spdlog::error("failed create table slices for evslicer {}", iid); spdlog::error("failed create table slices for evslicer {}", iid);
return -1; return -1;
}else{ }
else {
for(int i = 1; i <= v->size(); i ++) { for(int i = 1; i <= v->size(); i ++) {
stmt = "insert into slices(id, iid, ts) values(" + to_string(i) + to_string(iid) + ", 0"; stmt = "insert into slices(id, iid, ts) values(" + to_string(i) + to_string(iid) + ", 0";
pdb = exec(NULL, fileName, stmt.c_str(), NULL); pdb = exec(NULL, fileName, stmt.c_str(), NULL);
...@@ -244,10 +193,11 @@ namespace DB { ...@@ -244,10 +193,11 @@ namespace DB {
if(sqlite3_errcode(pdb) != SQLITE_OK) return -3; if(sqlite3_errcode(pdb) != SQLITE_OK) return -3;
v->at(0) = 2; v->at(0) = 2;
} }
}else{ }
else {
} }
return ret; return ret;
} }
} }
\ 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;
} }
......
...@@ -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"];
} }
...@@ -456,7 +457,8 @@ private: ...@@ -456,7 +457,8 @@ private:
if(dura > detPara.pre) { if(dura > detPara.pre) {
spdlog::info("state: PRE->PRE"); spdlog::info("state: PRE->PRE");
evtState = PRE; evtState = PRE;
}else{ }
else {
evtState = IN; evtState = IN;
json p; json p;
spdlog::info("state: PRE->IN"); spdlog::info("state: PRE->IN");
...@@ -470,8 +472,9 @@ private: ...@@ -470,8 +472,9 @@ private:
evtQueue->pop(); evtQueue->pop();
} }
} }
}else{ }
if(dura > detPara.pre){ else {
if(dura > detPara.pre) {
evtState= NONE; evtState= NONE;
spdlog::info("state: PRE->NONE"); spdlog::info("state: PRE->NONE");
} }
...@@ -479,12 +482,13 @@ private: ...@@ -479,12 +482,13 @@ private:
break; break;
} }
case IN: { case IN: {
if(!hasEvent){ if(!hasEvent) {
if(dura > (int)(detPara.post/2)){ if(dura > (int)(detPara.post/2)) {
evtState = POST; evtState = POST;
spdlog::info("state: IN->POST"); spdlog::info("state: IN->POST");
} }
}else{ }
else {
evtStartTmLast = evtStartTm; evtStartTmLast = evtStartTm;
spdlog::info("state: IN->IN"); spdlog::info("state: IN->IN");
} }
...@@ -505,7 +509,8 @@ private: ...@@ -505,7 +509,8 @@ private:
evtQueue->pop(); evtQueue->pop();
} }
} }
}else{ }
else {
spdlog::info("state: POST->IN"); spdlog::info("state: POST->IN");
evtState=IN; evtState=IN;
evtStartTmLast = evtStartTm; evtStartTmLast = evtStartTm;
...@@ -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)));
} }
} }
......
...@@ -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());
...@@ -448,8 +449,8 @@ protected: ...@@ -448,8 +449,8 @@ protected:
}// 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论