#include "HcRecord.h"
|
#include <cstring>
|
#include <unistd.h>
|
#include <basic/io/io.h>
|
#include <string>
|
#include <iostream>
|
#include <iomanip>
|
#include <sstream>
|
#include <basic/util/app/AppConfig.h>
|
|
int HcRecord::init(const char *ip, unsigned short port, const char *usrname, const char *passwd) {
|
NET_DVR_Init();
|
//设置连接时间与重连时间
|
NET_DVR_SetConnectTime(2000, 1);
|
NET_DVR_SetReconnect(10000, true);
|
|
NET_DVR_USER_LOGIN_INFO struLoginInfo = {0};
|
struLoginInfo.bUseAsynLogin = 0; //同步登录方式
|
strcpy(struLoginInfo.sDeviceAddress, ip); //设备IP地址
|
struLoginInfo.wPort = port; //设备服务端口
|
strcpy(struLoginInfo.sUserName, usrname); //设备登录用户名
|
strcpy(struLoginInfo.sPassword, passwd); //设备登录密码
|
|
//设备信息, 输出参数
|
NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0};
|
|
m_lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
|
if (m_lUserID < 0) {
|
// printf("Login failed, error code: %d\n", NET_DVR_GetLastError());
|
NET_DVR_Cleanup();
|
return -1;
|
}
|
devSerialNumber = (char *) struDeviceInfoV40.struDeviceV30.sSerialNumber;
|
UsefulChans();
|
return 0;
|
}
|
|
int HcRecord::unInit() {
|
//注销用户
|
NET_DVR_Logout(m_lUserID);
|
//释放SDK资源
|
NET_DVR_Cleanup();
|
return 0;
|
}
|
|
int HcRecord::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);
|
usleep(5000); //millisecond
|
}
|
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;
|
}
|
}
|
|
std::vector<int> HcRecord::getUsefulChans() const {
|
return m_vecUsefulChans;
|
}
|
|
std::string HcRecord::getSerialNumber() const {
|
return devSerialNumber;
|
}
|
|
void HcRecord::UsefulChans() {
|
m_vecUsefulChans.clear();
|
NET_DVR_IPPARACFG_V40 ipOut;
|
long len;
|
BOOL bret = NET_DVR_GetDVRConfig(m_lUserID, NET_DVR_GET_IPPARACFG_V40, 33, &ipOut, sizeof(NET_DVR_IPPARACFG_V40),
|
(LPDWORD) &len);
|
NET_DVR_PICCFG_V40 picOut;
|
bret = NET_DVR_GetDVRConfig(m_lUserID, NET_DVR_GET_PICCFG_V40, 33, &picOut, sizeof(NET_DVR_PICCFG_V40),
|
(LPDWORD) &len);
|
DWORD dErr = NET_DVR_GetLastError();
|
|
BYTE byIPID, byIPIDHigh;
|
int iDevInfoIndex, iGroupNO;
|
|
|
for (int i = 0; i < ipOut.dwDChanNum; i++) {
|
switch (ipOut.struStreamMode[i].byGetStreamType) {
|
case 0: //直接从设备取流
|
if (ipOut.struStreamMode[i].uGetStream.struChanInfo.byEnable) {
|
byIPID = ipOut.struStreamMode[i].uGetStream.struChanInfo.byIPID;
|
byIPIDHigh = ipOut.struStreamMode[i].uGetStream.struChanInfo.byIPIDHigh;
|
iDevInfoIndex = byIPIDHigh * 256 + byIPID - 1 - iGroupNO * 64;
|
printf("IP channel no.%d is online, IP: %s\n", i + 1,
|
ipOut.struIPDevInfo[iDevInfoIndex].struIP.sIpV4);
|
m_vecUsefulChans.push_back(i + 33);
|
}
|
break;
|
case 1: //从流媒体取流
|
if (ipOut.struStreamMode[i].uGetStream.struPUStream.struStreamMediaSvrCfg.byValid) {
|
printf("IP channel %d connected with the IP device by stream server.\n", i + 1);
|
printf("IP of stream server: %s, IP of IP device: %s\n", ipOut.struStreamMode[i].uGetStream.\
|
struPUStream.struStreamMediaSvrCfg.struDevIP.sIpV4, ipOut.struStreamMode[i].uGetStream.\
|
struPUStream.struDevChanInfo.struIP.sIpV4);
|
}
|
break;
|
default:
|
break;
|
}
|
}
|
}
|
|
std::string HcRecord::makeDirs(const std::string &strDevID, const int nChannel, const LPNET_DVR_TIME pStartTime,
|
const LPNET_DVR_TIME pEndTime) {
|
auto cutpath = appConfig.getStringProperty("cutPath");
|
if (cutpath.back() != '/') {
|
cutpath.append("/");
|
}
|
auto loadPath = appConfig.getStringProperty("loadPath");
|
if (loadPath.back() != '/') {
|
loadPath.append("/");
|
}
|
makeDir(cutpath, strDevID, nChannel, pStartTime, pEndTime);
|
return makeDir(loadPath, strDevID, nChannel, pStartTime, pEndTime);
|
}
|
|
std::string HcRecord::makeDir(const std::string &strType, const std::string &strDevID, const int nChannel,
|
const LPNET_DVR_TIME pStartTime,
|
const LPNET_DVR_TIME pEndTime) {
|
// char szPath[MAX_PATH] = {0};
|
// getcwd(szPath, MAX_PATH);
|
// std::string strFinalPath(szPath);
|
std::string strFinalPath = strType;
|
if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str());
|
strFinalPath = strFinalPath + "/" + strDevID;
|
if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str());
|
strFinalPath = strFinalPath + "/" + toString(nChannel);
|
if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str());
|
strFinalPath = strFinalPath + "/" + std::to_string(pStartTime->dwYear) + toString(pStartTime->dwMonth);
|
if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str());
|
strFinalPath = strFinalPath + "/" + toString(pStartTime->dwDay);
|
if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str());
|
strFinalPath = strFinalPath + "/" + strDevID + "-" + toString(nChannel) + "-" +
|
std::to_string(pStartTime->dwYear) + toString(pStartTime->dwMonth) +
|
toString(pStartTime->dwDay) +
|
toString(pStartTime->dwHour) + toString(pStartTime->dwMinute) +
|
toString(pStartTime->dwSecond);
|
if (!IOOperate::IsFolderExist(strFinalPath.c_str())) IOOperate::MakeDir(strFinalPath.c_str());
|
//2018-08-08 14:00:00.mp4
|
std::string filepath = strFinalPath + "/" + std::to_string(pStartTime->dwYear) + "-" +
|
toString(pStartTime->dwMonth) + "-" +
|
toString(pStartTime->dwDay) + " " +
|
toString(pStartTime->dwHour) + ":" + toString(pStartTime->dwMinute) + ":" +
|
toString(pStartTime->dwSecond) + ".mp4";
|
return filepath;
|
}
|
|
std::string HcRecord::toString(const int src) {
|
std::stringstream ss;
|
ss << std::setw(2) << std::setfill('0') << src;
|
return ss.str();
|
}
|
|
int HcRecord::downloadfiles(const std::string &strDevID, const int nChannel, const LPNET_DVR_TIME pStartTime,
|
const LPNET_DVR_TIME pEndTime, std::string &filePath) {
|
|
//获取路径
|
filePath = makeDirs(strDevID, nChannel, pStartTime, pEndTime);
|
|
//将时间转化为QDateTime类型,便于时间比较
|
//#todo待优化
|
// string str_StringStartTime(
|
// to_string(pStartTime->dwYear) + "-" + to_string(pStartTime->dwMonth) + "-" + to_string(pStartTime->dwDay) + " "
|
// + to_string(pStartTime->dwHour) + ":" + to_string(pStartTime->dwMinute) + ":" +
|
// to_string(pStartTime->dwSecond));
|
|
char ch_StringStartTime[128];
|
sprintf(ch_StringStartTime, "%04d-%02d-%02d %02d:%02d:%02d", pStartTime->dwYear, pStartTime->dwMonth,
|
pStartTime->dwDay, pStartTime->dwHour, pStartTime->dwMinute, pStartTime->dwSecond);
|
string str_StringStartTime(ch_StringStartTime);
|
|
QDateTime taskStartTime = QDateTime::fromString(QString::fromStdString(str_StringStartTime), "yyyy-MM-dd hh:mm:ss");
|
|
// string str_StringEndTime(
|
// to_string(pEndTime->dwYear) + "-" + to_string(pEndTime->dwMonth) + "-" + to_string(pEndTime->dwDay) + " "
|
// + to_string(pEndTime->dwHour) + ":" + to_string(pEndTime->dwMinute) + ":" + to_string(pEndTime->dwSecond));
|
|
char ch_StringEndTime[128];
|
sprintf(ch_StringEndTime, "%04d-%02d-%02d %02d:%02d:%02d", pEndTime->dwYear, pEndTime->dwMonth, pEndTime->dwDay,
|
pEndTime->dwHour, pEndTime->dwMinute, pEndTime->dwSecond);
|
string str_StringEndTime(ch_StringEndTime);
|
|
QDateTime taskEndTime = QDateTime::fromString(QString::fromStdString(str_StringEndTime), "yyyy-MM-dd hh:mm:ss");
|
//时间转化-------------end----------------------
|
|
//递归,将时间按照15min分割,若最后小于15min,则按剩余时间录制并结束递归
|
RecursiveByTimeDownloadfiles(strDevID, nChannel, taskStartTime, taskEndTime, filePath);
|
|
return 0;
|
}
|
|
int
|
HcRecord::RecursiveByTimeDownloadfiles(const std::string &strDevID, const int nChannel, QDateTime pStartTime,
|
QDateTime pEndTime, std::string &filePath) {
|
|
NET_DVR_TIME startTime;
|
startTime.dwYear = pStartTime.date().year();
|
startTime.dwMonth = pStartTime.date().month();
|
startTime.dwDay = pStartTime.date().day();
|
startTime.dwHour = pStartTime.time().hour();
|
startTime.dwMinute = pStartTime.time().minute();
|
startTime.dwSecond = pStartTime.time().second();
|
|
std::string tmp_filepath = std::to_string(startTime.dwYear) + "-" + toString(startTime.dwMonth) + "-" +
|
toString(startTime.dwDay) + " " + toString(startTime.dwHour) + ":" +
|
toString(startTime.dwMinute) + ":" + toString(startTime.dwSecond) + ".mp4";
|
auto pos = filePath.rfind("/");
|
|
// cout << filePath << endl;
|
|
filePath.replace(pos+1, filePath.size() - pos, tmp_filepath);
|
|
// cout << filePath << endl;
|
|
QDateTime tmp_EndTime = pStartTime.addSecs(1 * 60 * 15);
|
if (tmp_EndTime < pEndTime) {
|
NET_DVR_TIME endTime;
|
endTime.dwYear = tmp_EndTime.date().year();
|
endTime.dwMonth = tmp_EndTime.date().month();
|
endTime.dwDay = tmp_EndTime.date().day();
|
endTime.dwHour = tmp_EndTime.time().hour();
|
endTime.dwMinute = tmp_EndTime.time().minute();
|
endTime.dwSecond = tmp_EndTime.time().second();
|
|
|
Downloadfile(strDevID, nChannel, &startTime, &endTime, filePath);
|
|
RecursiveByTimeDownloadfiles(strDevID, nChannel, tmp_EndTime, pEndTime, filePath);
|
} else {
|
|
NET_DVR_TIME endTime;
|
endTime.dwYear = pEndTime.date().year();
|
endTime.dwMonth = pEndTime.date().month();
|
endTime.dwDay = pEndTime.date().day();
|
endTime.dwHour = pEndTime.time().hour();
|
endTime.dwMinute = pEndTime.time().minute();
|
endTime.dwSecond = pEndTime.time().second();
|
|
Downloadfile(strDevID, nChannel, &startTime, &endTime, filePath);
|
return 0;
|
}
|
}
|
|
int
|
HcRecord::Downloadfile(const std::string &strDevID, const int nChannel, const LPNET_DVR_TIME pStartTime,
|
const LPNET_DVR_TIME pEndTime, std::string &filePath) {
|
// NET_DVR_TIME startTime;
|
// startTime.dwYear = pStartTime.date().year();
|
// startTime.dwMonth = pStartTime.date().month();
|
// startTime.dwDay = pStartTime.date().day();
|
// startTime.dwHour = pStartTime.time().hour();
|
// startTime.dwMinute = pStartTime.time().minute();
|
// startTime.dwSecond = pStartTime.time().second();
|
//
|
// NET_DVR_TIME endTime;
|
// endTime.dwYear = pEndTime.date().year();
|
// endTime.dwMonth = pEndTime.date().month();
|
// endTime.dwDay = pEndTime.date().day();
|
// endTime.dwHour = pEndTime.time().hour();
|
// endTime.dwMinute = pEndTime.time().minute();
|
// endTime.dwSecond = pEndTime.time().second();
|
|
|
NET_DVR_PLAYCOND struDownloadCond = {0};
|
struDownloadCond.dwChannel = nChannel;
|
|
struDownloadCond.struStartTime.dwYear = pStartTime->dwYear;
|
struDownloadCond.struStartTime.dwMonth = pStartTime->dwMonth;
|
struDownloadCond.struStartTime.dwDay = pStartTime->dwDay;
|
struDownloadCond.struStartTime.dwHour = pStartTime->dwHour;
|
struDownloadCond.struStartTime.dwMinute = pStartTime->dwMinute;
|
struDownloadCond.struStartTime.dwSecond = pStartTime->dwSecond;
|
|
struDownloadCond.struStopTime.dwYear = pEndTime->dwYear;
|
struDownloadCond.struStopTime.dwMonth = pEndTime->dwMonth;
|
struDownloadCond.struStopTime.dwDay = pEndTime->dwDay;
|
struDownloadCond.struStopTime.dwHour = pEndTime->dwHour;
|
struDownloadCond.struStopTime.dwMinute = pEndTime->dwMinute;
|
struDownloadCond.struStopTime.dwSecond = pEndTime->dwSecond;
|
|
// filePath = makeDirs(strDevID, nChannel, pStartTime, pEndTime);
|
|
|
|
//std::cout << filePath << std::endl;
|
|
//---------------------------------------
|
//按时间下载
|
int hPlayback;
|
hPlayback = NET_DVR_GetFileByTime_V40(m_lUserID, (char *) filePath.c_str(), &struDownloadCond);
|
if (hPlayback < 0) {
|
printf("NET_DVR_GetFileByTime_V40 fail,last error %d\n", NET_DVR_GetLastError());
|
NET_DVR_Logout(m_lUserID);
|
NET_DVR_Cleanup();
|
return -1;
|
}
|
|
//---------------------------------------
|
//开始下载
|
if (!NET_DVR_PlayBackControl_V40(hPlayback, NET_DVR_PLAYSTART, NULL, 0, NULL, NULL)) {
|
printf("Play back control failed [%d]\n", NET_DVR_GetLastError());
|
NET_DVR_Logout(m_lUserID);
|
NET_DVR_Cleanup();
|
return -1;
|
}
|
|
int nPos = 0;
|
for (nPos = 0; nPos < 100 && nPos >= 0; nPos = NET_DVR_GetDownloadPos(hPlayback)) {
|
//printf("Be downloading... %d %%\n",nPos);
|
usleep(5000); //millisecond
|
}
|
if (!NET_DVR_StopGetFile(hPlayback)) {
|
printf("failed to stop get file [%d]\n", NET_DVR_GetLastError());
|
NET_DVR_Logout(m_lUserID);
|
NET_DVR_Cleanup();
|
return -1;
|
}
|
if (nPos < 0 || nPos > 100) {
|
printf("download err [%d]\n", NET_DVR_GetLastError());
|
NET_DVR_Logout(m_lUserID);
|
NET_DVR_Cleanup();
|
return -1;
|
}
|
//printf("Be downloading... %d %%\n",nPos);
|
return 0;
|
}
|