hanzhengyi 4 лет назад
Родитель
Сommit
7c37d32e5f

+ 22 - 0
ytDHCamCore/.qmake.stash

@@ -0,0 +1,22 @@
+QMAKE_CXX.INCDIRS = \
+    /usr/include/c++/4.8.5 \
+    /usr/include/c++/4.8.5/x86_64-redhat-linux \
+    /usr/include/c++/4.8.5/backward \
+    /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include \
+    /usr/local/include \
+    /usr/include
+QMAKE_CXX.LIBDIRS = \
+    /usr/lib/gcc/x86_64-redhat-linux/4.8.5 \
+    /usr/lib64 \
+    /lib64 \
+    /usr/lib \
+    /lib
+QMAKE_CXX.QT_COMPILER_STDCXX = 199711L
+QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 4
+QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 8
+QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 5
+QMAKE_CXX.COMPILER_MACROS = \
+    QT_COMPILER_STDCXX \
+    QMAKE_GCC_MAJOR_VERSION \
+    QMAKE_GCC_MINOR_VERSION \
+    QMAKE_GCC_PATCH_VERSION

+ 169 - 0
ytDHCamCore/camthread.cpp

@@ -0,0 +1,169 @@
+#include "camthread.h"
+#include "ytdhcam.h"
+
+#define UN_REFERENCED_PARAMETER(x) {(x) = (x);}
+
+BOOL CALLBACK MessCallBack(LONG lCommand, LLONG lLoginID, char *pBuf, DWORD dwBufLen, char *pchDVRIP, LONG nDVRPort, LDWORD dwUser)
+{
+    if(dwUser==0)
+        return false;
+    QDateTime t = QDateTime::currentDateTime();
+    CamThread *thread = (CamThread *)dwUser;
+    thread->emit_msg(QString::fromUtf8("[ %1 %2 ] Alarm(%3)").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(thread->DevIP).arg(lCommand));
+    return true;
+}
+
+int CALLBACK RealLoadPicCallback(LLONG lAnalyzerHandle, DWORD dwAlarmType, void* pAlarmInfo, BYTE *pBuffer, DWORD dwBufSize, LDWORD dwUser, int nSequence, void *userdata)
+{
+    if(dwUser==0)
+        return false;
+    unsigned int i;
+    FILE *file;
+    QDateTime t = QDateTime::currentDateTime();
+    CamThread *thread = (CamThread *)dwUser;
+    thread->emit_msg(QString("[ %1 %2 ] lAnalyzerHandle:%3, dwAlarmType:%4, pAlarmInfo:%5, nSequence:%6")
+                     .arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(thread->DevIP)
+                     .arg(lAnalyzerHandle).arg(dwAlarmType).arg(QString((char *)pAlarmInfo)).arg(nSequence));
+    QString filename = QString("/usr/local/nginx/html/VideoAlarmPics/%1_%2.jpg").arg(thread->DevName).arg(t.toString("yyyyMMddHHmmsszzz"));
+    file = fopen(filename.toUtf8().data(),"w");
+    for(i=0;i<dwBufSize;i++){
+        fputc(pBuffer[i],file);
+    }
+    fflush(file);
+    fclose(file);
+    thread->emit_alarm(thread->DevName,QString("%1%2").arg(dwAlarmType,2,10,QChar('0')).arg(nSequence,2,10,QChar('0')),QString("http://47.103.74.123/VideoAlarmPics/%1_%2.jpg").arg(thread->DevName).arg(t.toString("yyyyMMddHHmmsszzz")),t.toString("yyyy-MM-dd HH:mm:ss"));
+    return 0;
+}
+
+CamThread::CamThread(int idx, QObject *parent)
+    : QThread(parent)
+{
+    DevIdx = idx;
+    DevIP = QString(sysConfShm->deviceInfo[DevIdx].Ip);
+    DevPort = sysConfShm->deviceInfo[DevIdx].Port;
+    DevName = QString(sysConfShm->deviceInfo[DevIdx].Device_Code);
+    DevLoginname = QString(sysConfShm->deviceInfo[DevIdx].LoginName);
+    DevPassword = QString(sysConfShm->deviceInfo[DevIdx].Password);
+}
+
+CamThread::~CamThread()
+{
+    if(sysConfShm->deviceInfo[DevIdx].SubscribeHandle!=0)
+        CLIENT_StopLoadPic(sysConfShm->deviceInfo[DevIdx].SubscribeHandle);
+    if(sysConfShm->deviceInfo[DevIdx].LoginHandle!=0)
+        CLIENT_Logout(sysConfShm->deviceInfo[DevIdx].LoginHandle);
+    sysConfShm->deviceInfo[DevIdx].LoginHandle=0;
+}
+
+void CamThread::emit_alarm(QString deviceid, QString alarmtype, QString picpath, QString alarmtime){
+    emit CamAlarm(deviceid,alarmtype,picpath,alarmtime);
+}
+
+void CamThread::stop()
+{
+    keepwork = false;
+}
+
+void CamThread::emit_msg(QString msg)
+{
+    emit CamMsg(msg);
+}
+
+void CamThread::initNetSDK()
+{
+    CLIENT_SetDVRMessCallBack(MessCallBack,(LDWORD)this);
+}
+
+void CamThread::LoginError(QDateTime t, QString ip, int error, QString &errStr)
+{
+    switch (error) {
+    case 0:
+        errStr = QString::fromUtf8("[ %1 %2 ] Login Success").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 1:
+        errStr = QString::fromUtf8("[ %1 %2 ] Account or Password Incorrect").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 2:
+        errStr = QString::fromUtf8("[ %1 %2 ] User Is Not Exist").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 3:
+        errStr = QString::fromUtf8("[ %1 %2 ] Login Timeout").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 4:
+        errStr = QString::fromUtf8("[ %1 %2 ] Repeat Login").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 5:
+        errStr = QString::fromUtf8("[ %1 %2 ] User Account is Locked").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 6:
+        errStr = QString::fromUtf8("[ %1 %2 ] User In Blacklist").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 7:
+        errStr = QString::fromUtf8("[ %1 %2 ] Device Busy").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 8:
+        errStr = QString::fromUtf8("[ %1 %2 ] Sub Connect Failed").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 9:
+        errStr = QString::fromUtf8("[ %1 %2] Host Connect Failed").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 10:
+        errStr = QString::fromUtf8("[ %1 %2 ] Max Connect").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 11:
+        errStr = QString::fromUtf8("[ %1 %2 ] Support Protocol3 Only").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 12:
+        errStr = QString::fromUtf8("[ %1 %2 ] Ukey Info Error").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 13:
+        errStr = QString::fromUtf8("[ %1 %2 ] No Authorized").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    case 18:
+        errStr = QString::fromUtf8("[ %1 %2 ] Device Account isn't Initialized").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip);
+        break;
+    default:
+        errStr = QString::fromUtf8("[ %1 %2 ] Unknown Error Code(%3)").arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(ip).arg(error);
+        break;
+    }
+    emit_msg(errStr);
+}
+
+void CamThread::run()
+{
+    int nError = 0;
+    NET_DEVICEINFO_Ex stDevInfo;
+    QDateTime t;
+    QString Msg="";
+    initNetSDK();
+    sysConfShm->deviceInfo[DevIdx].LoginHandle = CLIENT_LoginEx2(sysConfShm->deviceInfo[DevIdx].Ip,
+                                  sysConfShm->deviceInfo[DevIdx].Port,
+                                  sysConfShm->deviceInfo[DevIdx].LoginName,
+                                  sysConfShm->deviceInfo[DevIdx].Password,
+                                  EM_LOGIN_SPEC_CAP_SERVER_CONN,
+                                  (void *)(sysConfShm->deviceInfo[DevIdx].Device_Code),
+                                  &stDevInfo,
+                                  &nError);
+    t = QDateTime::currentDateTime();
+    if(sysConfShm->deviceInfo[DevIdx].LoginHandle==0){
+        sysConfShm->deviceInfo[DevIdx].LoginStatus = 0x00;
+        LoginError(t,DevIP,nError,Msg);
+        emit CamMsg(Msg);
+    }else{
+        sysConfShm->deviceInfo[DevIdx].LoginStatus = 0x01;
+        sysConfShm->deviceInfo[DevIdx].keepThread = 0x01;
+        LoginError(t,DevIP,nError,Msg);
+        emit CamMsg(Msg);
+        sysConfShm->deviceInfo[DevIdx].SubscribeHandle = CLIENT_RealLoadPictureEx(sysConfShm->deviceInfo[DevIdx].LoginHandle,
+                                 0,EVENT_IVS_ALL,TRUE,RealLoadPicCallback,(LDWORD)this,nullptr);
+        if(sysConfShm->deviceInfo[DevIdx].SubscribeHandle==0){
+            emit CamMsg(QString("subscribe to intelligent event failed"));
+        }else{
+            emit CamMsg(QString("subscribe to intelligent event success"));
+            while(sysConfShm->deviceInfo[DevIdx].keepThread){
+                usleep(500000);
+            }
+            CLIENT_StopLoadPic(sysConfShm->deviceInfo[DevIdx].SubscribeHandle);
+        }
+    }
+}

+ 39 - 0
ytDHCamCore/camthread.h

@@ -0,0 +1,39 @@
+#ifndef CAMTHREAD_H
+#define CAMTHREAD_H
+
+#include <QThread>
+#include <QString>
+#include <QDateTime>
+#include <stdio.h>
+#include "dhinc/dhnetsdk.h"
+
+class CamThread : public QThread
+{
+    Q_OBJECT
+public:
+    explicit CamThread(int idx=1023999, QObject *parent = nullptr);
+    ~CamThread();
+    void initNetSDK();
+    void run();
+    void LoginError(QDateTime t, QString ip, int error, QString &errStr);
+    void emit_msg(QString msg);
+    void emit_alarm(QString deviceid, QString alarmtype, QString picpath, QString alarmtime);
+    void stop();
+
+    QString DevIP;
+    QString DevName;
+    quint16 DevPort;
+    QString DevLoginname;
+    QString DevPassword;
+signals:
+    void CamMsg(QString msg);
+    void CamAlarm(QString deviceid, QString alarmtype, QString picpath, QString alarmtime);
+public slots:
+
+private:
+    void *CamParam;
+    bool keepwork;
+    int DevIdx;
+};
+
+#endif // CAMTHREAD_H

+ 170 - 0
ytDHCamCore/databasethread.cpp

@@ -0,0 +1,170 @@
+#include "databasethread.h"
+#include "ytdhcam.h"
+
+#define HostName  "47.98.201.187"
+#define HostPort 3306
+#define UserName "root"
+#define PassWord "Yt2018IoT"
+#define DatabaseName "jdxf"
+
+
+DatabaseThread::DatabaseThread(QObject *parent) :
+    QThread(parent)
+{
+    hour = 255;
+    sqlList.clear();
+    alarmRepList.clear();
+    db = QSqlDatabase::addDatabase("QMYSQL","video_db");
+    db.setHostName(QString(HostName));
+    db.setPort(HostPort);
+    db.setUserName(QString(UserName));
+    db.setPassword(QString(PassWord));
+    db.setDatabaseName(QString(DatabaseName));
+    db.open();
+    check_devicelist();
+}
+
+void DatabaseThread::appendSql(QString sql)
+{
+    sqlList.append(sql);
+}
+
+void DatabaseThread::appendAlarm(AlarmRep rep)
+{
+    alarmRepList.append(rep);
+}
+
+void DatabaseThread::check_devicelist()
+{
+    QSqlQuery qry = db.exec("select owner_code, owner_name, unitinfo, owner_xh, company, push_param1, push_param2, push_param3, push_param4, login_param from sp_owner where dwtype=16");
+    int nrow= 0;
+    while(qry.next()){
+        sysConfShm->deviceInfo[nrow].Enabled=0x01;
+        sprintf(sysConfShm->deviceInfo[nrow].Device_Code,"%s",qry.value(0).toString().toUtf8().data());
+        sprintf(sysConfShm->deviceInfo[nrow].Device_Name,"%s",qry.value(1).toString().toUtf8().data());
+        sprintf(sysConfShm->deviceInfo[nrow].Device_Info,"%s",qry.value(2).toString().toUtf8().data());
+        sprintf(sysConfShm->deviceInfo[nrow].Device_Type,"%s",qry.value(3).toString().toUtf8().data());
+        sprintf(sysConfShm->deviceInfo[nrow].Company_Code,"%s",qry.value(4).toString().toUtf8().data());
+        sysConfShm->deviceInfo[nrow].Push_Param[0]=qry.value(5).toUInt();
+        sysConfShm->deviceInfo[nrow].Push_Param[1]=qry.value(6).toUInt();
+        sysConfShm->deviceInfo[nrow].Push_Param[2]=qry.value(7).toUInt();
+        sysConfShm->deviceInfo[nrow].Push_Param[3]=qry.value(8).toUInt();
+        sysConfShm->deviceInfo[nrow].RegistStatus = 0x00;
+        sysConfShm->deviceInfo[nrow].LoginStatus = 0x00;
+        sysConfShm->deviceInfo[nrow].LoginHandle = 0;
+        QJsonParseError err;
+        QJsonDocument jDoc = QJsonDocument::fromJson(qry.value(9).toString().toUtf8(),&err);
+        if(err.error==QJsonParseError::NoError){
+            QJsonObject jRoot = jDoc.object();
+            if((!jRoot.value("loginname").isUndefined())&&(!jRoot.value("loginname").isNull())){
+                sprintf(sysConfShm->deviceInfo[nrow].LoginName,"%s",jRoot.value("loginname").toString().toUtf8().data());
+            }
+            if((!jRoot.value("password").isUndefined())&&(!jRoot.value("password").isNull())){
+                sprintf(sysConfShm->deviceInfo[nrow].Password,"%s",jRoot.value("password").toString().toUtf8().data());
+            }
+        }else{
+        }
+        nrow++;
+    }
+    for(int i=nrow;i<102400;i++)
+        sysConfShm->deviceInfo[i].Enabled=0x00;
+    qry.clear();
+    nrow = 1;
+    qry = db.exec("select id,owner_id from sp_owner_company order by id");
+    while(qry.next()){
+        if(nrow<10240){
+            sysConfShm->companyInfo[nrow].Idx = qry.value(0).toULongLong()&0xffffffff;
+            sysConfShm->companyInfo[nrow].ParentId = 0;
+            sysConfShm->companyInfo[nrow].Enabled = 0x01;
+            sprintf(sysConfShm->companyInfo[nrow].CompanyCode,"%d",qry.value(1).toUInt());
+            nrow++;
+        }else
+            break;
+    }
+    qry.clear();
+    nrow = 1;
+    qry = db.exec("select id, owner_code, phone, data2 from sp_owner_phone order by id");
+    while(qry.next()){
+        if(nrow<102400){
+            char *phone = qry.value(2).toString().toUtf8().data();
+            unsigned long len = strlen(phone);
+            sysConfShm->userInfo[nrow].Idx = qry.value(0).toULongLong()&0xffffffff;
+            sysConfShm->userInfo[nrow].Enabled = 0x01;
+            sprintf(sysConfShm->userInfo[nrow].CompanyCode,"%d",qry.value(1).toUInt());
+            for(unsigned long i=0;i<20;i++){
+                sysConfShm->userInfo[nrow].CellPhone[i] = 0x00;
+                if(i<len)
+                    sysConfShm->userInfo[nrow].CellPhone[i] = phone[i];
+            }
+            QString data2 = qry.value(3).toString();
+            if(data2.length()>0){
+                QStringList ds = data2.split(",");
+                quint64 p = 0x0000000000000000;
+                for(int i=0;i<ds.length();i++){
+                    p |= ((0x0000000000000001)<<(ds.at(i).toUInt()&0x3f));
+                }
+                sysConfShm->userInfo[nrow].InfoChecked = p;
+            }else
+                sysConfShm->userInfo[nrow].InfoChecked=0;
+            nrow++;
+        }else
+            break;
+    }
+    hour=QTime::currentTime().hour();
+}
+
+void DatabaseThread::run()
+{
+    while(1){
+        if(!db.isOpen()){
+            db.open();
+        }else{
+            if(QTime::currentTime().hour()!=hour){
+                hour=QTime::currentTime().hour();
+                check_devicelist();
+            }
+            if(sqlList.length()>0){
+                while(sqlList.length()>0){
+                    db.exec(sqlList.first());
+                    sqlList.removeFirst();
+                    usleep(1000);
+                }
+            }
+            if(alarmRepList.length()>0){
+                while(alarmRepList.length()>0){
+                    AlarmRep rep = alarmRepList.first();
+                    QSqlQuery qry = db.exec(rep.Sql);
+                    quint64 lastid = qry.lastInsertId().toULongLong()&0xffffffffffffffff;
+                    QString companyCode="";
+                    QString phoneList="";
+                    for(int i=0;i<102400;i++){
+                        if(sysConfShm->deviceInfo[i].Enabled==0x01){
+                            if(QString::compare(rep.DeviceId,QString(sysConfShm->deviceInfo[i].Device_Code))==0){
+                                companyCode = QString(sysConfShm->deviceInfo[i].Company_Code);
+                                break;
+                            }
+                        }
+                    }
+                    if(companyCode.length()>0){
+                        for(int i=0;i<102400;i++){
+                            if(sysConfShm->userInfo[i].Enabled==0x01){
+                                if(QString::compare(companyCode,QString(sysConfShm->userInfo[i].CompanyCode))==0){
+                                    if(phoneList.length()==0)
+                                        phoneList = QString(sysConfShm->userInfo[i].CellPhone);
+                                    else
+                                        phoneList.append(QString(",%1").arg(sysConfShm->userInfo[i].CellPhone));
+                                }
+                            }
+                        }
+                    }
+                    if((lastid>0)&&(companyCode.length()>0)){
+                        emit AlarmReport(rep.DeviceId,lastid,rep.AlarmType,rep.AlarmTime,companyCode,phoneList);
+                    }
+                    alarmRepList.removeFirst();
+                    usleep(1000);
+                }
+            }
+        }
+        usleep(50000);
+    }
+}

+ 55 - 0
ytDHCamCore/databasethread.h

@@ -0,0 +1,55 @@
+#ifndef DATABASETHREAD_H
+#define DATABASETHREAD_H
+
+#include <QThread>
+#include <QDateTime>
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QSqlError>
+#include <QVariant>
+#include <QStringList>
+#include <QList>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonArray>
+#include <QJsonValue>
+#include <QVariant>
+#include <QJsonParseError>
+
+
+class AlarmRep {
+public:
+    AlarmRep(QString deviceId="",QString sql="",QString atype="", QString t=""){
+        DeviceId = deviceId;
+        Sql = sql;
+        AlarmType = atype;
+        AlarmTime=t;
+    }
+
+    QString DeviceId;
+    QString Sql;
+    QString AlarmType;
+    QString AlarmTime;
+};
+
+class DatabaseThread : public QThread
+{
+    Q_OBJECT
+public:
+    explicit DatabaseThread(QObject *parent = nullptr);
+    void appendSql(QString sql);
+    void appendAlarm(AlarmRep rep);
+    void run();
+    void check_devicelist();
+signals:
+    void AlarmReport(QString addr, quint64 insertid, QString type, QString time, QString companycode, QString phonelist);
+public slots:
+    
+private:
+    int hour;
+    QSqlDatabase db;
+    QStringList sqlList;
+    QList<AlarmRep> alarmRepList;
+};
+
+#endif // DATABASETHREAD_H