coreobject.cpp 59 KB

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