coreobject.cpp 48 KB

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