James 4 years ago
parent
commit
af14b30842
7 changed files with 268 additions and 36 deletions
  1. 2 0
      CamCore/CamCore.pro
  2. 31 11
      CamCore/Makefile
  3. 191 19
      CamCore/coreobject.cpp
  4. 6 1
      CamCore/coreobject.h
  5. 17 4
      CamDog/dogobject.cpp
  6. 3 1
      CamDog/dogobject.h
  7. 18 0
      include/YT_EHOME_shm.h

+ 2 - 0
CamCore/CamCore.pro

@@ -30,5 +30,7 @@ HEADERS += \
 
 
 INCLUDEPATH += ../hc/incCn
+INCLUDEPATH += ../qmqtt-master/src/mqtt
 
 LIBS +=  -L../hc/lib -lHCEHomeCMS -lHCEHomeAlarm -lHCEHomeStream -lHCNetUtils -lHCEHomeSS -lhpr -lcrypto -lssl -lsqlite3 -liconv2 -lSystemTransform
+LIBS += -lQt5Qmqtt

+ 31 - 11
CamCore/Makefile

@@ -53,16 +53,20 @@ OBJECTS_DIR   = ./
 SOURCES       = main.cpp \
 		coreobject.cpp \
 		ttsthreads.cpp \
-		wechartthreads.cpp moc_coreobject.cpp \
+		wechartthreads.cpp \
+		logthread.cpp moc_coreobject.cpp \
 		moc_ttsthreads.cpp \
-		moc_wechartthreads.cpp
+		moc_wechartthreads.cpp \
+		moc_logthread.cpp
 OBJECTS       = main.o \
 		coreobject.o \
 		ttsthreads.o \
 		wechartthreads.o \
+		logthread.o \
 		moc_coreobject.o \
 		moc_ttsthreads.o \
-		moc_wechartthreads.o
+		moc_wechartthreads.o \
+		moc_logthread.o
 DIST          = /usr/lib64/qt5/mkspecs/features/spec_pre.prf \
 		/usr/lib64/qt5/mkspecs/common/unix.conf \
 		/usr/lib64/qt5/mkspecs/common/linux.conf \
@@ -222,10 +226,12 @@ DIST          = /usr/lib64/qt5/mkspecs/features/spec_pre.prf \
 		/usr/lib64/qt5/mkspecs/features/lex.prf \
 		CamCore.pro coreobject.h \
 		ttsthreads.h \
-		wechartthreads.h main.cpp \
+		wechartthreads.h \
+		logthread.h main.cpp \
 		coreobject.cpp \
 		ttsthreads.cpp \
-		wechartthreads.cpp
+		wechartthreads.cpp \
+		logthread.cpp
 QMAKE_TARGET  = ytCamCore
 DESTDIR       = 
 TARGET        = ytCamCore
@@ -577,8 +583,8 @@ distdir: FORCE
 	@test -d $(DISTDIR) || mkdir -p $(DISTDIR)
 	$(COPY_FILE) --parents $(DIST) $(DISTDIR)/
 	$(COPY_FILE) --parents /usr/lib64/qt5/mkspecs/features/data/dummy.cpp $(DISTDIR)/
-	$(COPY_FILE) --parents coreobject.h ttsthreads.h wechartthreads.h $(DISTDIR)/
-	$(COPY_FILE) --parents main.cpp coreobject.cpp ttsthreads.cpp wechartthreads.cpp $(DISTDIR)/
+	$(COPY_FILE) --parents coreobject.h ttsthreads.h wechartthreads.h logthread.h $(DISTDIR)/
+	$(COPY_FILE) --parents main.cpp coreobject.cpp ttsthreads.cpp wechartthreads.cpp logthread.cpp $(DISTDIR)/
 
 
 clean: compiler_clean 
@@ -610,9 +616,9 @@ compiler_moc_predefs_clean:
 moc_predefs.h: /usr/lib64/qt5/mkspecs/features/data/dummy.cpp
 	g++ -pipe -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -O2 -std=gnu++11 -Wall -W -dM -E -o moc_predefs.h /usr/lib64/qt5/mkspecs/features/data/dummy.cpp
 
-compiler_moc_header_make_all: moc_coreobject.cpp moc_ttsthreads.cpp moc_wechartthreads.cpp
+compiler_moc_header_make_all: moc_coreobject.cpp moc_ttsthreads.cpp moc_wechartthreads.cpp moc_logthread.cpp
 compiler_moc_header_clean:
-	-$(DEL_FILE) moc_coreobject.cpp moc_ttsthreads.cpp moc_wechartthreads.cpp
+	-$(DEL_FILE) moc_coreobject.cpp moc_ttsthreads.cpp moc_wechartthreads.cpp moc_logthread.cpp
 moc_coreobject.cpp: ../hc/incCn/HCEHomeCMS.h \
 		../hc/incCn/HCEHomePublic.h \
 		../hc/incCn/HCEHomeAlarm.h \
@@ -620,6 +626,7 @@ moc_coreobject.cpp: ../hc/incCn/HCEHomeCMS.h \
 		../include/YT_EHOME_shm.h \
 		ttsthreads.h \
 		wechartthreads.h \
+		logthread.h \
 		coreobject.h \
 		moc_predefs.h \
 		/usr/lib64/qt5/bin/moc
@@ -635,6 +642,11 @@ moc_wechartthreads.cpp: wechartthreads.h \
 		/usr/lib64/qt5/bin/moc
 	/usr/lib64/qt5/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib64/qt5/mkspecs/linux-g++ -I/home/yt/Qt/YtCam.20201222/YtCam/CamCore -I/home/yt/Qt/YtCam.20201222/YtCam/hc/incCn -I/usr/include/qt5 -I/usr/include/qt5/QtXml -I/usr/include/qt5/QtSql -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/4.8.5 -I/usr/include/c++/4.8.5/x86_64-redhat-linux -I/usr/include/c++/4.8.5/backward -I/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include -I/usr/local/include -I/usr/include wechartthreads.h -o moc_wechartthreads.cpp
 
+moc_logthread.cpp: logthread.h \
+		moc_predefs.h \
+		/usr/lib64/qt5/bin/moc
+	/usr/lib64/qt5/bin/moc $(DEFINES) --include ./moc_predefs.h -I/usr/lib64/qt5/mkspecs/linux-g++ -I/home/yt/Qt/YtCam.20201222/YtCam/CamCore -I/home/yt/Qt/YtCam.20201222/YtCam/hc/incCn -I/usr/include/qt5 -I/usr/include/qt5/QtXml -I/usr/include/qt5/QtSql -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I/usr/include/c++/4.8.5 -I/usr/include/c++/4.8.5/x86_64-redhat-linux -I/usr/include/c++/4.8.5/backward -I/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include -I/usr/local/include -I/usr/include logthread.h -o moc_logthread.cpp
+
 compiler_moc_source_make_all:
 compiler_moc_source_clean:
 compiler_yacc_decl_make_all:
@@ -654,7 +666,8 @@ main.o: main.cpp coreobject.h \
 		../hc/incCn/HCEHomeStream.h \
 		../include/YT_EHOME_shm.h \
 		ttsthreads.h \
-		wechartthreads.h
+		wechartthreads.h \
+		logthread.h
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
 
 coreobject.o: coreobject.cpp coreobject.h \
@@ -664,7 +677,8 @@ coreobject.o: coreobject.cpp coreobject.h \
 		../hc/incCn/HCEHomeStream.h \
 		../include/YT_EHOME_shm.h \
 		ttsthreads.h \
-		wechartthreads.h
+		wechartthreads.h \
+		logthread.h
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o coreobject.o coreobject.cpp
 
 ttsthreads.o: ttsthreads.cpp ttsthreads.h
@@ -673,6 +687,9 @@ ttsthreads.o: ttsthreads.cpp ttsthreads.h
 wechartthreads.o: wechartthreads.cpp wechartthreads.h
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o wechartthreads.o wechartthreads.cpp
 
+logthread.o: logthread.cpp logthread.h
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o logthread.o logthread.cpp
+
 moc_coreobject.o: moc_coreobject.cpp 
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_coreobject.o moc_coreobject.cpp
 
@@ -682,6 +699,9 @@ moc_ttsthreads.o: moc_ttsthreads.cpp
 moc_wechartthreads.o: moc_wechartthreads.cpp 
 	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_wechartthreads.o moc_wechartthreads.cpp
 
+moc_logthread.o: moc_logthread.cpp 
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_logthread.o moc_logthread.cpp
+
 ####### Install
 
 install:  FORCE

+ 191 - 19
CamCore/coreobject.cpp

@@ -1,4 +1,5 @@
 #include "coreobject.h"
+#include <unistd.h>
 
 #define iServerIP "172.19.198.166"
 #define oServerIP "47.103.74.123"
@@ -23,10 +24,13 @@ bool had_reg;
 int nopic_count;
 
 MyEHomeShm *ytShm;
+MyEHomeMQShm *ytMqShm;
 
 CoreObject::CoreObject(QObject *parent) :
     QObject(parent)
 {
+    infomqttIdx=1;
+    alarmmqttIdx=1;
     nopic_count = 0;
     processList.clear();
     sqlList.clear();
@@ -42,6 +46,23 @@ CoreObject::CoreObject(QObject *parent) :
     db.setHostName("47.98.201.187");
     db.setUserName("root");
     db.setPassword("Yt2018IoT");
+
+    QString ip="",port="",name="",passwd="";
+    db.open();
+    QSqlQuery mqttqry = db.exec("select ip, port, username, passwd from yt_dataprocessservice_mqtt where type = 'YtCam';");
+    while(mqttqry.next()){
+        ip = mqttqry.value(0).toString();
+        port = mqttqry.value(1).toString();
+        name = mqttqry.value(2).toString();
+        passwd = mqttqry.value(3).toString();
+    }
+    db.close();
+    m_client = new QMQTT::Client(QHostAddress(ip),static_cast<quint16>(port.toInt()),this);
+    m_client->setUsername(name);
+    m_client->setPassword(passwd.toLatin1());
+    connect(m_client,&QMQTT::Client::connected,this,&CoreObject::mqconnected);
+    m_client->connectToHost();
+
     NET_ESTREAM_Init();
     NET_EALARM_Init();
     NET_ECMS_Init();
@@ -111,6 +132,11 @@ CoreObject::~CoreObject()
     NET_EALARM_Fini();
 }
 
+void CoreObject::mqconnected()
+{
+    printf("mqtt connected\n");
+}
+
 void CoreObject::chkPhoneList()
 {
     if(db.open()){
@@ -147,7 +173,14 @@ bool CoreObject::shm_load()
         return false;
     if((shmid = shmget(key,sizeof(MyEHomeShm),IPC_CREAT|0666))==-1)
         return false;
+
     ytShm = (MyEHomeShm *)shmat(shmid,NULL,0);
+
+    if((key = ftok(SHM_PATH,(int)(SHM_PORT+10)))==-1)
+        return false;
+    if((shmid = shmget(key,sizeof(MyEHomeMQShm),IPC_CREAT|0666))==-1)
+        return false;
+    ytMqShm = (MyEHomeMQShm *)shmat(shmid,NULL,0);
     return true;
 }
 
@@ -341,9 +374,31 @@ void ProcessHttpAlarmInfo(void *pXml, unsigned long dwLen, void *pUrl, unsigned
     LPNET_EHOME_ALARM_ISAPI_INFO pISAPIAlarm = (NET_EHOME_ALARM_ISAPI_INFO *)(pXml);
     NET_EHOME_ALARM_ISAPI_INFO struISAPIAlarm = {0};
     memcpy(&struISAPIAlarm,pISAPIAlarm, sizeof(NET_EHOME_ALARM_ISAPI_INFO));
+    obj->appendLog(QString("{ligangceshi5:%1}")
+                   .arg(struISAPIAlarm.pAlarmData));
     if(struISAPIAlarm.pAlarmData)
     {
-         if(struISAPIAlarm.byDataType==2){
+        if(struISAPIAlarm.byDataType==2){
+            QByteArray data = QByteArray((const   char *)(struISAPIAlarm.pAlarmData));
+            QXmlStreamReader reader;
+            int cur = data.indexOf("--boundary");
+            reader.addData(data.mid(0,cur));
+            while(!reader.atEnd()){
+                if(reader.isStartElement()){
+                    if(reader.name()=="eventType"){
+                        sprintf(eventType,"%s",reader.readElementText().toUtf8().data());
+                    }else if(reader.name()=="deviceID"){
+                        sprintf(deviceID,"%s",reader.readElementText().toUtf8().data());
+                    }else if(reader.name()=="dateTime"){
+                        sprintf(eventTime,"%s",reader.readElementText().replace("T"," ").mid(0,19).toUtf8().data());
+                    }else if(reader.name()=="eventState"){
+                        sprintf(eventState,"%s",reader.readElementText().toUtf8().data());
+                    }
+                }
+                reader.readNext();
+            }
+            obj->appendLog(QString("{ligangceshi3:%1}")
+                           .arg(deviceID));
         }else if(struISAPIAlarm.byDataType==1){
             QByteArray data = QByteArray((const   char *)(struISAPIAlarm.pAlarmData));
             int cur = data.indexOf("--boundary");
@@ -364,6 +419,8 @@ void ProcessHttpAlarmInfo(void *pXml, unsigned long dwLen, void *pUrl, unsigned
                     }
                     reader.readNext();
                 }
+                obj->appendLog(QString("{ligangceshi4:%1}")
+                               .arg(deviceID));
             }
         }
          if(obj->checkAlarmDevTime(deviceID)){
@@ -383,6 +440,14 @@ void ProcessHttpAlarmInfo(void *pXml, unsigned long dwLen, void *pUrl, unsigned
                                                 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,'','')")
                                 .arg(2).arg(deviceID).arg(eventTime).arg(1)
                                 .arg(2).arg(eventState).arg(pic[0]).arg(pic[1])));
+            for(int k=0;k<DEVICES_COUNT;k++){
+                QString devid = QString(ytShm->eHomeDevice[k].deviceID);
+                if(QString::compare(deviceID,devid)==0){
+                    sprintf(ytShm->eHomeDeviceFtp[k].filePath,"%s",pic[0]);
+                    break;
+                }
+            }
+
          }
     }
 }
@@ -400,6 +465,9 @@ BOOL CALLBACK AlarmMSGCallBack(LONG lHandle, NET_EHOME_ALARM_MSG *pAlarmMsg, voi
     switch(dwType)
     {
     case EHOME_ALARM_UNKNOWN://未知报警信息
+        NET_EHOME_ALARM_INFO struAlarmInfo;
+        obj->appendLog(QString("{ligangceshi1:%1,%2,%3}")
+                       .arg(dt.toString("yyyy-MM-dd HH:mm:ss")).arg(struAlarmInfo.dwAlarmType).arg(struAlarmInfo.szDeviceID));
         break;
     case EHOME_ALARM://基本报警信息:移动侦测、视频遮盖、视频丢失、PIR报警、人脸侦测、区域入侵等
     {
@@ -414,7 +482,7 @@ BOOL CALLBACK AlarmMSGCallBack(LONG lHandle, NET_EHOME_ALARM_MSG *pAlarmMsg, voi
                                .arg(struAlarmInfo.szDeviceID).arg(struAlarmInfo.szAlarmTime).arg(struAlarmInfo.dwAlarmType).arg(struAlarmInfo.dwAlarmAction).arg(struAlarmInfo.dwVideoChannel));
                 for(idx=0;idx<DEVICES_COUNT;idx++){
                     if((strcmp(ytShm->eHomeDevice[idx].deviceID,(char*)(struAlarmInfo.szDeviceID))==0)
-                            &&((ytShm->eHomeDevice[idx].io[8]==0x02)||(ytShm->eHomeDevice[idx].io[8]==0x04))){
+                            &&((ytShm->eHomeDevice[idx].io[8]==0x02)||(ytShm->eHomeDevice[idx].io[8]==0x04)||(ytShm->eHomeDevice[idx].io[8]==0x08)||(ytShm->eHomeDevice[idx].io[8]==0x84))){
                         for(i=0;i>obj->alarmList.length();i++){
                             if(obj->alarmList.at(i).Device_Code.compare(devId)==0){
                                 if((struAlarmInfo.dwAlarmType==ALARM_TYPE_INTRUSION)&&(struAlarmInfo.dwAlarmAction!=0))
@@ -434,6 +502,9 @@ BOOL CALLBACK AlarmMSGCallBack(LONG lHandle, NET_EHOME_ALARM_MSG *pAlarmMsg, voi
                     }
                 }
             }
+        }else{
+            obj->appendLog(QString("{ligangceshi2:%1,%2,%3}")
+                           .arg(dt.toString("yyyy-MM-dd HH:mm:ss")).arg(struAlarmInfo.dwAlarmType).arg(struAlarmInfo.szDeviceID));
         }
     }
         break;
@@ -441,6 +512,9 @@ BOOL CALLBACK AlarmMSGCallBack(LONG lHandle, NET_EHOME_ALARM_MSG *pAlarmMsg, voi
         ProcessHttpAlarmInfo(pAlarmMsg->pAlarmInfo,pAlarmMsg->dwAlarmInfoLen,pAlarmMsg->pHttpUrl,pAlarmMsg->dwHttpUrlLen,pUserData);
         break;
     default:
+        NET_EHOME_ALARM_INFO struAlarmInfo1;
+        obj->appendLog(QString("{ligangceshi:%1,%2,%3}")
+                       .arg(dt.toString("yyyy-MM-dd HH:mm:ss")).arg(struAlarmInfo1.dwAlarmType).arg(struAlarmInfo.szDeviceID));
         break;
     }
 
@@ -633,7 +707,7 @@ QString CoreObject::getCompanyCode(QString addr){
     return "";
 }
 
-void CoreObject::clear_devalarm(AlarmEvent devAlarm)
+void CoreObject::clear_devalarm(AlarmEvent devAlarm,bool isFtp)
 {
     for(int i=0;i<DEVICES_COUNT;i++){
         if(devAlarm.Device_Code.compare(QString(ytShm->eHomeDevice[i].deviceID))==0){
@@ -649,16 +723,30 @@ void CoreObject::clear_devalarm(AlarmEvent devAlarm)
             QFile(tmpfile).remove();
             ytShm->eHomeDevice[i].transed = 0x00;
             sprintf(ytShm->eHomeDevice[i].filename,"");
-            if(ytShm->eHomeDevice[i].io[8]==0x02){
-                reportList.append(Alarm_Report(devAlarm.Device_Code,devAlarm.Event_Time,QString::fromUtf8("200104"),
-                                                    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,'','')")
-                                    .arg(2).arg(devAlarm.Device_Code).arg(devAlarm.Event_Time).arg(1)
-                                    .arg(104).arg(devAlarm.Event_Status).arg("").arg("")));
-            }else if(ytShm->eHomeDevice[i].io[8]==0x04){
-                reportList.append(Alarm_Report(devAlarm.Device_Code,devAlarm.Event_Time,QString::fromUtf8("200105"),
-                                                    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,'','')")
-                                    .arg(2).arg(devAlarm.Device_Code).arg(devAlarm.Event_Time).arg(1)
-                                    .arg(106).arg(devAlarm.Event_Status).arg("").arg("")));
+            if(isFtp){
+                if(ytShm->eHomeDevice[i].io[8]==0x08){
+                    reportList.append(Alarm_Report(devAlarm.Device_Code,devAlarm.Event_Time,QString::fromUtf8("200104"),
+                                                        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,'','')")
+                                        .arg(2).arg(devAlarm.Device_Code).arg(devAlarm.Event_Time).arg(1)
+                                        .arg(104).arg(devAlarm.Event_Status).arg(ytShm->eHomeDeviceFtp[i].filePath).arg("")));
+                }else if(ytShm->eHomeDevice[i].io[8]==0x84){
+                    reportList.append(Alarm_Report(devAlarm.Device_Code,devAlarm.Event_Time,QString::fromUtf8("200105"),
+                                                        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,'','')")
+                                        .arg(2).arg(devAlarm.Device_Code).arg(devAlarm.Event_Time).arg(1)
+                                        .arg(106).arg(devAlarm.Event_Status).arg(ytShm->eHomeDeviceFtp[i].filePath).arg("")));
+                }
+            }else{
+                if(ytShm->eHomeDevice[i].io[8]==0x02||ytShm->eHomeDevice[i].io[8]==0x08){
+                    reportList.append(Alarm_Report(devAlarm.Device_Code,devAlarm.Event_Time,QString::fromUtf8("200104"),
+                                                        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,'','')")
+                                        .arg(2).arg(devAlarm.Device_Code).arg(devAlarm.Event_Time).arg(1)
+                                        .arg(104).arg(devAlarm.Event_Status).arg("").arg("")));
+                }else if(ytShm->eHomeDevice[i].io[8]==0x04||ytShm->eHomeDevice[i].io[8]==0x84){
+                    reportList.append(Alarm_Report(devAlarm.Device_Code,devAlarm.Event_Time,QString::fromUtf8("200105"),
+                                                        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,'','')")
+                                        .arg(2).arg(devAlarm.Device_Code).arg(devAlarm.Event_Time).arg(1)
+                                        .arg(106).arg(devAlarm.Event_Status).arg("").arg("")));
+                }
             }
             break;
         }
@@ -718,6 +806,56 @@ void CoreObject::time_out()
                 }else if(ytShm->eHomeDevice[i].io[6]==0x01){
 //                    printf("%s io6 on\n",ytShm->eHomeDevice[i].deviceID);
                     ytShm->eHomeDevice[i].io[0] = 0x01;
+                    if(ytShm->eHomeDevice[i].io[8]==0x08||ytShm->eHomeDevice[i].io[8]==0x84){
+                        ytShm->eHomeDevice[i].io[0] = 0x00;
+                        QDateTime zeroTime = QDateTime::fromTime_t(0);
+                        uint t1 = QDateTime::currentDateTime().toTime_t();
+                        QDateTime start = QDateTime::currentDateTime();
+                        QDateTime now;
+                        do{
+                            now=QDateTime::currentDateTime();
+                        }while(start.secsTo(now)<=5);
+                        QString filePath = QString("/var/ftp/pub/%1").arg(QString(ytShm->eHomeDevice[i].deviceID));
+                        QDir qd(filePath);
+                        QFileInfo subFileList = qd.entryInfoList(QDir::Files | QDir::CaseSensitive).last();
+                        QString filePath1 = QString("%1/%2").arg(filePath).arg(subFileList.fileName());
+                        QString filePath2 = QString("/usr/local/nginx/html/VideoAlarmPics/%1_%2.jpg").arg(QString(ytShm->eHomeDevice[i].deviceID)).arg(t1);
+                        QFile file2(filePath1);
+                        uint fileTime = subFileList.created().toTime_t();
+                        file2.copy(filePath2);
+                        QFile::remove(filePath1);
+                        QString picturePath = QString("http://47.103.74.123/VideoAlarmPics/%1_%2.jpg").arg(QString(ytShm->eHomeDevice[i].deviceID)).arg(t1);
+                        uint timeDiff = t1-fileTime;
+                        appendLog(QString("{filePath1:%1,%2,%3,%4}").arg(filePath1).arg(timeDiff).arg(t1).arg(fileTime));
+                        if(timeDiff>120){
+                            for(int j=0;j<alarmList.length();j++){
+                                if(alarmList.at(j).Device_Code.compare(ytShm->eHomeDevice[i].deviceID)==0){
+                                    AlarmEvent ftpae = alarmList.at(j);
+                                    clear_devalarm(ftpae,false);
+                                    break;
+                                }
+                            }
+                        }else{
+                            ytShm->eHomeDevice[i].io[0] = 0x00;
+                            if(QString(ytShm->eHomeDeviceFtp[i].deviceID).compare(QString(ytShm->eHomeDevice[i].deviceID))==0){
+                                sprintf(ytShm->eHomeDeviceFtp[i].fileName,"%s",subFileList.fileName().toUtf8().data());
+                                sprintf(ytShm->eHomeDeviceFtp[i].filePath,"%s",picturePath.toUtf8().data());
+                                setFullTime(&(ytShm->eHomeDeviceFtp[i].alarmTime),zeroTime);
+                            }else{
+                                sprintf(ytShm->eHomeDeviceFtp[i].deviceID,"%s",QString(ytShm->eHomeDevice[i].deviceID).toUtf8().data());
+                                sprintf(ytShm->eHomeDeviceFtp[i].fileName,"%s",subFileList.fileName().toUtf8().data());
+                                sprintf(ytShm->eHomeDeviceFtp[i].filePath,"%s",picturePath.toUtf8().data());
+                                setFullTime(&(ytShm->eHomeDeviceFtp[i].alarmTime),zeroTime);
+                            }
+                            for(int j=0;j<alarmList.length();j++){
+                                if(alarmList.at(j).Device_Code.compare(ytShm->eHomeDevice[i].deviceID)==0){
+                                    AlarmEvent ftpae = alarmList.at(j);
+                                    clear_devalarm(ftpae,true);
+                                    break;
+                                }
+                            }
+                        }
+                    }
                 }
                 if(ytShm->eHomeDevice[i].io[0]==0x01){
                     if(ytShm->eHomeDevice[i].SessionId>-1){
@@ -815,11 +953,14 @@ void CoreObject::time_out()
                                                                     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,'','')")
                                                     .arg(2).arg(alarmList.at(j).Device_Code).arg(alarmList.at(j).Event_Time).arg(1)
                                                     .arg(104).arg(alarmList.at(j).Event_Status).arg(pic1name).arg("")));
+
+                                sprintf(ytShm->eHomeDeviceFtp[i].filePath,"%s",pic1name.toUtf8().data());
                             }else if(ytShm->eHomeDevice[i].io[8]==0x04){
                                 reportList.append(Alarm_Report(alarmList.at(j).Device_Code,alarmList.at(j).Event_Time,QString::fromUtf8("200105"),
                                                                     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,'','')")
                                                     .arg(2).arg(alarmList.at(j).Device_Code).arg(alarmList.at(j).Event_Time).arg(1)
                                                     .arg(106).arg(alarmList.at(j).Event_Status).arg(pic1name).arg("")));
+                                sprintf(ytShm->eHomeDeviceFtp[i].filePath,"%s",pic1name.toUtf8().data());
                             }
 
                             if(processList.at(i)->pid()>0)
@@ -870,16 +1011,47 @@ void CoreObject::time_out()
                 appendLog(QString("[ %1 sql(%2) ] %3").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(alarmList.length()).arg(rep.Sql));
                 QSqlQuery qry = db.exec(rep.Sql);
                 quint64 insertId = qry.lastInsertId().toULongLong();
-                QString type="";
-                QString companyCode = getCompanyCode(rep.Device_Code);
-                if(rep.Event_Name.toInt()==200104)
+                QString type="",point="";
+                //QString companyCode = getCompanyCode(rep.Device_Code);
+                QString companyCode="",deviceType="",deviceName="",value="";
+                for(int i=0;i<DEVICES_COUNT;i++){
+                    QString devid = QString(ytShm->eHomeDevice[i].deviceID);
+                    if(QString::compare(rep.Device_Code,devid)==0){
+                        companyCode = QString(ytShm->eHomeDevice[i].rtsppath);
+                        deviceType.append(QString("%1").arg((ytShm->eHomeDevice[i].io[8]&0xff),2,16,QChar('0')));
+                        deviceName = QString(ytMqShm->eHomeDeviceMq[i].deviceName);
+                        value = QString(ytShm->eHomeDeviceFtp[i].filePath);
+                        break;
+                    }
+                }
+
+                if(rep.Event_Name.toInt()==200104){
                     type=QString::fromUtf8("占道侦测报警");
-                else if(rep.Event_Name.toInt()==200001)
+                    point.append("1602");
+                }else if(rep.Event_Name.toInt()==200001){
                     type=QString::fromUtf8("火点侦测报警");
-                else if(rep.Event_Name.toInt()==200105)
+                    point.append("1601");
+                }else if(rep.Event_Name.toInt()==200105){
                     type=QString::fromUtf8("电动车禁入/区域入侵告警");
+                    point.append("1603");
+                }
 //                printf("device code:%s\nget company code:%s\n",rep.Device_Code.toUtf8().data(),companyCode.toUtf8().data());
                 if(companyCode.length()>0){
+
+                    QString alarmTopic = QString("/usky/ytCamCore/%1/%2/alarm").arg(companyCode).arg(rep.Device_Code);
+                    QString alarmStr = "";
+                    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()));
+
+                    if((m_client->connectionState()==QMQTT::STATE_DISCONNECTED) ||(m_client->connectionState()==QMQTT::STATE_INIT)){
+                        m_client->connectToHost();
+                    }
+                    if(m_client->connectionState()==QMQTT::STATE_CONNECTED){
+                        m_client->publish(QMQTT::Message(alarmmqttIdx++,alarmTopic,alarmStr.toUtf8()));
+
+                        if(alarmmqttIdx>9999)
+                            alarmmqttIdx=1;
+                    }
+
                     QString rep1 = QString("{\"SubType\":16,\"DeviceId\":\"%1\",\"InsertId\":%2,\"Confirmed\":false}").arg(rep.Device_Code).arg(insertId);
                     spThread[repcur]->appendData(rep1);
                     QString rep2 = QString("{\"SubType\":16,\"DeviceId\":\"%1\",\"InsertId\":%2,\"Confirmed\":0,\"CompanyCode\":\"%3\",\"evt_name\":\"%4\",\"evt\":0,\"alarm_time\":\"%5\"}")
@@ -933,7 +1105,7 @@ void CoreObject::time_out()
                 nopic_count++;
                 a_count++;
                 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));
-                clear_devalarm(ae);
+                clear_devalarm(ae,false);
                 if(nopic_count>5)
                     exit(1);
             }

+ 6 - 1
CamCore/coreobject.h

@@ -23,6 +23,7 @@
 #include <QSqlDatabase>
 #include <QSqlQuery>
 #include <QVariant>
+#include <qmqtt.h>
 //#include <QDebug>
 #include <QListIterator>
 #include "ttsthreads.h"
@@ -82,7 +83,7 @@ public:
     void appendLog(QString log);
     QString getCompanyCode(QString addr);
     bool checkAlarmDevTime(QString deviceid);
-    void clear_devalarm(AlarmEvent devAlarm);
+    void clear_devalarm(AlarmEvent devAlarm,bool isFtp);
 
     QStringList sqlList;
     QList<AlarmEvent> alarmList;
@@ -95,6 +96,7 @@ public slots:
     void time_out();
     void process_stop();
     void chartlog(quint16 idx, QDateTime t, QString data, bool dirflag);
+    void mqconnected();
 private:
     QTimer *timer;
     bool isWorking;
@@ -108,6 +110,9 @@ private:
     int synchour;
     uint alarmTime[DEVICES_COUNT];
     long alarmListenHandle;
+
+    QMQTT::Client *m_client;
+    quint16 infomqttIdx,alarmmqttIdx;
 };
 
 #endif // COREOBJECT_H

+ 17 - 4
CamDog/dogobject.cpp

@@ -3,6 +3,7 @@
 #include <QDebug>
 
 MyEHomeShm *ytShm;
+MyEHomeMQShm *ytMqShm;
 
 void setFullTime(FullTime *fTime, QDateTime qTime){
     fTime->YEAR = qTime.date().year()&0xffff;
@@ -33,9 +34,9 @@ DogObject::DogObject(QObject *parent) :
         ytShm->workingTime[i] = 0;
     devConfList.clear();
     if(db.isOpen()){
-        QSqlQuery qry = db.exec("select device_code, comm_type, company_code from ytiot_v_video order by device_code");
+        QSqlQuery qry = db.exec("select device_code, comm_type, company_code, dev_name from ytiot_v_video order by device_code");
         while(qry.next()){
-            devConfList.append(DevConf(qry.value(0).toString(),qry.value(1).toUInt()&0xff,qry.value(2).toString()));
+            devConfList.append(DevConf(qry.value(0).toString(),qry.value(1).toUInt()&0xff,qry.value(2).toString(),qry.value(3).toString()));
         }
         qry.clear();
     }
@@ -44,6 +45,9 @@ DogObject::DogObject(QObject *parent) :
         ytShm->eHomeDevice[i].io[8] = 0x00;
     }
     for(int i=0;i<devConfList.length();i++){
+        if(i>1024){
+            break;
+        }
         ytShm->eHomeDevice[i].LoginId = -1;
         ytShm->eHomeDevice[i].SessionId = -1;
         ytShm->eHomeDevice[i].listen_preview_handle = -1;
@@ -67,6 +71,10 @@ DogObject::DogObject(QObject *parent) :
         setFullTime(&(ytShm->eHomeDevice[i].transtime),zeroTime);
         sprintf(ytShm->eHomeDevice[i].deviceID,"%s",devConfList.at(i).DeviceId.toUtf8().data());
         sprintf(ytShm->eHomeDevice[i].rtsppath,"%s",devConfList.at(i).rtspPath.toUtf8().data());
+
+        sprintf(ytMqShm->eHomeDeviceMq[i].deviceID,"%s",devConfList.at(i).DeviceId.toUtf8().data());
+        sprintf(ytMqShm->eHomeDeviceMq[i].deviceName,"%s",devConfList.at(i).deviceName.toUtf8().data());
+
         ytShm->eHomeDevice[i].io[8] = devConfList.at(i).CommType;
         printf("%d)%s\n",i+1,ytShm->eHomeDevice[i].deviceID);
     }
@@ -81,6 +89,11 @@ bool DogObject::load_shm()
     if((shmid = shmget(key,sizeof(MyEHomeShm),IPC_CREAT|0666))==-1)
         return false;
     ytShm = (MyEHomeShm *)shmat(shmid,NULL,0);
+    if((key = ftok(SHMMQ_PATH,(int)(SHM_PORT+10)))==-1)
+        return false;
+    if((shmid = shmget(key,sizeof(MyEHomeMQShm),IPC_CREAT|0666))==-1)
+        return false;
+    ytMqShm = (MyEHomeMQShm *)shmat(shmid,NULL,0);
     return true;
 }
 
@@ -98,10 +111,10 @@ void DogObject::time_out()
     isWorking = true;
     if(db.isOpen()){
         devConfList.clear();
-        QSqlQuery qry = db.exec("select device_code, comm_type, company_code from ytiot_v_video order by device_code");
+        QSqlQuery qry = db.exec("select device_code, comm_type, company_code, dev_name from ytiot_v_video order by device_code");
 //        qDebug()<<"select devicd_code, comm_type from ytiot_v_video";
         while(qry.next()){
-            devConfList.append(DevConf(qry.value(0).toString(),qry.value(1).toUInt()&0xff,qry.value(2).toString()));
+            devConfList.append(DevConf(qry.value(0).toString(),qry.value(1).toUInt()&0xff,qry.value(2).toString(),qry.value(3).toString()));
 //            qDebug()<<qry.value(0).toString().toUtf8().data()<<QString("%1").arg(qry.value(1).toUInt()&0xff).toUtf8().data();
         }
         qry.clear();

+ 3 - 1
CamDog/dogobject.h

@@ -14,15 +14,17 @@
 
 class DevConf{
 public:
-    DevConf(QString id, quint8 type, QString path){
+    DevConf(QString id, quint8 type, QString path, QString devname){
         DeviceId = id;
         CommType = type;
         rtspPath = path;
+        deviceName = devname;
     }
 
     QString DeviceId;
     QString rtspPath;
     quint8 CommType;
+    QString deviceName;
 };
 
 class DogObject : public QObject

+ 18 - 0
include/YT_EHOME_shm.h

@@ -10,6 +10,7 @@
 //#include <QDateTime>
 
 #define SHM_PATH    "/"
+#define SHMMQ_PATH    "/"
 #define SHM_PORT    38808
 
 #define DEVICES_COUNT 1024
@@ -53,9 +54,26 @@ typedef struct {
     FILE *tmpfile;
 }EHomeDevice;
 
+typedef struct {
+    FullTime alarmTime;
+    char deviceID[64];
+    char fileName[128];
+    char filePath[1024];
+}EHomeDeviceFtp;
+
 typedef struct {
     uint workingTime[16];
     EHomeDevice eHomeDevice[DEVICES_COUNT];
+    EHomeDeviceFtp eHomeDeviceFtp[DEVICES_COUNT];
 }MyEHomeShm;
 
+typedef struct{
+    char deviceID[64];
+    char deviceName[64];
+}EHomeDeviceMq;
+
+typedef struct {
+    EHomeDeviceMq eHomeDeviceMq[DEVICES_COUNT];
+}MyEHomeMQShm;
+
 #endif // YT_EHOME_SHM_H