coreobject.cpp 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  1. #include "coreobject.h"
  2. #define iServerIP "172.19.198.166"
  3. #define oServerIP "47.103.74.123"
  4. //#define iServerIP "172.19.198.168"
  5. //#define oServerIP "101.133.214.75"
  6. #define UN_REFERENCED_PARAMETER(x) {(x) = (x);}
  7. extern BOOL CALLBACK RegisterCallBack(LONG lUserID, DWORD dwDataType, void *pOutBuffer, DWORD dwOutLen, void *pInBuffer, DWORD dwInLen, void *pUser);
  8. extern BOOL CALLBACK fnPREVIEW_NEWLINK_CB(LONG lPreviewHandle, NET_EHOME_NEWLINK_CB_MSG *pNewLinkCBMsg, void *pUserData);
  9. extern void CALLBACK fnPREVIEW_DATA_CB(LONG lPreviewHandle, NET_EHOME_PREVIEW_CB_MSG *pPreviewCBMsg, void *pUserData);
  10. extern BOOL InputStreamData(QString deviceid, BYTE byDataType, char* pBuffer, int iDataLen);
  11. extern BOOL CALLBACK AlarmMSGCallBack (LONG lHaldle, NET_EHOME_ALARM_MSG *pAlarmMsg, void *pUserData);
  12. extern QDateTime getFullTime(FullTime fTime);
  13. extern void setFullTime(FullTime *fTime, QDateTime qTime);
  14. extern QString getNewId();
  15. uint start_time;
  16. bool had_reg;
  17. int nopic_count;
  18. MyEHomeShm *ytShm;
  19. CoreObject::CoreObject(QObject *parent) :
  20. QObject(parent)
  21. {
  22. nopic_count = 0;
  23. processList.clear();
  24. sqlList.clear();
  25. reportList.clear();
  26. companyphoneList.clear();
  27. isWorking = false;
  28. alarmListenHandle = -1;
  29. start_time = QDateTime::currentDateTime().toTime_t();
  30. had_reg = false;
  31. timer = new QTimer();
  32. db = QSqlDatabase::addDatabase("QMYSQL","conf_db");
  33. db.setDatabaseName("jdxf");
  34. db.setHostName("47.98.201.187");
  35. db.setUserName("root");
  36. db.setPassword("Yt2018IoT");
  37. NET_ESTREAM_Init();
  38. NET_EALARM_Init();
  39. NET_ECMS_Init();
  40. if(shm_load()){
  41. QDateTime zeroTime = QDateTime::fromTime_t(0);
  42. for(int i=0;i<DEVICES_COUNT;i++){
  43. alarmTime[i]=0;
  44. ytShm->eHomeDevice[i].LoginId = -1;
  45. ytShm->eHomeDevice[i].SessionId = -1;
  46. ytShm->eHomeDevice[i].listen_preview_handle = -1;
  47. ytShm->eHomeDevice[i].listen_alarm_handle = -1;
  48. ytShm->eHomeDevice[i].lLinkHandle = -1;
  49. ytShm->eHomeDevice[i].previewId = -1;
  50. ytShm->eHomeDevice[i].Connected = 0x00;
  51. ytShm->eHomeDevice[i].Inited = 0x00;
  52. ytShm->eHomeDevice[i].onLined = 0x00;
  53. ytShm->eHomeDevice[i].savetmp = 0x00;
  54. ytShm->eHomeDevice[i].transed = 0x00;
  55. for(int j=0;j<7;j++)
  56. ytShm->eHomeDevice[i].io[j] = 0x00;
  57. ytShm->eHomeDevice[i].time[0]=0;
  58. ytShm->eHomeDevice[i].time[1]=0;
  59. ytShm->eHomeDevice[i].tmpfile = NULL;
  60. setFullTime(&(ytShm->eHomeDevice[i].onLinetime),zeroTime);
  61. setFullTime(&(ytShm->eHomeDevice[i].transtime),zeroTime);
  62. QProcess *process = new QProcess(this);
  63. connect(process,SIGNAL(finished(int)),this,SLOT(process_stop()));
  64. connect(process,SIGNAL(destroyed()),this,SLOT(process_stop()));
  65. connect(process,SIGNAL(aboutToClose()),this,SLOT(process_stop()));
  66. processList.append(process);
  67. }
  68. for(quint16 i=0;i<8;i++){
  69. wxThreads[i] = new WechartThreads(this,i,"47.98.201.73","/jdxf/wxapp2.php/Home/GeneralPush/voice");
  70. wssThread[i] = new ttsThreads(this,i,"47.98.201.73","/report",55125);
  71. spThread[i] = new ttsThreads(this,i,"47.98.201.187","/report",55335);
  72. // connect(wxThreads[i],&WechartThreads::wxchart,this,&CoreObject::chartlog);
  73. // connect(wssThread[i],&ttsThreads::ttslog,this,&CoreObject::chartlog);
  74. // connect(spThread[i],&ttsThreads::ttslog,this,&CoreObject::chartlog);
  75. wxThreads[i]->start();
  76. wssThread[i]->start();
  77. spThread[i]->start();
  78. }
  79. repcur = 0;
  80. wxcur = 0;
  81. }
  82. logThread = new LogThread(this);
  83. logThread->start();
  84. chkPhoneList();
  85. connect(timer,SIGNAL(timeout()),this,SLOT(time_out()));
  86. time_out();
  87. }
  88. CoreObject::~CoreObject()
  89. {
  90. for(int i=0;i<processList.length();i++){
  91. if(processList.at(i)->pid()>0)
  92. processList.at(i)->close();
  93. if(ytShm->eHomeDevice[i].listen_preview_handle>=-1){
  94. NET_ESTREAM_StopListenPreview(ytShm->eHomeDevice[i].listen_preview_handle);
  95. }
  96. }
  97. if(alarmListenHandle>-1)
  98. NET_EALARM_StopListen(alarmListenHandle);
  99. NET_ECMS_Fini();
  100. NET_ESTREAM_Fini();
  101. NET_EALARM_Fini();
  102. }
  103. void CoreObject::chkPhoneList()
  104. {
  105. if(db.open()){
  106. QList<Company_Phone> tmpList;
  107. QSqlQuery qry = db.exec("select owner_code, phone from sp_owner_phone where phone<>''");
  108. while (qry.next()) {
  109. tmpList.append(Company_Phone(qry.value(0).toString(),qry.value(1).toString()));
  110. }
  111. db.close();
  112. companyphoneList.clear();
  113. if(tmpList.length()>0)
  114. companyphoneList.append(tmpList);
  115. synchour = QTime::currentTime().hour();
  116. }
  117. }
  118. void CoreObject::chartlog(quint16 idx, QDateTime t, QString data, bool dirflag){
  119. if((idx<DEVICES_COUNT)&&(QString(ytShm->eHomeDevice[idx].deviceID).length()>0))
  120. {
  121. QString log;
  122. if(dirflag)
  123. log = QString("[ %1 (%2) >>> ] %3").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(ytShm->eHomeDevice[idx].deviceID).arg(data);
  124. else
  125. log = QString("[ %1 (%2) >>> ] %3").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(ytShm->eHomeDevice[idx].deviceID).arg(data);
  126. logThread->appendData(log);
  127. }
  128. }
  129. bool CoreObject::shm_load()
  130. {
  131. int shmid;
  132. key_t key;
  133. if((key = ftok(SHM_PATH,(int)SHM_PORT))==-1)
  134. return false;
  135. if((shmid = shmget(key,sizeof(MyEHomeShm),IPC_CREAT|0666))==-1)
  136. return false;
  137. ytShm = (MyEHomeShm *)shmat(shmid,NULL,0);
  138. return true;
  139. }
  140. QString getNewId()
  141. {
  142. return QUuid::createUuid().toString().replace("{","").replace("}","");
  143. }
  144. BOOL RegisterCallBack(LONG lUserID, DWORD dwDataType, void *pOutBuffer, DWORD dwOutLen, void *pInBuffer, DWORD dwInLen, void *pUser)
  145. {
  146. int i,idx=0;
  147. bool found = false;
  148. had_reg = true;
  149. CoreObject *obj = (CoreObject *)pUser;
  150. QDateTime zeroTime = QDateTime::fromTime_t(0);
  151. QDateTime t_now = QDateTime::currentDateTime();
  152. ytShm->workingTime[0] = t_now.toTime_t();
  153. if (ENUM_DEV_ON == dwDataType)
  154. {
  155. NET_EHOME_DEV_REG_INFO *pDevInfo = (NET_EHOME_DEV_REG_INFO *)pOutBuffer;
  156. // qDebug()<<"RegisterCallBack: "<<(char*)(pDevInfo->byDeviceID);
  157. if(pDevInfo!=NULL)
  158. {
  159. for(i=0;i<DEVICES_COUNT;i++){
  160. if(strcmp(ytShm->eHomeDevice[i].deviceID,QString((char*)(pDevInfo->byDeviceID)).replace(" ","_").toUtf8().data())==0){
  161. found = true;
  162. memcpy(ytShm->eHomeDevice[i].devIp,(char *)(pDevInfo->struDevAdd.szIP),sizeof(ytShm->eHomeDevice[i].devIp));
  163. // obj->appendLog(QString("[ %1 (%2) online ]").arg(t_now.toString("yyyy-MM-dd HH:mm:ss")).arg(ytShm->eHomeDevice[i].deviceID));
  164. ytShm->eHomeDevice[i].LoginId = lUserID;
  165. ytShm->eHomeDevice[i].Connected = 0x00;
  166. ytShm->eHomeDevice[i].Inited = 0x01;
  167. ytShm->eHomeDevice[i].onLined = 0x00;
  168. ytShm->eHomeDevice[i].savetmp = 0x00;
  169. // if(ytShm->eHomeDevice[i].tmpfile!=NULL)
  170. // fclose(ytShm->eHomeDevice[i].tmpfile);
  171. ytShm->eHomeDevice[i].tmpfile = NULL;
  172. ytShm->eHomeDevice[i].transed = 0x00;
  173. ytShm->eHomeDevice[i].io[15]=0x00;
  174. ytShm->eHomeDevice[i].io[14]=0x03;
  175. setFullTime(&(ytShm->eHomeDevice[i].onLinetime),zeroTime);
  176. setFullTime(&(ytShm->eHomeDevice[i].transtime),zeroTime);
  177. idx=i;
  178. break;
  179. }
  180. }
  181. if(!found){
  182. return FALSE;
  183. }
  184. //输入参数
  185. NET_EHOME_SERVER_INFO *pServerInfo = (NET_EHOME_SERVER_INFO *)pInBuffer;
  186. pServerInfo->dwTimeOutCount = 6; //心跳超时次数
  187. pServerInfo->dwKeepAliveSec = 15; //心跳间隔
  188. memcpy(pServerInfo->struUDPAlarmSever.szIP, oServerIP, sizeof(oServerIP));
  189. memcpy(pServerInfo->struTCPAlarmSever.szIP, oServerIP, sizeof(oServerIP)); //报警服务器IP地址(TCP协议)
  190. pServerInfo->struUDPAlarmSever.wPort = 7669; //报警服务器端口(UDP协议),需要和报警服务器启动监听的端口一致
  191. pServerInfo->struTCPAlarmSever.wPort = 7668;
  192. pServerInfo->dwAlarmServerType = 1; //报警服务器类型:0- 只支持UDP协议上报,1- 支持UDP、TCP两种协议上报
  193. }
  194. }else if (ENUM_DEV_OFF == dwDataType){
  195. for(int i=0;i<DEVICES_COUNT;i++){
  196. if(ytShm->eHomeDevice[i].LoginId==lUserID){
  197. ytShm->eHomeDevice[i].io[15]=0x00;
  198. ytShm->eHomeDevice[i].io[14]=0x02;
  199. ytShm->eHomeDevice[i].LoginId = -1;
  200. // obj->appendLog(QString("[ %1 (%2) offline ]").arg(t_now.toString("yyyy-MM-dd HH:mm:ss")).arg(ytShm->eHomeDevice[i].deviceID));
  201. if(ytShm->eHomeDevice[i].SessionId>=0){
  202. if(NET_ECMS_StopGetRealStream(lUserID,ytShm->eHomeDevice[i].SessionId)){
  203. ytShm->eHomeDevice[i].SessionId = -1;
  204. if(ytShm->eHomeDevice[i].previewId>=0){
  205. if(NET_ESTREAM_StopPreview(ytShm->eHomeDevice[i].previewId)){
  206. ytShm->eHomeDevice[i].previewId = -1;
  207. QString tmpfile = QString(ytShm->eHomeDevice[i].filename);
  208. QFile(tmpfile).remove();
  209. ytShm->eHomeDevice[i].Connected = 0x00;
  210. // bzero(ytShm->eHomeDevice[i].deviceID,sizeof(ytShm->eHomeDevice[i].deviceID));
  211. ytShm->eHomeDevice[i].Inited = 0x00;
  212. ytShm->eHomeDevice[i].onLined = 0x00;
  213. setFullTime(&(ytShm->eHomeDevice[i].onLinetime),zeroTime);
  214. setFullTime(&(ytShm->eHomeDevice[i].transtime),zeroTime);
  215. ytShm->eHomeDevice[i].savetmp = 0x00;
  216. // if(ytShm->eHomeDevice[i].tmpfile!=NULL)
  217. // fclose(ytShm->eHomeDevice[i].tmpfile);
  218. ytShm->eHomeDevice[i].tmpfile = NULL;
  219. ytShm->eHomeDevice[i].transed = 0x00;
  220. if(ytShm->eHomeDevice[i].lLinkHandle>0){
  221. if(NET_ESTREAM_StopListenPreview(ytShm->eHomeDevice[i].lLinkHandle)){
  222. ytShm->eHomeDevice[i].lLinkHandle = -1;
  223. }
  224. }
  225. }
  226. }
  227. }
  228. }else{
  229. QString tmpfile = QString(ytShm->eHomeDevice[i].filename);
  230. QFile(tmpfile).remove();
  231. ytShm->eHomeDevice[i].io[15]=0x00;
  232. ytShm->eHomeDevice[i].Connected = 0x00;
  233. // bzero(ytShm->eHomeDevice[i].deviceID,sizeof(ytShm->eHomeDevice[i].deviceID));
  234. ytShm->eHomeDevice[i].Inited = 0x00;
  235. ytShm->eHomeDevice[i].onLined = 0x00;
  236. ytShm->eHomeDevice[i].LoginId = -1;
  237. setFullTime(&(ytShm->eHomeDevice[i].onLinetime),zeroTime);
  238. setFullTime(&(ytShm->eHomeDevice[i].transtime),zeroTime);
  239. ytShm->eHomeDevice[i].lLinkHandle = -1;
  240. ytShm->eHomeDevice[i].savetmp = 0x00;
  241. // if(ytShm->eHomeDevice[i].transed==0x01)
  242. // fclose(ytShm->eHomeDevice[i].tmpfile);
  243. ytShm->eHomeDevice[i].tmpfile = NULL;
  244. ytShm->eHomeDevice[i].transed = 0x00;
  245. }
  246. break;
  247. }
  248. }
  249. NET_ECMS_ForceLogout(lUserID);
  250. }
  251. return TRUE;
  252. }
  253. BOOL CALLBACK fnPREVIEW_NEWLINK_CB(LONG lPreviewHandle, NET_EHOME_NEWLINK_CB_MSG *pNewLinkCBMsg, void *pUserData)
  254. {
  255. ytShm->workingTime[0] = QDateTime::currentDateTime().toTime_t();
  256. for(int i=0;i<DEVICES_COUNT;i++){
  257. if((ytShm->eHomeDevice[i].LoginId>-1)&&(ytShm->eHomeDevice[i].listen_preview_handle>-1)){
  258. if(strcmp(ytShm->eHomeDevice[i].deviceID,QString((char *)pNewLinkCBMsg->szDeviceID).replace(" ","_").toUtf8().data())==0){
  259. // if(ytShm->eHomeDevice[i].SessionId == pNewLinkCBMsg->iSessionID){
  260. // printf("fnPREVIEW_NEWLINK_CB:%s\n",ytShm->eHomeDevice[i].deviceID);
  261. ytShm->eHomeDevice[i].lLinkHandle = lPreviewHandle;
  262. NET_EHOME_PREVIEW_DATA_CB_PARAM struDataCB = {0};
  263. struDataCB.pUserData = &(ytShm->eHomeDevice[i]);
  264. struDataCB.fnPreviewDataCB = fnPREVIEW_DATA_CB;
  265. struDataCB.byStreamFormat = 0;//封装格式:0- PS
  266. if (!NET_ESTREAM_SetPreviewDataCB(lPreviewHandle, &struDataCB))
  267. {
  268. ytShm->eHomeDevice[i].SessionId = -1;
  269. ytShm->eHomeDevice[i].Connected = 0x00;;
  270. // printf("NET_ESTREAM_SetPreviewDataCB set failed(%s)\n",ytShm->eHomeDevice[i].deviceID);
  271. return false;
  272. }
  273. // printf("NET_ESTREAM_SetPreviewDataCB set pass(%s)\n",ytShm->eHomeDevice[i].deviceID);
  274. return true;
  275. }
  276. }
  277. }
  278. return false;
  279. }
  280. bool CoreObject::checkAlarmDevTime(QString deviceid){
  281. // return true;
  282. uint t = QDateTime::currentDateTime().toTime_t();
  283. for(int i=0;i<DEVICES_COUNT;i++){
  284. QString devId = QString(ytShm->eHomeDevice[i].deviceID);
  285. if(QString::compare(devId,deviceid)==0){
  286. if((t-alarmTime[i])>180){
  287. alarmTime[i] = t;
  288. return true;
  289. }
  290. }
  291. }
  292. return false;
  293. }
  294. void CALLBACK fnPREVIEW_DATA_CB(LONG lPreviewHandle, NET_EHOME_PREVIEW_CB_MSG *pPreviewCBMsg, void *pUserData)
  295. {
  296. ytShm->workingTime[0] = QDateTime::currentDateTime().toTime_t();
  297. if (NULL == pPreviewCBMsg)
  298. {
  299. return ;
  300. }
  301. EHomeDevice *dev= (EHomeDevice *)pUserData;
  302. dev->Connected = 0x01;
  303. dev->previewId = lPreviewHandle;
  304. InputStreamData(QString(dev->deviceID).replace(" ","_"), pPreviewCBMsg->byDataType, (char*)pPreviewCBMsg->pRecvdata, pPreviewCBMsg->dwDataLen);
  305. }
  306. void ProcessHttpAlarmInfo(void *pXml, unsigned long dwLen, void *pUrl, unsigned long dwUrllen,void *pUserData){
  307. if((pXml==NULL)&&(pUrl==NULL))
  308. return;
  309. UN_REFERENCED_PARAMETER(dwLen);
  310. UN_REFERENCED_PARAMETER(pUrl);
  311. UN_REFERENCED_PARAMETER(dwUrllen);
  312. char deviceID[32] = {0};
  313. char eventTime[20] = {0};
  314. char eventType[128] = {0};
  315. char eventState[20] = {0};
  316. char pic[2][256]={0};
  317. CoreObject *obj = (CoreObject *)pUserData;
  318. LPNET_EHOME_ALARM_ISAPI_INFO pISAPIAlarm = (NET_EHOME_ALARM_ISAPI_INFO *)(pXml);
  319. NET_EHOME_ALARM_ISAPI_INFO struISAPIAlarm = {0};
  320. memcpy(&struISAPIAlarm,pISAPIAlarm, sizeof(NET_EHOME_ALARM_ISAPI_INFO));
  321. if(struISAPIAlarm.pAlarmData)
  322. {
  323. if(struISAPIAlarm.byDataType==2){
  324. }else if(struISAPIAlarm.byDataType==1){
  325. QByteArray data = QByteArray((const char *)(struISAPIAlarm.pAlarmData));
  326. int cur = data.indexOf("--boundary");
  327. if(cur>0){
  328. QXmlStreamReader reader;
  329. reader.addData(data.mid(0,cur));
  330. while(!reader.atEnd()){
  331. if(reader.isStartElement()){
  332. if(reader.name()=="eventType"){
  333. sprintf(eventType,"%s",reader.readElementText().toUtf8().data());
  334. }else if(reader.name()=="deviceID"){
  335. sprintf(deviceID,"%s",reader.readElementText().toUtf8().data());
  336. }else if(reader.name()=="dateTime"){
  337. sprintf(eventTime,"%s",reader.readElementText().replace("T"," ").mid(0,19).toUtf8().data());
  338. }else if(reader.name()=="eventState"){
  339. sprintf(eventState,"%s",reader.readElementText().toUtf8().data());
  340. }
  341. }
  342. reader.readNext();
  343. }
  344. }
  345. }
  346. if(obj->checkAlarmDevTime(deviceID)){
  347. if(struISAPIAlarm.byPicturesNumber>0){
  348. time_t t = QDateTime::currentDateTime().toTime_t();
  349. for(int i=0;i<struISAPIAlarm.byPicturesNumber;i++){
  350. char fname[128];
  351. sprintf(fname,"/usr/local/nginx/html/VideoAlarmPics/pic_%d_%s_%d.jpg",t,deviceID,i);
  352. if(i<2)
  353. sprintf(pic[i],"http://47.103.74.123/VideoAlarmPics/pic_%d_%s_%d.jpg",t,deviceID,i);
  354. FILE *f = fopen(fname,"w");
  355. fwrite(((NET_EHOME_ALARM_ISAPI_PICDATA *)struISAPIAlarm.pPicPackData)[i].pPicData,1,((NET_EHOME_ALARM_ISAPI_PICDATA *)struISAPIAlarm.pPicPackData)[i].dwPicLen,f);
  356. fclose(f);
  357. }
  358. }
  359. obj->reportList.append(Alarm_Report(deviceID,eventTime,QString::fromUtf8("200001"),
  360. QString::fromUtf8("insert into sp_video2017 (id,port,device_code,time,status,address,ncmd,data1,data2,data3,data4,data5,clsj,clr,clnr,clwb,cllxr,cldh,clzt,cllx,video) values (NULL,'%1','%2','%3','%4','','%5','%6','%7','%8','火点/高温检测告警','','1970-01-01 08:00:00','','','','','',0,'','')")
  361. .arg(2).arg(deviceID).arg(eventTime).arg(1)
  362. .arg(2).arg(eventState).arg(pic[0]).arg(pic[1])));
  363. }
  364. }
  365. }
  366. BOOL CALLBACK AlarmMSGCallBack(LONG lHandle, NET_EHOME_ALARM_MSG *pAlarmMsg, void *pUserData)
  367. {
  368. int i,idx;
  369. QDateTime dt = QDateTime::currentDateTime();
  370. CoreObject *obj = (CoreObject *)pUserData;
  371. DWORD dwType = pAlarmMsg->dwAlarmType; //不同的报警类型(dwAlarmType),pAlarmInfo对应不同的报警信息类型
  372. ytShm->workingTime[0] = dt.toTime_t();
  373. if(pAlarmMsg->pHttpUrl!=NULL)
  374. dwType = EHOME_ISAPI_ALARM;
  375. switch(dwType)
  376. {
  377. case EHOME_ALARM_UNKNOWN://未知报警信息
  378. break;
  379. case EHOME_ALARM://基本报警信息:移动侦测、视频遮盖、视频丢失、PIR报警、人脸侦测、区域入侵等
  380. {
  381. NET_EHOME_ALARM_INFO struAlarmInfo;
  382. memcpy(&struAlarmInfo, pAlarmMsg->pAlarmInfo, sizeof(NET_EHOME_ALARM_INFO));
  383. if((struAlarmInfo.dwAlarmType==ALARM_TYPE_INTRUSION)||(struAlarmInfo.dwAlarmType==ALARM_TYPE_LEFT)||(struAlarmInfo.dwAlarmType==ALARM_TYPE_TAKE))
  384. {
  385. QString devId = QString(struAlarmInfo.szDeviceID);
  386. if(obj->checkAlarmDevTime(devId)){
  387. obj->appendLog(QString("[ %1 alm(%2) ] Basic Alarm: Device ID[%3], szAlarmTime[%4], Alarm Type[%5], Action[%6], VideoChannel[%7]!")
  388. .arg(dt.toString("yyyy-MM-dd HH:mm:ss")).arg(obj->alarmList.length())
  389. .arg(struAlarmInfo.szDeviceID).arg(struAlarmInfo.szAlarmTime).arg(struAlarmInfo.dwAlarmType).arg(struAlarmInfo.dwAlarmAction).arg(struAlarmInfo.dwVideoChannel));
  390. for(idx=0;idx<DEVICES_COUNT;idx++){
  391. if((strcmp(ytShm->eHomeDevice[idx].deviceID,(char*)(struAlarmInfo.szDeviceID))==0)
  392. &&((ytShm->eHomeDevice[idx].io[8]==0x02)||(ytShm->eHomeDevice[idx].io[8]==0x04))){
  393. for(i=0;i>obj->alarmList.length();i++){
  394. if(obj->alarmList.at(i).Device_Code.compare(devId)==0){
  395. if((struAlarmInfo.dwAlarmType==ALARM_TYPE_INTRUSION)&&(struAlarmInfo.dwAlarmAction!=0))
  396. obj->alarmList.removeAt(i);
  397. else if(struAlarmInfo.dwAlarmType==ALARM_TYPE_TAKE)
  398. obj->alarmList.removeAt(i);
  399. break;
  400. }
  401. }
  402. QString time1 = QString(struAlarmInfo.szAlarmTime);
  403. QString time2 = time1.mid(0,10)+" "+time1.mid(11,8);
  404. if(struAlarmInfo.dwAlarmType==ALARM_TYPE_INTRUSION)
  405. obj->alarmList.append(AlarmEvent(devId,time2,(struAlarmInfo.dwAlarmAction==0?1:0),dt.toTime_t()));
  406. else
  407. obj->alarmList.append(AlarmEvent(devId,time2,1,dt.toTime_t()));
  408. ytShm->eHomeDevice[idx].io[6]=0x01;
  409. }
  410. }
  411. }
  412. }
  413. }
  414. break;
  415. case EHOME_ISAPI_ALARM:
  416. ProcessHttpAlarmInfo(pAlarmMsg->pAlarmInfo,pAlarmMsg->dwAlarmInfoLen,pAlarmMsg->pHttpUrl,pAlarmMsg->dwHttpUrlLen,pUserData);
  417. break;
  418. default:
  419. break;
  420. }
  421. return TRUE;
  422. }
  423. BOOL InputStreamData(QString deviceid, BYTE byDataType, char* pBuffer, int iDataLen)
  424. {
  425. int i;
  426. uint t = QDateTime::currentDateTime().toTime_t();
  427. ytShm->workingTime[0] = t;
  428. if(iDataLen>0){
  429. nopic_count = 0;
  430. for(i=0;i<DEVICES_COUNT;i++){
  431. if(QString(ytShm->eHomeDevice[i].deviceID).compare(deviceid)==0){
  432. if(ytShm->eHomeDevice[i].io[0]==0x01){
  433. ytShm->eHomeDevice[i].time[0] = t;
  434. if(ytShm->eHomeDevice[i].savetmp==0x00){
  435. if(ytShm->eHomeDevice[i].tmpfile!=NULL){
  436. fclose(ytShm->eHomeDevice[i].tmpfile);
  437. ytShm->eHomeDevice[i].tmpfile = NULL;
  438. }
  439. QString tmpfile = QString("/tmp/%1.mp4").arg(ytShm->eHomeDevice[i].deviceID).replace(" ","_");
  440. sprintf(ytShm->eHomeDevice[i].filename,"%s",tmpfile.toUtf8().data());
  441. setFullTime(&(ytShm->eHomeDevice[i].onLinetime),QDateTime::currentDateTime());
  442. ytShm->eHomeDevice[i].savetmp = 0x01;
  443. ytShm->eHomeDevice[i].tmpfile = fopen(tmpfile.toUtf8().data(),"wb");
  444. fwrite(pBuffer,iDataLen,1,ytShm->eHomeDevice[i].tmpfile);
  445. }else{
  446. if(ytShm->eHomeDevice[i].tmpfile!=NULL){
  447. fwrite(pBuffer,iDataLen,1,ytShm->eHomeDevice[i].tmpfile);
  448. }else{
  449. QString tmpfile = QString("/tmp/%1.mp4").arg(ytShm->eHomeDevice[i].deviceID).replace(" ","_");
  450. sprintf(ytShm->eHomeDevice[i].filename,"%s",tmpfile.toUtf8().data());
  451. setFullTime(&(ytShm->eHomeDevice[i].onLinetime),QDateTime::currentDateTime());
  452. // ytShm->eHomeDevice[i].savetmp = 0x01;
  453. ytShm->eHomeDevice[i].tmpfile = fopen(tmpfile.toUtf8().data(),"wb");
  454. fwrite(pBuffer,iDataLen,1,ytShm->eHomeDevice[i].tmpfile);
  455. }
  456. }
  457. }else{
  458. NET_ECMS_StopGetRealStream(ytShm->eHomeDevice[i].LoginId,ytShm->eHomeDevice[i].SessionId);
  459. }
  460. return true;
  461. }
  462. }
  463. }
  464. return false;
  465. }
  466. void setFullTime(FullTime *fTime, QDateTime qTime){
  467. fTime->YEAR = qTime.date().year()&0xffff;
  468. fTime->MONTH = qTime.date().month()&0xff;
  469. fTime->DAY = qTime.date().day()&0xff;
  470. fTime->HOUR = qTime.time().hour()&0xff;
  471. fTime->MINUTE = qTime.time().minute()&0xff;
  472. fTime->SECOND = qTime.time().second()&0xff;
  473. fTime->TIMESTAMP = qTime.toTime_t();
  474. }
  475. QDateTime getFullTime(FullTime fTime){
  476. if((fTime.YEAR==0)||(fTime.MONTH==0)||(fTime.DAY==0))
  477. return QDateTime::fromTime_t(fTime.TIMESTAMP);
  478. else
  479. return QDateTime(QDate((int)fTime.YEAR,(int)fTime.MONTH,(int)fTime.DAY),QTime((int)fTime.HOUR,(int)fTime.MINUTE,(int)fTime.SECOND));
  480. }
  481. void CoreObject::appendLog(QString log)
  482. {
  483. logThread->appendData(log);
  484. }
  485. void CoreObject::start()
  486. {
  487. //预览监听参数
  488. timer->start(3000);
  489. NET_EHOME_LOCAL_GENERAL_CFG struGeneralCfg = {0};
  490. struGeneralCfg.byAlarmPictureSeparate = 1;
  491. if(!NET_EALARM_SetSDKLocalCfg(LOCAL_CFG_TYPE_GENERAL,&struGeneralCfg)){
  492. // printf("NET_EALARM_SetSDKLocalCfg falied\n");
  493. NET_ECMS_Fini();
  494. return;
  495. }
  496. // printf("NET_EALARM_SetSDKLocalCfg pass!\n");
  497. //报警监听参数
  498. NET_EHOME_ALARM_LISTEN_PARAM struTcpAlarmListenParam = {0};
  499. memcpy(struTcpAlarmListenParam.struAddress.szIP, iServerIP, sizeof(iServerIP));
  500. struTcpAlarmListenParam.byProtocolType = 0;
  501. struTcpAlarmListenParam.struAddress.wPort = 7668;
  502. struTcpAlarmListenParam.fnMsgCb = AlarmMSGCallBack;
  503. struTcpAlarmListenParam.pUserData = this;
  504. struTcpAlarmListenParam.byUseCmsPort = 0;
  505. struTcpAlarmListenParam.byUseThreadPool = 0;
  506. if((alarmListenHandle=NET_EALARM_StartListen(&struTcpAlarmListenParam))<-1){
  507. // printf("NET_EALARM_StartListen TCP failed, error code: %d\n", NET_EALARM_GetLastError());
  508. NET_ECMS_Fini();
  509. NET_ESTREAM_Fini();
  510. NET_EALARM_Fini();
  511. exit(1);
  512. }
  513. // printf("NET_EALARM_StartListen TCP!\n");
  514. //报警监听参数
  515. NET_EHOME_ALARM_LISTEN_PARAM struListen = {0};
  516. memcpy(struListen.struAddress.szIP, iServerIP, sizeof(iServerIP));
  517. struListen.struAddress.wPort = 7669; //报警服务器监听端口
  518. struListen.fnMsgCb = AlarmMSGCallBack; //报警回调函数
  519. struListen.pUserData = this;
  520. struListen.byUseCmsPort = 0;
  521. struListen.byUseThreadPool = 0;
  522. struListen.byProtocolType = 1; //0- TCP方式(保留,暂不支持),1- UDP方式
  523. //启动报警监听
  524. LONG lHandle = NET_EALARM_StartListen(&struListen);
  525. if(lHandle< -1)
  526. {
  527. // printf("NET_EALARM_StartListen failed, error code: %d\n", NET_EALARM_GetLastError());
  528. NET_ECMS_Fini();
  529. NET_ESTREAM_Fini();
  530. NET_EALARM_Fini();
  531. exit(1);
  532. }
  533. // printf("NET_EALARM_StartListen!\n");
  534. NET_ECMS_SetLogToFile(1,QString("/var/log/usky/").toUtf8().data(),true);
  535. for(int i=0;i<DEVICES_COUNT;i++){
  536. ytShm->eHomeDevice[i].previewport = 58000+i;
  537. ytShm->eHomeDevice[i].listen_alarm_handle = lHandle;
  538. NET_EHOME_LISTEN_PREVIEW_CFG struListen = {0};
  539. memcpy(struListen.struIPAdress.szIP,iServerIP, sizeof(iServerIP));
  540. struListen.struIPAdress.wPort = ytShm->eHomeDevice[i].previewport; //流媒体服务器监听端口
  541. struListen.fnNewLinkCB = fnPREVIEW_NEWLINK_CB; //预览连接请求回调函数
  542. struListen.pUser =&(ytShm->eHomeDevice[i]);
  543. struListen.byLinkMode = 0; //0- TCP方式,1- UDP方式
  544. lHandle = NET_ESTREAM_StartListenPreview(&struListen);
  545. if(lHandle<-1){
  546. }else{
  547. ytShm->eHomeDevice[i].listen_preview_handle = lHandle;
  548. }
  549. }
  550. NET_EHOME_CMS_LISTEN_PARAM struCMSListenPara = {0};
  551. memcpy(struCMSListenPara.struAddress.szIP, "0.0.0.0", sizeof("0.0.0.0"));
  552. struCMSListenPara.struAddress.wPort = 7660;
  553. struCMSListenPara.fnCB = RegisterCallBack;
  554. struCMSListenPara.pUserData = this;
  555. LONG lListen = NET_ECMS_StartListen(&struCMSListenPara);
  556. if(lListen < -1)
  557. {
  558. NET_ECMS_Fini();
  559. NET_ESTREAM_Fini();
  560. NET_EALARM_Fini();
  561. exit(1);
  562. }
  563. // qDebug()<<"start core";
  564. }
  565. void CoreObject::process_stop()
  566. {
  567. QProcess *p = (QProcess *)sender();
  568. for(int i=0;i<DEVICES_COUNT;i++){
  569. if(p==processList.at(i)){
  570. if(ytShm->eHomeDevice[i].Connected==0x01){
  571. ytShm->eHomeDevice[i].io[0]=0x00;
  572. }
  573. break;
  574. }
  575. }
  576. }
  577. void CoreObject::AlarmReport(QString addr, QString type, QString time, QString companyCode, quint64 insertid)
  578. {
  579. // if(type.toInt()==200104)
  580. // type="占道侦测报警";
  581. // else if(type.toInt()==200001)
  582. // type="火点侦测报警";
  583. // QString rep2 = QString("{\"SubType\":16,\"DeviceId\":\"%1\",\"InsertId\":%2,\"Confirmed\":0,\"CompanyCode\":\"%3\",\"evt_name\":\"%4\",\"evt\":0,\"alarm_time\":\"%5\"}")
  584. // .arg(addr).arg(insertid).arg(companyCode).arg(type).arg(time);
  585. // printf("%s\n",rep2.toUtf8().data());
  586. // repcur++;
  587. // repcur &= 0x07;
  588. // wssThread[repcur]->appendData(rep2);
  589. }
  590. QString CoreObject::getCompanyCode(QString addr){
  591. for(int i=0;i<DEVICES_COUNT;i++){
  592. QString devid = QString(ytShm->eHomeDevice[i].deviceID);
  593. if(QString::compare(addr,devid)==0){
  594. return QString(ytShm->eHomeDevice[i].rtsppath);
  595. }
  596. }
  597. return "";
  598. }
  599. void CoreObject::clear_devalarm(AlarmEvent devAlarm)
  600. {
  601. for(int i=0;i<DEVICES_COUNT;i++){
  602. if(devAlarm.Device_Code.compare(QString(ytShm->eHomeDevice[i].deviceID))==0){
  603. if(processList.at(i)->pid()>0)
  604. processList.at(i)->close();
  605. ytShm->eHomeDevice[i].io[6]=0x00;
  606. ytShm->eHomeDevice[i].io[0]=0x00;
  607. QString tmpfile = QString(ytShm->eHomeDevice[i].filename);
  608. if(ytShm->eHomeDevice[i].tmpfile!=NULL)
  609. fclose(ytShm->eHomeDevice[i].tmpfile);
  610. ytShm->eHomeDevice[i].savetmp = 0x00;
  611. ytShm->eHomeDevice[i].tmpfile = NULL;
  612. QFile(tmpfile).remove();
  613. ytShm->eHomeDevice[i].transed = 0x00;
  614. sprintf(ytShm->eHomeDevice[i].filename,"");
  615. if(ytShm->eHomeDevice[i].io[8]==0x02){
  616. reportList.append(Alarm_Report(devAlarm.Device_Code,devAlarm.Event_Time,QString::fromUtf8("200104"),
  617. QString::fromUtf8("insert into sp_video2017 (id,port,device_code,time,status,address,ncmd,data1,data2,data3,data4,data5,clsj,clr,clnr,clwb,cllxr,cldh,clzt,cllx,video) values (NULL,'%1','%2','%3','%4','','%5','%6','%7','%8','消防占道告警','','1970-01-01 08:00:00','','','','','',0,'','')")
  618. .arg(2).arg(devAlarm.Device_Code).arg(devAlarm.Event_Time).arg(1)
  619. .arg(104).arg(devAlarm.Event_Status).arg("").arg("")));
  620. }else if(ytShm->eHomeDevice[i].io[8]==0x04){
  621. reportList.append(Alarm_Report(devAlarm.Device_Code,devAlarm.Event_Time,QString::fromUtf8("200105"),
  622. QString::fromUtf8("insert into sp_video2017 (id,port,device_code,time,status,address,ncmd,data1,data2,data3,data4,data5,clsj,clr,clnr,clwb,cllxr,cldh,clzt,cllx,video) values (NULL,'%1','%2','%3','%4','','%5','%6','%7','%8','电动车禁入/区域入侵告警','','1970-01-01 08:00:00','','','','','',0,'','')")
  623. .arg(2).arg(devAlarm.Device_Code).arg(devAlarm.Event_Time).arg(1)
  624. .arg(106).arg(devAlarm.Event_Status).arg("").arg("")));
  625. }
  626. break;
  627. }
  628. }
  629. for(int i=0;i<alarmList.length();i++){
  630. if(alarmList.at(i).Device_Code.compare(devAlarm.Device_Code)==0){
  631. alarmList.removeAt(i);
  632. // break;
  633. }
  634. }
  635. }
  636. void CoreObject::time_out()
  637. {
  638. uint ChkTime = 0;
  639. QDateTime t = QDateTime::currentDateTime();
  640. ytShm->workingTime[0] = t.toTime_t();
  641. if(!had_reg){
  642. if((ytShm->workingTime[0]-start_time)>30)
  643. exit(1);
  644. }
  645. if(isWorking)
  646. return;
  647. isWorking = true;
  648. if(synchour!=t.time().hour())
  649. chkPhoneList();
  650. t = QDateTime::currentDateTime();
  651. ytShm->workingTime[0] = t.toTime_t();
  652. for(int i=0;i<DEVICES_COUNT;i++){
  653. if(ytShm->eHomeDevice[i].Inited==0x01){
  654. t = QDateTime::currentDateTime();
  655. ytShm->workingTime[0] = t.toTime_t();
  656. if(ytShm->eHomeDevice[i].Connected==0x00){
  657. if(ytShm->eHomeDevice[i].io[8]==0x01)
  658. ytShm->eHomeDevice[i].io[0] = 0x01;
  659. else if(ytShm->eHomeDevice[i].io[7]==0x01){
  660. if((ytShm->eHomeDevice[i].time[1]>0)&&((t.toTime_t()-ytShm->eHomeDevice[i].time[1])>300)){
  661. // printf("%s time over close\n",ytShm->eHomeDevice[i].deviceID);
  662. ytShm->eHomeDevice[i].io[0] = 0x00;
  663. ytShm->eHomeDevice[i].io[7] = 0x00;
  664. ytShm->eHomeDevice[i].time[1]=0;
  665. }else if(ytShm->eHomeDevice[i].io[0]==0x00){
  666. // printf("%s io7 on\n",ytShm->eHomeDevice[i].deviceID);
  667. // ytShm->eHomeDevice[i].io[7] = 0x00;
  668. ytShm->eHomeDevice[i].io[0] = 0x01;
  669. }else if(ytShm->eHomeDevice[i].io[0]==0x01){
  670. if(ytShm->eHomeDevice[i].io[15]>2){
  671. // printf("%s NET_ECMS_StopGetRealStream\n",ytShm->eHomeDevice[i].deviceID);
  672. if(NET_ECMS_StopGetRealStream(ytShm->eHomeDevice[i].LoginId,ytShm->eHomeDevice[i].SessionId)){
  673. // ytShm->eHomeDevice[i].io[0] = 0x00;
  674. // ytShm->eHomeDevice[i].io[7] = 0x00;
  675. }
  676. ytShm->eHomeDevice[i].time[1]=0;
  677. ytShm->eHomeDevice[i].SessionId=-1;
  678. }
  679. }
  680. }else if(ytShm->eHomeDevice[i].io[6]==0x01){
  681. // printf("%s io6 on\n",ytShm->eHomeDevice[i].deviceID);
  682. ytShm->eHomeDevice[i].io[0] = 0x01;
  683. }
  684. if(ytShm->eHomeDevice[i].io[0]==0x01){
  685. if(ytShm->eHomeDevice[i].SessionId>-1){
  686. NET_EHOME_PUSHSTREAM_IN struPushStreamIn = {0};
  687. struPushStreamIn.dwSize = sizeof(struPushStreamIn);
  688. struPushStreamIn.lSessionID = ytShm->eHomeDevice[i].SessionId; //SessionID,预览请求会话ID
  689. //预览请求推流输出参数
  690. NET_EHOME_PUSHSTREAM_OUT struPushStreamOut = {0};
  691. if(!NET_ECMS_StartPushRealStream(ytShm->eHomeDevice[i].LoginId, &struPushStreamIn, &struPushStreamOut)){
  692. // printf("%s NET_ECMS_StartGetRealStreamV11 failed.\n",ytShm->eHomeDevice[i].deviceID);
  693. ytShm->eHomeDevice[i].io[15]++;
  694. }else{
  695. // printf("%s start push real stream\n",ytShm->eHomeDevice[i].deviceID);
  696. ytShm->eHomeDevice[i].io[15]=0x00;
  697. }
  698. }
  699. else
  700. {
  701. ytShm->eHomeDevice[i].previewport = 58000+i;
  702. // printf("actice %s at %d(loginId:%d)\n",ytShm->eHomeDevice[i].deviceID,ytShm->eHomeDevice[i].previewport,ytShm->eHomeDevice[i].LoginId);
  703. NET_EHOME_PREVIEWINFO_IN_V11 struPreviewIn = {0};
  704. struPreviewIn.iChannel = 1; //通道号
  705. struPreviewIn.dwLinkMode = 0; //0- TCP方式,1- UDP方式
  706. struPreviewIn.dwStreamType = 1; //码流类型:0- 主码流,1- 子码流, 2- 第三码流
  707. memcpy(struPreviewIn.struStreamSever.szIP, oServerIP, sizeof(oServerIP));//流媒体服务器IP地址
  708. struPreviewIn.struStreamSever.wPort = ytShm->eHomeDevice[i].previewport;
  709. //预览请求输出参数
  710. NET_EHOME_PREVIEWINFO_OUT struPreviewOut = {0};
  711. if(!NET_ECMS_StartGetRealStreamV11(ytShm->eHomeDevice[i].LoginId, &struPreviewIn, &struPreviewOut)){
  712. // printf("%s NET_ECMS_StartGetRealStreamV11 failed.\n",ytShm->eHomeDevice[i].deviceID);
  713. }else{
  714. // printf("active %s lSessionID:%d\n",ytShm->eHomeDevice[i].deviceID,struPreviewOut.lSessionID);
  715. ytShm->eHomeDevice[i].SessionId = struPreviewOut.lSessionID;
  716. NET_EHOME_PUSHSTREAM_IN struPushStreamIn = {0};
  717. struPushStreamIn.dwSize = sizeof(struPushStreamIn);
  718. struPushStreamIn.lSessionID = struPreviewOut.lSessionID; //SessionID,预览请求会话ID
  719. //预览请求推流输出参数
  720. NET_EHOME_PUSHSTREAM_OUT struPushStreamOut = {0};
  721. if(!NET_ECMS_StartPushRealStream(ytShm->eHomeDevice[i].LoginId, &struPushStreamIn, &struPushStreamOut)){
  722. // printf("%s NET_ECMS_StartGetRealStreamV11 failed.\n",ytShm->eHomeDevice[i].deviceID);
  723. ytShm->eHomeDevice[i].io[15]++;
  724. }else{
  725. // printf("%s start push real stream\n",ytShm->eHomeDevice[i].deviceID);
  726. ytShm->eHomeDevice[i].io[15]=0x00;
  727. }
  728. }
  729. }
  730. }
  731. }else if((ytShm->eHomeDevice[i].time[1]>0)&&((t.toTime_t()-ytShm->eHomeDevice[i].time[1])>300)){
  732. if((ytShm->eHomeDevice[i].io[7]==0x01)||(ytShm->eHomeDevice[i].io[8]==0x01)){
  733. if(NET_ECMS_StopGetRealStream(ytShm->eHomeDevice[i].LoginId,ytShm->eHomeDevice[i].SessionId)){
  734. ytShm->eHomeDevice[i].io[0] = 0x00;
  735. ytShm->eHomeDevice[i].io[7] = 0x00;
  736. ytShm->eHomeDevice[i].time[1]=0;
  737. ytShm->eHomeDevice[i].SessionId =-1;
  738. }
  739. }
  740. }else if((ytShm->eHomeDevice[i].Connected==0x01)&&(ytShm->eHomeDevice[i].io[0]==0x00)){
  741. if(NET_ECMS_StopGetRealStream(ytShm->eHomeDevice[i].LoginId,ytShm->eHomeDevice[i].SessionId)){
  742. ytShm->eHomeDevice[i].Connected=0x00;
  743. ytShm->eHomeDevice[i].SessionId=-1;
  744. ytShm->eHomeDevice[i].time[0]=0;
  745. ytShm->eHomeDevice[i].time[1]=0;
  746. if(processList.at(i)->pid()>0){
  747. processList.at(i)->close();
  748. }
  749. // qDebug()<<QString("%1 will close.(%2)").arg(ytShm->eHomeDevice[i].deviceID).arg(i).toUtf8().data();
  750. QString tmpfile = QString(ytShm->eHomeDevice[i].filename).replace(" ","_");
  751. if(ytShm->eHomeDevice[i].tmpfile!=NULL)
  752. fclose(ytShm->eHomeDevice[i].tmpfile);
  753. ytShm->eHomeDevice[i].savetmp = 0x00;
  754. ytShm->eHomeDevice[i].tmpfile = NULL;
  755. QFile(tmpfile).remove();
  756. if(ytShm->eHomeDevice[i].io[8]==0x01){
  757. tmpfile = QString("/tmp/%1.mp4").arg(ytShm->eHomeDevice[i].deviceID);
  758. sprintf(ytShm->eHomeDevice[i].filename,"%s",tmpfile.toUtf8().data());
  759. ytShm->eHomeDevice[i].tmpfile = fopen(tmpfile.toUtf8().data(),"wb");
  760. setFullTime(&(ytShm->eHomeDevice[i].onLinetime),t);
  761. sprintf(ytShm->eHomeDevice[i].filename,"");
  762. }
  763. ytShm->eHomeDevice[i].transed = 0x00;
  764. }
  765. }else if((ytShm->eHomeDevice[i].savetmp==0x01)&&(ytShm->eHomeDevice[i].transed==0x00)&&(ytShm->eHomeDevice[i].onLinetime.TIMESTAMP>0)&&((t.toTime_t()-ytShm->eHomeDevice[i].onLinetime.TIMESTAMP)>3)){
  766. if(ytShm->eHomeDevice[i].io[6]==0x01){
  767. ytShm->eHomeDevice[i].io[6]=0x00;
  768. ytShm->eHomeDevice[i].io[0]=0x00;
  769. for(int j=0;j<alarmList.length();j++){
  770. if(alarmList.at(j).Device_Code.compare(QString(ytShm->eHomeDevice[i].deviceID))==0){
  771. QString tmpfile = QString(ytShm->eHomeDevice[i].filename).replace(" ","_");
  772. QString pic1name = QString("http://47.103.74.123/VideoAlarmPics/pic_%1_%2_0.jpg").arg(QDateTime::fromString(alarmList.at(j).Event_Time,"yyyy-MM-dd HH:mm:ss").toTime_t()).arg(QString(alarmList.at(j).Device_Code).replace(" ","_"));
  773. QString picname = QString("/usr/local/nginx/html/VideoAlarmPics/pic_%1_%2_0.jpg").arg(QDateTime::fromString(alarmList.at(j).Event_Time,"yyyy-MM-dd HH:mm:ss").toTime_t()).arg(QString(alarmList.at(j).Device_Code).replace(" ","_"));
  774. QString cmd1 = QString("ffmpeg -ss 00:00:00 -i \"%1\" -f image2 -y \"%2\"").arg(tmpfile).arg(picname);
  775. if(ytShm->eHomeDevice[i].io[8]==0x02){
  776. reportList.append(Alarm_Report(alarmList.at(j).Device_Code,alarmList.at(j).Event_Time,QString::fromUtf8("200104"),
  777. QString::fromUtf8("insert into sp_video2017 (id,port,device_code,time,status,address,ncmd,data1,data2,data3,data4,data5,clsj,clr,clnr,clwb,cllxr,cldh,clzt,cllx,video) values (NULL,'%1','%2','%3','%4','','%5','%6','%7','%8','消防占道告警','','1970-01-01 08:00:00','','','','','',0,'','')")
  778. .arg(2).arg(alarmList.at(j).Device_Code).arg(alarmList.at(j).Event_Time).arg(1)
  779. .arg(104).arg(alarmList.at(j).Event_Status).arg(pic1name).arg("")));
  780. }else if(ytShm->eHomeDevice[i].io[8]==0x04){
  781. reportList.append(Alarm_Report(alarmList.at(j).Device_Code,alarmList.at(j).Event_Time,QString::fromUtf8("200105"),
  782. QString::fromUtf8("insert into sp_video2017 (id,port,device_code,time,status,address,ncmd,data1,data2,data3,data4,data5,clsj,clr,clnr,clwb,cllxr,cldh,clzt,cllx,video) values (NULL,'%1','%2','%3','%4','','%5','%6','%7','%8','电动车禁入/区域入侵告警','','1970-01-01 08:00:00','','','','','',0,'','')")
  783. .arg(2).arg(alarmList.at(j).Device_Code).arg(alarmList.at(j).Event_Time).arg(1)
  784. .arg(106).arg(alarmList.at(j).Event_Status).arg(pic1name).arg("")));
  785. }
  786. if(processList.at(i)->pid()>0)
  787. processList.at(i)->close();
  788. processList.at(i)->start(cmd1);
  789. alarmList.removeAt(j);
  790. break;
  791. }
  792. }
  793. }else{
  794. setFullTime(&(ytShm->eHomeDevice[i].transtime),t);
  795. QString tmpfile = QString(ytShm->eHomeDevice[i].filename).replace(" ","_");
  796. ytShm->eHomeDevice[i].transed = 0x01;
  797. sprintf(ytShm->eHomeDevice[i].filename,"%s",tmpfile.toUtf8().data());
  798. system(QString("rm -f /usr/local/nginx/html/hls/%1*").arg(ytShm->eHomeDevice[i].deviceID).toUtf8().data());
  799. QString cmd1 = QString("ffmpeg -re -i \"%1\" -c:v libx264 -an -strict -2 -s 352x278 -g 15 -f flv -v quiet \"rtmp://%2/hls/%3\" -c:v libx264 -an -strict -2 -s 352x278 -g 15 -f flv -v quiet \"rtmp://%4/live/%5\" ").arg(tmpfile).arg(iServerIP).arg(ytShm->eHomeDevice[i].deviceID).arg(iServerIP).arg(ytShm->eHomeDevice[i].deviceID);
  800. if(processList.at(i)->pid()>0)
  801. processList.at(i)->close();
  802. processList.at(i)->start(cmd1);
  803. ytShm->eHomeDevice[i].time[1] = t.toTime_t();
  804. }
  805. }else if((ytShm->eHomeDevice[i].transed==0x01)&&(ytShm->eHomeDevice[i].time[1]>0)&&((t.toTime_t()-ytShm->eHomeDevice[i].time[1])>600)){
  806. if(NET_ECMS_StopGetRealStream(ytShm->eHomeDevice[i].LoginId,ytShm->eHomeDevice[i].SessionId)){
  807. ytShm->eHomeDevice[i].Connected=0x00;
  808. ytShm->eHomeDevice[i].SessionId=-1;
  809. ytShm->eHomeDevice[i].time[0]=0;
  810. ytShm->eHomeDevice[i].time[1]=0;
  811. // qDebug()<<QString("%1 will close.(%2)").arg(ytShm->eHomeDevice[i].deviceID).arg(i).toUtf8().data();
  812. processList.at(i)->close();
  813. QString tmpfile = QString(ytShm->eHomeDevice[i].filename);
  814. if(ytShm->eHomeDevice[i].tmpfile!=NULL)
  815. fclose(ytShm->eHomeDevice[i].tmpfile);
  816. ytShm->eHomeDevice[i].savetmp = 0x00;
  817. ytShm->eHomeDevice[i].tmpfile = NULL;
  818. QFile(tmpfile).remove();
  819. ytShm->eHomeDevice[i].transed = 0x00;
  820. }
  821. }
  822. }
  823. }
  824. if(reportList.length()>0){
  825. if(db.open()){
  826. while (reportList.length()>0) {
  827. t = QDateTime::currentDateTime();
  828. ytShm->workingTime[0] = t.toTime_t();
  829. QString phonelist = "";
  830. Alarm_Report rep = reportList.first();
  831. appendLog(QString("[ %1 sql(%2) ] %3").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(alarmList.length()).arg(rep.Sql));
  832. QSqlQuery qry = db.exec(rep.Sql);
  833. quint64 insertId = qry.lastInsertId().toULongLong();
  834. QString type="";
  835. QString companyCode = getCompanyCode(rep.Device_Code);
  836. if(rep.Event_Name.toInt()==200104)
  837. type=QString::fromUtf8("占道侦测报警");
  838. else if(rep.Event_Name.toInt()==200001)
  839. type=QString::fromUtf8("火点侦测报警");
  840. else if(rep.Event_Name.toInt()==200105)
  841. type=QString::fromUtf8("电动车禁入/区域入侵告警");
  842. // printf("device code:%s\nget company code:%s\n",rep.Device_Code.toUtf8().data(),companyCode.toUtf8().data());
  843. if(companyCode.length()>0){
  844. QString rep1 = QString("{\"SubType\":16,\"DeviceId\":\"%1\",\"InsertId\":%2,\"Confirmed\":false}").arg(rep.Device_Code).arg(insertId);
  845. spThread[repcur]->appendData(rep1);
  846. QString rep2 = QString("{\"SubType\":16,\"DeviceId\":\"%1\",\"InsertId\":%2,\"Confirmed\":0,\"CompanyCode\":\"%3\",\"evt_name\":\"%4\",\"evt\":0,\"alarm_time\":\"%5\"}")
  847. .arg(rep.Device_Code).arg(insertId).arg(companyCode).arg(type).arg(rep.Event_Time);
  848. // printf("%s\n",rep2.toUtf8().data());
  849. wssThread[repcur]->appendData(rep2);
  850. for(int i=0;i<companyphoneList.length();i++){
  851. if(QString::compare(companyphoneList.at(i).CompanyCode,companyCode)==0){
  852. if(phonelist.length()==0)
  853. phonelist = companyphoneList.at(i).Phone;
  854. else
  855. phonelist.append(","+companyphoneList.at(i).Phone);
  856. }
  857. }
  858. repcur++;
  859. repcur &= 0x07;
  860. if(phonelist.length()>0){
  861. QString data = QString("evt_name=%1&device_code=%2&phone=%3&insert_id=%4&time=%5&bz=%1").arg(type).arg(rep.Device_Code).arg(phonelist).arg(insertId).arg(rep.Event_Time)
  862. .replace(",","%2C").replace(":","%3A").replace(" ","+");
  863. wxThreads[wxcur]->appendData(data);
  864. wxcur++;
  865. wxcur &= 0x07;
  866. }
  867. }
  868. reportList.removeFirst();
  869. }
  870. db.close();
  871. }
  872. }
  873. if(sqlList.length()>0){
  874. if(db.open()){
  875. while(sqlList.length()>0){
  876. db.exec(sqlList.first());
  877. appendLog(QString("[ %1 sql ] %2").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(sqlList.first()));
  878. sqlList.removeFirst();
  879. }
  880. db.close();
  881. }
  882. }
  883. int a_count=0;
  884. t = QDateTime::currentDateTime();
  885. if((t.toTime_t()-ChkTime)>60)
  886. {
  887. ChkTime = t.toTime_t();
  888. QListIterator<AlarmEvent> AlaList(alarmList);
  889. while(AlaList.hasNext()){
  890. AlarmEvent ae = AlaList.next();
  891. if((t.toTime_t()-ae.t_stamp)>120){
  892. nopic_count++;
  893. a_count++;
  894. appendLog(QString("[ %1 out(%2:%3) ] %4 %5").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(alarmList.length()).arg(a_count).arg(ae.Device_Code).arg(ae.Event_Time));
  895. clear_devalarm(ae);
  896. if(nopic_count>5)
  897. exit(1);
  898. }
  899. }
  900. }
  901. isWorking = false;
  902. }