#include "hkcamera.h" #include #include #include #include #include #include #include using namespace std; void intrusiondetecproc(NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser) { //以当前时间作为文件名 QDateTime datetime= QDateTime::currentDateTime();//获取系统当前的时间 QString strtime = datetime.toString("yyyyMMddhhmmss");//格式化时间 // QString qstrdir = "D:\\sxkyprjinfo\\idsimg"; QString qstrdir = "./prjfiles/imgs/idsimg"; QString qstrfilename = qstrdir + "/" + strtime + ".jpg"; NET_VCA_RULE_ALARM struVcaAlarm = { 0 }; memcpy(&struVcaAlarm, pAlarmInfo, sizeof(NET_VCA_RULE_ALARM)); QString strdevip = struVcaAlarm.struDevInfo.struDevIP.sIpV4; //保存抓拍场景图片 if (struVcaAlarm.dwPicDataLen > 0 && struVcaAlarm.pImage != NULL) { HANDLE hFile; DWORD dwReturn; hFile = CreateFile(QString(qstrfilename).toStdWString().data(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { return; } BOOL wf = WriteFile(hFile, struVcaAlarm.pImage, struVcaAlarm.dwPicDataLen, &dwReturn, NULL); if(!wf){ int ret = GetLastError(); return; } CloseHandle(hFile); hFile = INVALID_HANDLE_VALUE; } WORD wEventType = struVcaAlarm.struRuleInfo.wEventTypeEx; switch (wEventType) { case ENUM_VCA_EVENT_INTRUSION: //区域入侵报警 { std::cout << "camera_SavePicture save pic :" << "区域入侵报警" ; QJsonObject jsonret = ((hkcamera*)pUser)->PostRequestWithFile(qstrfilename, strdevip, ENUM_VCA_EVENT_INTRUSION); QJsonValue code = jsonret.value("code"); if(code == 0 ){ //发布区域入侵消息 QJsonObject jsonpublish; QJsonValue fileUrl = jsonret.value("fileUrl"); jsonpublish.insert("fileUrl", fileUrl); QString qsMessage = QString(QJsonDocument(jsonpublish).toJson()); // mqttgoaf* ptet =((hkcamera*)pUser)->pmqttgoaf; // ptet->mqttpublish("topic/camera/alarm", "qsMessage"); } break; } default: { std::cout << "其他报警,报警信息类型: " <toUnicode(struPlateResult.struPlateInfo.sLicense); // QString sLicense1 = struPlateResult.struPlateInfo.sLicense; // QString sLicense2 = QString(QString::fromLocal8Bit(struPlateResult.struPlateInfo.sLicense)); // QString sLicense3 = QObject::trUtf8(struPlateResult.struPlateInfo.sLicense); // QString strT3 = QTextCodec::codecForName("UTF-8")->toUnicode(struPlateResult.struPlateInfo.sLicense); // QString sLicense5 = QString(QLatin1String(struPlateResult.struPlateInfo.sLicense)); // QString sLicense6 = QString(QLatin1String(struPlateResult.struPlateInfo.sLicense)); // std::cout << "licenseplatedetecproc sLicense :" << struPlateResult.struPlateInfo.sLicense ; HANDLE hFile; // HANDLE hFilesmall; DWORD dwReturn; //保存场景图 // if (struPlateResult.dwPicLen != 0 && struPlateResult.byResultType == 1) // { // hFile = CreateFile(QString(qstrfilename).toStdWString().data(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // if (hFile == INVALID_HANDLE_VALUE) // { // std::cout << "licenseplatedetecproc CreateFile :" << " fail" ; // return; // } // BOOL wf = WriteFile(hFile, struPlateResult.pBuffer1,struPlateResult.dwPicLen, &dwReturn, NULL); // if(!wf){ // int ret = GetLastError(); // std::cout << "licenseplatedetecproc WriteFile error :" << ret ; // } // std::cout << "licenseplatedetecproc WriteFile :" << " ok" ; // } //车牌小图片 // if (struPlateResult.dwPicPlateLen != 0 && struPlateResult.byResultType == 1) // { // hFilesmall = CreateFile(QString(qstrfilenamesmall).toStdWString().data(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // if (hFilesmall == INVALID_HANDLE_VALUE) // { // return; // } // BOOL wf = WriteFile(hFilesmall, struPlateResult.pBuffer1,struPlateResult.dwPicLen, &dwReturn, NULL); // if(!wf){ // int ret = GetLastError(); // } // } //相关联的重量评估摄像头抓拍图片 QString qsip = ((hkcamera*)pUser)->cameramatchmap.value(strdevip); LONG userid = ((hkcamera*)pUser)->camerauseridmap.value(qsip); if(userid!=-1) { NET_DVR_JPEGPARA IpJpegPara2; IpJpegPara2.wPicQuality=0; IpJpegPara2.wPicSize=0xff; // QDateTime current_date_time =QDateTime::currentDateTime(); // QString current_date =current_date_time.toString("yyyy-MM-dd_hh-mm-ss_zzz"); // current_date="D:\\Picture\\"+current_date+".jpg";//保存地址,要事先设置好文件夹 char* fileName; QByteArray ba = qstrfilename.toLatin1(); // must fileName=ba.data(); if(NET_DVR_CaptureJPEGPicture(userid,1,&IpJpegPara2,fileName)==false) { qDebug() << "NET_DVR_CaptureJPEGPicture error;" << "error number is " << NET_DVR_GetLastError(); return; } qDebug() <<"Capture Success!"<PostFileWithlicense(qstrfilename, strdevip, sLicense); } void CALLBACK cbMessageCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser) { int i = 0; switch (lCommand) { case COMM_ALARM_RULE: //异常行为识别报警信息 COMM_ALARM_V30 case COMM_ALARM_V30: { intrusiondetecproc( pAlarmer, pAlarmInfo, dwBufLen, pUser); break; } case COMM_UPLOAD_PLATE_RESULT: { licenseplatedetecproc(pAlarmer, pAlarmInfo, dwBufLen, pUser); } default: { // printf("其他报警,报警信息类型: 0x%x\n", lCommand); std::cout << "其他报警,报警信息类型: " <open(QIODevice::ReadOnly); //multipart请求 QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); //文件块 QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"file\";filename=\"%1\"").arg(fileName))); filePart.setBodyDevice(inputFile); inputFile->setParent(multiPart); multiPart->append(filePart); QHttpPart paramer1Part; paramer1Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"devip\"")); paramer1Part.setBody(devip.toUtf8()); multiPart->append(paramer1Part); QHttpPart paramer2Part; paramer2Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"eventtype\"")); QString streventtype = QString::number(eventtype); paramer2Part.setBody(streventtype.toUtf8()); multiPart->append(paramer2Part); //生成对应的网址请求 QNetworkRequest request; QString scheme = "http"; //QString serverAddr = "192.168.3.5"; QString serverAddr = "39.104.63.156"; QString port = "1688"; QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port; QString fullRequest = requestHeader + "/goaf/sensordata/uploadHikFile"; request.setUrl(QUrl(fullRequest)); //发送请求 QNetworkAccessManager manager; QNetworkReply *reply = manager.post(request,multiPart); multiPart->setParent(reply); QEventLoop eventLoop; QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),&eventLoop, SLOT(quit())); eventLoop.exec(QEventLoop::ExcludeUserInputEvents); if(reply->error() != QNetworkReply::NoError) { qjsonret.insert("code", reply->error()); return qjsonret; } //解析返回的Json结果 QByteArray replyData = reply->readAll(); QJsonParseError json_error; QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error)); if(json_error.error != QJsonParseError::NoError) { qjsonret.insert("code", -1); return qjsonret; } QJsonObject rootObj = jsonDoc.object(); //QString codeStr = rootObj.value("code").toString(); if(rootObj.value("code") == 0) { QJsonValue rootdata = rootObj.value("data"); QJsonObject datobj = rootdata.toObject(); QString codeStr = datobj.value("fileUrl").toString(); qjsonret.insert("code", 0); qjsonret.insert("fileUrl", codeStr); return qjsonret; } else { //请求失败对对应的处理 qjsonret.insert("code", 1); return qjsonret; } } void hkcamera:: PostFileWithlicense(QString filePath, QString devip, QString slicense ) { QJsonObject qjsonret; //生成对应的网址请求 QFileInfo fileInfo(filePath); QString fileName =fileInfo.fileName(); QFile* inputFile = new QFile(filePath); inputFile->open(QIODevice::ReadOnly); //multipart请求 QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); //文件块 QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"file\";filename=\"%1\"").arg(fileName))); filePart.setBodyDevice(inputFile); inputFile->setParent(multiPart); multiPart->append(filePart); QHttpPart paramer1Part; paramer1Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"devip\"")); paramer1Part.setBody(devip.toUtf8()); multiPart->append(paramer1Part); QHttpPart paramer2Part; paramer2Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"license\"")); paramer2Part.setBody(slicense.toUtf8()); multiPart->append(paramer2Part); QHttpPart paramer3Part; QString ocid = "406283"; paramer3Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"ocid\"")); paramer3Part.setBody(ocid.toUtf8()); multiPart->append(paramer3Part); //生成对应的网址请求 QNetworkRequest request; QString scheme = "http"; // QString serverAddr = "192.168.3.5"; QString serverAddr = "39.104.63.156"; QString port = "1888"; QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port; QString fullRequest = requestHeader + "/trans/allinfo/uploadHikFile"; request.setUrl(QUrl(fullRequest)); //发送请求 QNetworkAccessManager manager; QNetworkReply *reply = manager.post(request,multiPart); multiPart->setParent(reply); QEventLoop eventLoop; QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),&eventLoop, SLOT(quit())); eventLoop.exec(QEventLoop::ExcludeUserInputEvents); if(reply->error() != QNetworkReply::NoError) { qjsonret.insert("code", reply->error()); return ; } //解析返回的Json结果 QByteArray replyData = reply->readAll(); QJsonParseError json_error; QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error)); if(json_error.error != QJsonParseError::NoError) { qjsonret.insert("code", -1); return ; } QJsonObject rootObj = jsonDoc.object(); //QString codeStr = rootObj.value("code").toString(); if(rootObj.value("code") == 0) { QJsonValue rootdata = rootObj.value("data"); QJsonObject datobj = rootdata.toObject(); QString codeStr = datobj.value("fileUrl").toString(); qjsonret.insert("code", 0); qjsonret.insert("fileUrl", codeStr); return ; } else { //请求失败对对应的处理 qjsonret.insert("code", 1); return ; } } void hkcamera::logout() { if(0 != m_userid) { NET_DVR_Logout(m_userid); m_userid = 0; m_playhandle = -1; } }