#include "netdisk.h" bool HCNetdisk::envInited = false; /** * 设备初始化 */ void HCNetdisk::netdisk_init(Netdisk_EnvConfig *config){ if (envInited) { return; } if (config != NULL && config->libpath.length() != 0) { NET_DVR_LOCAL_SDK_PATH struComPath = {0}; sprintf(struComPath.sPath, "%s", config->libpath.c_str()); //HCNetSDKCom文件夹所在的路径 NET_DVR_SetSDKInitCfg(NET_SDK_INIT_CFG_SDK_PATH, &struComPath); } //--------------------------------------- // 初始化 NET_DVR_Init(); //设置连接时间与重连时间 NET_DVR_SetConnectTime(2000, 1); NET_DVR_SetReconnect(10000, true); envInited = true; } void HCNetdisk::netdisk_deinit() { if (!envInited) { return; } NET_DVR_Cleanup(); envInited = false; } HCNetdisk::HCNetdisk(): Netdisk(){ deviceType="HC"; } int HCNetdisk::_login(Netdisk_LoginInfo &loginInfo) { //登录参数,包括设备地址、登录用户、密码等 NET_DVR_USER_LOGIN_INFO struLoginInfo = {0}; struLoginInfo.bUseAsynLogin = 0; //同步登录方式 strcpy(struLoginInfo.sDeviceAddress, loginInfo.host.c_str()); //设备IP地址 struLoginInfo.wPort = loginInfo.port; //设备服务端口 strcpy(struLoginInfo.sUserName, loginInfo.username.c_str()); //设备登录用户名 strcpy(struLoginInfo.sPassword, loginInfo.password.c_str()); //设备登录密码 // 注册设备 LONG lUserID; NET_DVR_DEVICEINFO_V40 struDeviceInfo = {0}; //lUserID = 0; lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfo); printf("lUserID = %d\n", lUserID); if (lUserID < 0) { printf("Login error, %d\n", NET_DVR_GetLastError()); NET_DVR_Cleanup(); return -1; } loginInfo.userid = std::to_string(lUserID); userid = lUserID; username = loginInfo.username; password = loginInfo.password; host = loginInfo.host; port = loginInfo.port; deviceInfo.startChannel = struDeviceInfo.struDeviceV30.byStartDChan; deviceInfo.maxChannels = struDeviceInfo.struDeviceV30.byIPChanNum + struDeviceInfo.struDeviceV30.byHighDChanNum * 256; return 0; } int HCNetdisk::login(Netdisk_LoginInfo &loginInfo) { return _login(loginInfo); //Netdisk::addLoginInfo(loginInfo); } int HCNetdisk::logout() { //注销用户 NET_DVR_Logout(userid); return 0; } int HCNetdisk::downloadByTime(Netdisk_DownloadRequest &request, std::vector *files) { struct tm start, end; char destfile[1024]; int i = 0; // Netdisk_LoginInfo loginInfo = Netdisk::getLoginInfo(request.loginUUID); // _login(loginInfo); start = request.start; while(mktime(&start) < mktime(&(request.end))) { if (difftime(mktime(&(request.end)), mktime(&start)) > 10 * 60) { end = start; end.tm_min += 10; mktime(&end); } else { end = request.end; } // printf("start = %s", asctime(&start)); // printf("end = %s", asctime(&end)); sprintf(destfile, "%s/%s-%d-%ld-%d", request.destpath.c_str(), deviceType.c_str(), request.channel, mktime(&start), i); std::cout << "destfile:" << destfile << std::endl; char *destfiledup = strdup(destfile); if(downloadByTime_wrapper(userid, request.channel, &start, &end, destfiledup) != -1) { if(files != NULL) { // std::cout << "push destfile:" << destfile << std::endl; files->push_back(destfile); } } free(destfiledup); start = end; i++; } return 0; } HCNetdisk::~HCNetdisk() { } /** * @return success: 0, failture : -1 */ int HCNetdisk::downloadByTime_wrapper(const long userid, const int channel, const struct tm *start, const struct tm *end, const char *destfile) { NET_DVR_FILECOND_V40 struFileCond = {0}; struFileCond.dwFileType = 0xFF; //通道号 struFileCond.lChannel = channel; struFileCond.dwIsLocked = 0xFF; struFileCond.dwUseCardNo = 0; struFileCond.struStartTime.dwYear = start->tm_year + 1900; //开始时间 struFileCond.struStartTime.dwMonth = start->tm_mon + 1; struFileCond.struStartTime.dwDay = start->tm_mday; struFileCond.struStartTime.dwHour = start->tm_hour; struFileCond.struStartTime.dwMinute = start->tm_min; struFileCond.struStartTime.dwSecond = start->tm_sec; struFileCond.struStopTime.dwYear = end->tm_year + 1900; //结束时间 struFileCond.struStopTime.dwMonth = end->tm_mon + 1; struFileCond.struStopTime.dwDay = end->tm_mday; struFileCond.struStopTime.dwHour = end->tm_hour; struFileCond.struStopTime.dwMinute = end->tm_min; struFileCond.struStopTime.dwSecond = end->tm_sec; //--------------------------------------- //查找录像文件 int lFindHandle = NET_DVR_FindFile_V40(userid, &struFileCond); if (lFindHandle < 0) { printf("find file fail,last error %d\n", NET_DVR_GetLastError()); return -1; } NET_DVR_FINDDATA_V40 struFileData; while (true) { //逐个获取查找到的文件信息 int result = NET_DVR_FindNextFile_V40(lFindHandle, &struFileData); if (result == NET_DVR_ISFINDING) { continue; } else if (result == NET_DVR_FILE_SUCCESS) //获取文件信息成功 { char strFileName[256] = {0}; if (destfile != NULL) { sprintf(strFileName, "%s", destfile); //char *dir = dirname(strdup(destfile)); char *dir = dirname(const_cast(destfile)); printf("dir === %s\n", dir); if ((mkdir(dir, DIR_MODE) == -1) && (errno != EEXIST)) { err_msg(errno, "hc_downloadByTime mkdir error "); return -1; } } else { sprintf(strFileName, "./%s", struFileData.sFileName); } return saveRecordFile(userid, struFileData.sFileName, strFileName); } else if (result == NET_DVR_FILE_NOFIND || result == NET_DVR_NOMOREFILE) //未查找到文件或者查找结束 { err_msg(0, "can not finding! destfile=%s\n", destfile); break; } else { printf("find file fail for illegal get file state"); break; } } //停止查找 if (lFindHandle >= 0) { NET_DVR_FindClose_V30(lFindHandle); } return -1; } int HCNetdisk::saveRecordFile( int userId, char * srcfile, char * destfile) { int bRes = 1; int hPlayback = 0; //按文件名下载录像 if ( (hPlayback = NET_DVR_GetFileByName(userId, srcfile, destfile)) < 0 ) { printf( "GetFileByName failed. error[%d]\n", NET_DVR_GetLastError()); bRes = -1; return bRes; } //开始下载 if (!NET_DVR_PlayBackControl_V40(hPlayback, NET_DVR_PLAYSTART, NULL, 0, NULL, NULL)) { printf("play back control failed [%d]\n", NET_DVR_GetLastError()); bRes = -1; return bRes; } int nPos = 0; //下载进度 for (nPos = 0; nPos < 100 && nPos >= 0; nPos = NET_DVR_GetDownloadPos(hPlayback)) { printf("Be downloading...%d %%\n", nPos); sleep(1); } // printf("have got %d\n", nPos); //停止下载 if (!NET_DVR_StopGetFile(hPlayback)) { printf("failed to stop get file [%d]\n", NET_DVR_GetLastError()); bRes = -1; return bRes; } // printf("%s\n", srcfile); if (nPos < 0 || nPos > 100) { printf("download err [%d]\n", NET_DVR_GetLastError()); bRes = -1; return bRes; } else { return 0; } }