hkcamera.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  1. #include "hkcamera.h"
  2. #include<iostream>
  3. #include <QDateTime>
  4. #include<QPushButton>
  5. #include<QLabel>
  6. #include<QMessageBox>
  7. #include <QJsonObject>
  8. #include <QTextCodec>
  9. using namespace std;
  10. void intrusiondetecproc(NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
  11. {
  12. //以当前时间作为文件名
  13. QDateTime datetime= QDateTime::currentDateTime();//获取系统当前的时间
  14. QString strtime = datetime.toString("yyyyMMddhhmmss");//格式化时间
  15. // QString qstrdir = "D:\\sxkyprjinfo\\idsimg";
  16. QString qstrdir = "./prjfiles/imgs/idsimg";
  17. QString qstrfilename = qstrdir + "/" + strtime + ".jpg";
  18. NET_VCA_RULE_ALARM struVcaAlarm = { 0 };
  19. memcpy(&struVcaAlarm, pAlarmInfo, sizeof(NET_VCA_RULE_ALARM));
  20. QString strdevip = struVcaAlarm.struDevInfo.struDevIP.sIpV4;
  21. //保存抓拍场景图片
  22. if (struVcaAlarm.dwPicDataLen > 0 && struVcaAlarm.pImage != NULL)
  23. {
  24. HANDLE hFile;
  25. DWORD dwReturn;
  26. hFile = CreateFile(QString(qstrfilename).toStdWString().data(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  27. if (hFile == INVALID_HANDLE_VALUE)
  28. {
  29. return;
  30. }
  31. BOOL wf = WriteFile(hFile, struVcaAlarm.pImage, struVcaAlarm.dwPicDataLen, &dwReturn, NULL);
  32. if(!wf){
  33. int ret = GetLastError();
  34. return;
  35. }
  36. CloseHandle(hFile);
  37. hFile = INVALID_HANDLE_VALUE;
  38. }
  39. WORD wEventType = struVcaAlarm.struRuleInfo.wEventTypeEx;
  40. switch (wEventType)
  41. {
  42. case ENUM_VCA_EVENT_INTRUSION: //区域入侵报警
  43. {
  44. std::cout << "camera_SavePicture save pic :" << "区域入侵报警" ;
  45. QJsonObject jsonret = ((hkcamera*)pUser)->PostRequestWithFile(qstrfilename, strdevip, ENUM_VCA_EVENT_INTRUSION);
  46. QJsonValue code = jsonret.value("code");
  47. if(code == 0 ){
  48. //发布区域入侵消息
  49. QJsonObject jsonpublish;
  50. QJsonValue fileUrl = jsonret.value("fileUrl");
  51. jsonpublish.insert("fileUrl", fileUrl);
  52. QString qsMessage = QString(QJsonDocument(jsonpublish).toJson());
  53. // mqttgoaf* ptet =((hkcamera*)pUser)->pmqttgoaf;
  54. // ptet->mqttpublish("topic/camera/alarm", "qsMessage");
  55. }
  56. break;
  57. }
  58. default:
  59. {
  60. std::cout << "其他报警,报警信息类型: " <<wEventType ;
  61. break;
  62. }
  63. }
  64. }
  65. void licenseplatedetecproc(NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
  66. {
  67. //以当前时间作为文件名
  68. QDateTime datetime= QDateTime::currentDateTime();//获取系统当前的时间
  69. QString strtime = datetime.toString("yyyyMMddhhmmss");//格式化时间
  70. // QString qstrdir = "D:\\sxkyprjinfo\\minertransimg";// ./cfg/sxkyprj.cfg
  71. QString qstrdir = "./prjfiles/imgs/minertransimg";
  72. QString qstrfilename = qstrdir + "/" + strtime + ".jpg";
  73. QString qstrfilenamesmall = qstrdir + "/" + strtime + "small.jpg";
  74. NET_DVR_ALARMER struDvrAlarm = { 0 };
  75. memcpy(&struDvrAlarm, pAlarmer, sizeof(NET_DVR_ALARMER));
  76. QString strdevip = struDvrAlarm.sDeviceIP;
  77. std::cout << "licenseplatedetecproc strdevip :" << strdevip.toStdString();
  78. NET_DVR_PLATE_RESULT struPlateResult = { 0 };
  79. memcpy(&struPlateResult, pAlarmInfo, sizeof(NET_DVR_PLATE_RESULT ));
  80. printf("车牌号: %s\n", struPlateResult.struPlateInfo.sLicense);//车牌号
  81. QString sLicense = QTextCodec::codecForName("GB2312")->toUnicode(struPlateResult.struPlateInfo.sLicense);
  82. // QString sLicense1 = struPlateResult.struPlateInfo.sLicense;
  83. // QString sLicense2 = QString(QString::fromLocal8Bit(struPlateResult.struPlateInfo.sLicense));
  84. // QString sLicense3 = QObject::trUtf8(struPlateResult.struPlateInfo.sLicense);
  85. // QString strT3 = QTextCodec::codecForName("UTF-8")->toUnicode(struPlateResult.struPlateInfo.sLicense);
  86. // QString sLicense5 = QString(QLatin1String(struPlateResult.struPlateInfo.sLicense));
  87. // QString sLicense6 = QString(QLatin1String(struPlateResult.struPlateInfo.sLicense));
  88. // std::cout << "licenseplatedetecproc sLicense :" << struPlateResult.struPlateInfo.sLicense ;
  89. HANDLE hFile;
  90. // HANDLE hFilesmall;
  91. DWORD dwReturn;
  92. //保存场景图
  93. // if (struPlateResult.dwPicLen != 0 && struPlateResult.byResultType == 1)
  94. // {
  95. // hFile = CreateFile(QString(qstrfilename).toStdWString().data(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  96. // if (hFile == INVALID_HANDLE_VALUE)
  97. // {
  98. // std::cout << "licenseplatedetecproc CreateFile :" << " fail" ;
  99. // return;
  100. // }
  101. // BOOL wf = WriteFile(hFile, struPlateResult.pBuffer1,struPlateResult.dwPicLen, &dwReturn, NULL);
  102. // if(!wf){
  103. // int ret = GetLastError();
  104. // std::cout << "licenseplatedetecproc WriteFile error :" << ret ;
  105. // }
  106. // std::cout << "licenseplatedetecproc WriteFile :" << " ok" ;
  107. // }
  108. //车牌小图片
  109. // if (struPlateResult.dwPicPlateLen != 0 && struPlateResult.byResultType == 1)
  110. // {
  111. // hFilesmall = CreateFile(QString(qstrfilenamesmall).toStdWString().data(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  112. // if (hFilesmall == INVALID_HANDLE_VALUE)
  113. // {
  114. // return;
  115. // }
  116. // BOOL wf = WriteFile(hFilesmall, struPlateResult.pBuffer1,struPlateResult.dwPicLen, &dwReturn, NULL);
  117. // if(!wf){
  118. // int ret = GetLastError();
  119. // }
  120. // }
  121. //相关联的重量评估摄像头抓拍图片
  122. QString qsip = ((hkcamera*)pUser)->cameramatchmap.value(strdevip);
  123. LONG userid = ((hkcamera*)pUser)->camerauseridmap.value(qsip);
  124. if(userid!=-1)
  125. {
  126. NET_DVR_JPEGPARA IpJpegPara2;
  127. IpJpegPara2.wPicQuality=0;
  128. IpJpegPara2.wPicSize=0xff;
  129. // QDateTime current_date_time =QDateTime::currentDateTime();
  130. // QString current_date =current_date_time.toString("yyyy-MM-dd_hh-mm-ss_zzz");
  131. // current_date="D:\\Picture\\"+current_date+".jpg";//保存地址,要事先设置好文件夹
  132. char* fileName;
  133. QByteArray ba = qstrfilename.toLatin1(); // must
  134. fileName=ba.data();
  135. if(NET_DVR_CaptureJPEGPicture(userid,1,&IpJpegPara2,fileName)==false)
  136. {
  137. qDebug() << "NET_DVR_CaptureJPEGPicture error;" << "error number is " << NET_DVR_GetLastError();
  138. return;
  139. }
  140. qDebug() <<"Capture Success!"<<endl;
  141. }
  142. ((hkcamera*)pUser)->PostFileWithlicense(qstrfilename, strdevip, sLicense);
  143. }
  144. void CALLBACK cbMessageCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
  145. {
  146. int i = 0;
  147. switch (lCommand)
  148. {
  149. case COMM_ALARM_RULE: //异常行为识别报警信息 COMM_ALARM_V30
  150. case COMM_ALARM_V30:
  151. {
  152. intrusiondetecproc( pAlarmer, pAlarmInfo, dwBufLen, pUser);
  153. break;
  154. }
  155. case COMM_UPLOAD_PLATE_RESULT:
  156. {
  157. licenseplatedetecproc(pAlarmer, pAlarmInfo, dwBufLen, pUser);
  158. }
  159. default:
  160. {
  161. // printf("其他报警,报警信息类型: 0x%x\n", lCommand);
  162. std::cout << "其他报警,报警信息类型: " <<lCommand ;
  163. break;
  164. }
  165. }
  166. return;
  167. }
  168. hkcamera::hkcamera(QObject *parent) : QObject(parent)
  169. {
  170. /*注:多台设备对接时也只需要调用一次设置一个回调函数,不支持不同设备的事件在不同的回调函数里面返回*/
  171. //NET_DVR_SetDVRMessageCallBack_V50(0, cbMessageCallback, NULL);
  172. // NET_DVR_SetDVRMessageCallBack_V30(cbMessageCallback, this);
  173. }
  174. QStringList hkcamera:: getallcameralocations()
  175. {
  176. QStringList list;
  177. for (const QString &key : camerainfomap.keys())
  178. {
  179. list.append(key);
  180. }
  181. return list;
  182. }
  183. void hkcamera:: inicamera(QByteArray jsonData)
  184. {
  185. // QFile file("D:/sxkyprjinfo/cfg/sxkyprj.cfg");//.cfg为文本文件
  186. // QByteArray jsonData;
  187. // if(file.open(QIODevice::ReadOnly)){
  188. // jsonData = file.readAll();
  189. // file.close();
  190. // }
  191. // else {
  192. // }
  193. QJsonDocument jsonDocu = QJsonDocument::fromJson(jsonData);
  194. if(jsonDocu.isObject()){
  195. QJsonObject objroot = jsonDocu.object();
  196. QJsonValue cameracfgvalue = objroot.value("cameracfg");
  197. if(cameracfgvalue.isArray()){
  198. QJsonArray cameracfgarray = cameracfgvalue.toArray();
  199. for(int i = 0; i < cameracfgarray.count(); ++i){
  200. QJsonObject cameracfgobj = cameracfgarray.at(i).toObject();
  201. QJsonObject *pcamerainfoobj = new QJsonObject(cameracfgobj);
  202. camerainfomap.insert(cameracfgobj.value("location").toString(), *pcamerainfoobj);
  203. QString ip;
  204. int port;
  205. QString account;
  206. QString password;
  207. int function;
  208. ip = cameracfgobj.value("ip").toString();
  209. port = cameracfgobj.value("port").toInt();
  210. account = cameracfgobj.value("account").toString();
  211. password = cameracfgobj.value("password").toString();
  212. function = cameracfgobj.value("function").toInt();
  213. LONG userid = connect( ip, port, account, password, function);
  214. camerauseridmap.insert(ip, userid);
  215. }
  216. }
  217. QJsonValue cameramatchvalue = objroot.value("cameramatch");
  218. if(cameramatchvalue.isArray()){
  219. QJsonArray cameramatcharray = cameramatchvalue.toArray();
  220. for(int i = 0; i < cameramatcharray.count(); ++i){
  221. QJsonObject cameramatchobj = cameramatcharray.at(i).toObject();
  222. QStringList keys = cameramatchobj.keys();
  223. for(QString key : keys){
  224. cameramatchmap.insert(key, cameramatchobj.value(key).toString());
  225. }
  226. }
  227. }
  228. }
  229. }
  230. BOOL hkcamera::savepic(QString filename)
  231. {
  232. if(-1 == m_playhandle)
  233. {
  234. return false;
  235. }
  236. QString capImagePath = filename;
  237. QDir m_capImagePath(capImagePath);
  238. if (m_capImagePath.exists())
  239. {
  240. QFile::remove(capImagePath);
  241. }
  242. char* savefilename;
  243. QByteArray bytefilename = filename.toLatin1();
  244. savefilename = bytefilename.data();
  245. //保存为jpg格式
  246. NET_DVR_SetCapturePictureMode(JPEG_MODE);
  247. bool pic_status = NET_DVR_CapturePicture(m_playhandle, savefilename);
  248. if (pic_status)
  249. {
  250. std::cout << "camera_SavePicture save pic :" << savefilename << "success";
  251. }
  252. else
  253. {
  254. std::cout << "camera_SavePicture save pic :" << savefilename << "false";
  255. }
  256. return pic_status;
  257. }
  258. LONG hkcamera::connect(QString ip, int port, QString name, QString password, int function)
  259. {
  260. char* ch_ip;
  261. char* ch_name;
  262. char* ch_password;
  263. QByteArray ba_ip = ip.toLatin1();
  264. QByteArray ba_name = name.toLatin1();
  265. QByteArray ba_password = password.toLatin1();
  266. ch_ip = ba_ip.data();
  267. ch_name = ba_name.data();
  268. ch_password = ba_password.data();
  269. //初始化SDK
  270. bool isok = NET_DVR_Init();
  271. if (isok == false)
  272. {
  273. std::cout << "NET_DVR_Init error;error number is " << NET_DVR_GetLastError();
  274. return false;
  275. }
  276. //设置连接时间与重连时间
  277. NET_DVR_SetConnectTime(2000, 1);
  278. NET_DVR_SetReconnect(10000, true);
  279. //登录参数,包括设备地址、登录用户、密码等
  280. NET_DVR_USER_LOGIN_INFO struLoginInfo = { 0 };
  281. struLoginInfo.bUseAsynLogin = 0; //同步登录方式
  282. strcpy(struLoginInfo.sDeviceAddress, ch_ip); //设备IP地址
  283. struLoginInfo.wPort = 8000; //设备服务端口
  284. strcpy(struLoginInfo.sUserName, ch_name); //设备登录用户名
  285. strcpy(struLoginInfo.sPassword, ch_password); //设备登录密码
  286. //设备信息, 输出参数
  287. NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = { 0 };
  288. long lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
  289. if (lUserID < 0)
  290. {
  291. std::cout << "NET_DVR_Login error;" << "error number is " << NET_DVR_GetLastError();
  292. printf("Login failed, error code: %d\n", NET_DVR_GetLastError());
  293. NET_DVR_Cleanup();
  294. return lUserID;
  295. }
  296. if(0 == function){
  297. return lUserID;
  298. }
  299. //能力集
  300. // NET_DVR_SNAP_ABILITY struDecoderCapability;
  301. // BOOL babb = NET_DVR_GetDeviceAbility(lUserID,SNAPCAMERA_ABILITY,nullptr,0,(char *)&struDecoderCapability, sizeof(struDecoderCapability));
  302. // DWORD dwerror = NET_DVR_GetLastError();
  303. //设置报警回调函数
  304. // /*注:多台设备对接时也只需要调用一次设置一个回调函数,不支持不同设备的事件在不同的回调函数里面返回*/
  305. // //NET_DVR_SetDVRMessageCallBack_V50(0, cbMessageCallback, NULL);
  306. NET_DVR_SetDVRMessageCallBack_V30(cbMessageCallback, this);
  307. //启用布防
  308. LONG lHandle;
  309. NET_DVR_SETUPALARM_PARAM struAlarmParam = { 0 };
  310. struAlarmParam.dwSize = sizeof(struAlarmParam);
  311. //struSetupParam.dwSize = sizeof(NET_DVR_SETUPALARM_PARAM);
  312. //上传报警信息类型:0-老报警信息(NET_DVR_PLATE_RESULT), 1-新报警信息(NET_ITS_PLATE_RESULT)
  313. struAlarmParam.byAlarmInfoType = 1;
  314. struAlarmParam.byLevel = 1;//布防优先级:0- 一等级(高),1- 二等级(中),2- 三等级(低)
  315. //bySupport 按位表示,值:0 - 上传,1 - 不上传; bit0 - 表示二级布防是否上传图片;
  316. //其他报警布防参数不需要设置,不支持
  317. //lHandle = NET_DVR_SetupAlarmChan_V41(lUserID, &struAlarmParam);
  318. lHandle = NET_DVR_SetupAlarmChan_V30(lUserID);
  319. if (lHandle < 0)
  320. {
  321. printf("NET_DVR_SetupAlarmChan_V41 error, %d\n", NET_DVR_GetLastError());
  322. NET_DVR_Logout(lUserID);
  323. NET_DVR_Cleanup();
  324. }
  325. std::cout << "Login userID:" << lUserID;
  326. m_userid = lUserID;
  327. return lUserID;
  328. }
  329. BOOL hkcamera::displaypic(HWND hWnd)
  330. {
  331. NET_DVR_PREVIEWINFO struPlayInfo = { 0 }; //初始化
  332. struPlayInfo.hPlayWnd = hWnd;//需要 SDK 解码时句柄设为有效值,仅取流不解码时可设为空
  333. struPlayInfo.lChannel = 1;//预览通道号
  334. struPlayInfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
  335. struPlayInfo.dwLinkMode = 0;//0- TCP 方式,1- UDP 方式,2- 多播方式,3- RTP 方式,4-RTP/RTSP,5-RSTP/HTTP
  336. struPlayInfo.bBlocked = 1;//0- 非阻塞取流,1- 阻塞取流
  337. LONG IRealPlayHandle = NET_DVR_RealPlay_V40(m_userid, &struPlayInfo, NULL, NULL);
  338. if (IRealPlayHandle < 0)
  339. {
  340. std::cout << "NET_DVR_RealPlay_V40 error;error number " << NET_DVR_GetLastError();
  341. NET_DVR_Logout(m_userid);
  342. m_playhandle = IRealPlayHandle;
  343. return false;
  344. }
  345. else
  346. {
  347. m_playhandle = IRealPlayHandle;
  348. return true;
  349. }
  350. }
  351. void hkcamera::stopdisplaypic()
  352. {
  353. NET_DVR_StopRealPlay(m_playhandle);
  354. return;
  355. }
  356. QJsonObject hkcamera:: PostRequestWithFile(QString filePath, QString devip, int eventtype )
  357. {
  358. QJsonObject qjsonret;
  359. //生成对应的网址请求
  360. QFileInfo fileInfo(filePath);
  361. QString fileName =fileInfo.fileName();
  362. QFile* inputFile = new QFile(filePath);
  363. inputFile->open(QIODevice::ReadOnly);
  364. //multipart请求
  365. QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
  366. //文件块
  367. QHttpPart filePart;
  368. filePart.setHeader(QNetworkRequest::ContentDispositionHeader,
  369. QVariant(QString("form-data; name=\"file\";filename=\"%1\"").arg(fileName)));
  370. filePart.setBodyDevice(inputFile);
  371. inputFile->setParent(multiPart);
  372. multiPart->append(filePart);
  373. QHttpPart paramer1Part;
  374. paramer1Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"devip\""));
  375. paramer1Part.setBody(devip.toUtf8());
  376. multiPart->append(paramer1Part);
  377. QHttpPart paramer2Part;
  378. paramer2Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"eventtype\""));
  379. QString streventtype = QString::number(eventtype);
  380. paramer2Part.setBody(streventtype.toUtf8());
  381. multiPart->append(paramer2Part);
  382. //生成对应的网址请求
  383. QNetworkRequest request;
  384. QString scheme = "http";
  385. //QString serverAddr = "192.168.3.5";
  386. QString serverAddr = "39.104.63.156";
  387. QString port = "1688";
  388. QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
  389. QString fullRequest = requestHeader + "/goaf/sensordata/uploadHikFile";
  390. request.setUrl(QUrl(fullRequest));
  391. //发送请求
  392. QNetworkAccessManager manager;
  393. QNetworkReply *reply = manager.post(request,multiPart);
  394. multiPart->setParent(reply);
  395. QEventLoop eventLoop;
  396. QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),&eventLoop, SLOT(quit()));
  397. eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
  398. if(reply->error() != QNetworkReply::NoError)
  399. {
  400. qjsonret.insert("code", reply->error());
  401. return qjsonret;
  402. }
  403. //解析返回的Json结果
  404. QByteArray replyData = reply->readAll();
  405. QJsonParseError json_error;
  406. QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
  407. if(json_error.error != QJsonParseError::NoError)
  408. {
  409. qjsonret.insert("code", -1);
  410. return qjsonret;
  411. }
  412. QJsonObject rootObj = jsonDoc.object();
  413. //QString codeStr = rootObj.value("code").toString();
  414. if(rootObj.value("code") == 0)
  415. {
  416. QJsonValue rootdata = rootObj.value("data");
  417. QJsonObject datobj = rootdata.toObject();
  418. QString codeStr = datobj.value("fileUrl").toString();
  419. qjsonret.insert("code", 0);
  420. qjsonret.insert("fileUrl", codeStr);
  421. return qjsonret;
  422. }
  423. else
  424. {
  425. //请求失败对对应的处理
  426. qjsonret.insert("code", 1);
  427. return qjsonret;
  428. }
  429. }
  430. void hkcamera:: PostFileWithlicense(QString filePath, QString devip, QString slicense )
  431. {
  432. QJsonObject qjsonret;
  433. //生成对应的网址请求
  434. QFileInfo fileInfo(filePath);
  435. QString fileName =fileInfo.fileName();
  436. QFile* inputFile = new QFile(filePath);
  437. inputFile->open(QIODevice::ReadOnly);
  438. //multipart请求
  439. QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
  440. //文件块
  441. QHttpPart filePart;
  442. filePart.setHeader(QNetworkRequest::ContentDispositionHeader,
  443. QVariant(QString("form-data; name=\"file\";filename=\"%1\"").arg(fileName)));
  444. filePart.setBodyDevice(inputFile);
  445. inputFile->setParent(multiPart);
  446. multiPart->append(filePart);
  447. QHttpPart paramer1Part;
  448. paramer1Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"devip\""));
  449. paramer1Part.setBody(devip.toUtf8());
  450. multiPart->append(paramer1Part);
  451. QHttpPart paramer2Part;
  452. paramer2Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"license\""));
  453. paramer2Part.setBody(slicense.toUtf8());
  454. multiPart->append(paramer2Part);
  455. QHttpPart paramer3Part;
  456. QString ocid = "406283";
  457. paramer3Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"ocid\""));
  458. paramer3Part.setBody(ocid.toUtf8());
  459. multiPart->append(paramer3Part);
  460. //生成对应的网址请求
  461. QNetworkRequest request;
  462. QString scheme = "http";
  463. // QString serverAddr = "192.168.3.5";
  464. QString serverAddr = "39.104.63.156";
  465. QString port = "1888";
  466. QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
  467. QString fullRequest = requestHeader + "/trans/allinfo/uploadHikFile";
  468. request.setUrl(QUrl(fullRequest));
  469. //发送请求
  470. QNetworkAccessManager manager;
  471. QNetworkReply *reply = manager.post(request,multiPart);
  472. multiPart->setParent(reply);
  473. QEventLoop eventLoop;
  474. QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),&eventLoop, SLOT(quit()));
  475. eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
  476. if(reply->error() != QNetworkReply::NoError)
  477. {
  478. qjsonret.insert("code", reply->error());
  479. return ;
  480. }
  481. //解析返回的Json结果
  482. QByteArray replyData = reply->readAll();
  483. QJsonParseError json_error;
  484. QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
  485. if(json_error.error != QJsonParseError::NoError)
  486. {
  487. qjsonret.insert("code", -1);
  488. return ;
  489. }
  490. QJsonObject rootObj = jsonDoc.object();
  491. //QString codeStr = rootObj.value("code").toString();
  492. if(rootObj.value("code") == 0)
  493. {
  494. QJsonValue rootdata = rootObj.value("data");
  495. QJsonObject datobj = rootdata.toObject();
  496. QString codeStr = datobj.value("fileUrl").toString();
  497. qjsonret.insert("code", 0);
  498. qjsonret.insert("fileUrl", codeStr);
  499. return ;
  500. }
  501. else
  502. {
  503. //请求失败对对应的处理
  504. qjsonret.insert("code", 1);
  505. return ;
  506. }
  507. }
  508. void hkcamera::logout()
  509. {
  510. if(0 != m_userid)
  511. {
  512. NET_DVR_Logout(m_userid);
  513. m_userid = 0;
  514. m_playhandle = -1;
  515. }
  516. }