wangzhengquan
2020-06-08 f48e2e378bacffb96cb5575876a7b2f0081de0be
update
1个文件已添加
5个文件已修改
330 ■■■■■ 已修改文件
netdisk/hcnetdisk.c 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
netdisk/include/hcnetdisk.h 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
netdisk/include/netdisk.h 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
netdisk/test 补丁 | 查看 | 原始文档 | blame | 历史
netdisk/test.c 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/test_static.c 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
netdisk/hcnetdisk.c
@@ -1,12 +1,18 @@
#include "netdisk.h"
#include "hcnetdisk.h"
 
bool HCNetdisk::envInited = false;
void HCNetdisk::netdisk_init(HCNetdisk_EnvConfig &config){
    if (&config != NULL && config.libpath.length() != 0) {
/**
 * 设备初始化
 */
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文件夹所在的路径
      sprintf(struComPath.sPath, "%s", config->libpath.c_str()); //HCNetSDKCom文件夹所在的路径
      NET_DVR_SetSDKInitCfg(NET_SDK_INIT_CFG_SDK_PATH, &struComPath);
    }
@@ -16,7 +22,102 @@
    //设置连接时间与重连时间
    NET_DVR_SetConnectTime(2000, 1);
    NET_DVR_SetReconnect(10000, true);
    envInited = true;
}
void HCNetdisk::netdisk_deinit() {
    if (!envInited) {
        return;
    }
    NET_DVR_Cleanup();
    envInited = false;
}
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);
  if (lUserID < 0)
  {
    printf("Login error, %d\n", NET_DVR_GetLastError());
    NET_DVR_Cleanup();
    return -1;
  }
  printf("lUserID = %ld\n", lUserID);
  userid = lUserID;
  username = loginInfo.username;
  password = loginInfo.password;
  host = loginInfo.host;
  port = loginInfo.port;
  startChannel = struDeviceInfo.struDeviceV30.byStartDChan;
  maxChannels = struDeviceInfo.struDeviceV30.byIPChanNum + struDeviceInfo.struDeviceV30.byHighDChanNum * 256;
  return 0;
}
int HCNetdisk::logout() {
    //注销用户
    NET_DVR_Logout(userid);
    userid = -1;
    return 0;
}
int HCNetdisk::downloadByTime(Netdisk_DownloadRequest &request, std::vector<std::string> *files) {
    struct tm start, end;
    char destfile[1024];
    int i = 0;
    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(),
            devicename.c_str(),
             request.channel,
             mktime(&start),
             i);
        // printf("%s\n", destfile);
        downloadByTime_wrapper(userid, request.channel, &start, &end, destfile);
        if(files != NULL) {
            files->push_back(destfile);
        }
        start = end;
        i++;
    }
    return 0;
}
HCNetdisk::~HCNetdisk() { }
/**
 * @return success: 0, failture : -1
@@ -150,77 +251,3 @@
  }
}
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);
  if (lUserID < 0)
  {
    printf("Login error, %d\n", NET_DVR_GetLastError());
    NET_DVR_Cleanup();
    return -1;
  }
  // printf("lUserID = %ld\n", lUserID);
  userid = lUserID;
  username = loginInfo.username;
  password = loginInfo.password;
  host = loginInfo.host;
  port = loginInfo.port;
  return 0;
}
int HCNetdisk::logout() {
    //注销用户
    NET_DVR_Logout(userid);
    //释放 SDK 资源
    NET_DVR_Cleanup();
    userid = -1;
    return 0;
}
int HCNetdisk::downloadByTime(Netdisk_DownloadRequest &request) {
    struct tm start, end;
    char destfile[1024];
    int i = 0;
    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(),
            devicename.c_str(),
             request.channel,
             mktime(&start),
             i);
        // printf("%s\n", destfile);
        downloadByTime_wrapper(userid, request.channel, &start, &end, destfile);
        start = end;
        i++;
    }
    return 0;
}
netdisk/include/hcnetdisk.h
@@ -6,34 +6,29 @@
#include "HCNetSDK.h"
#include "netdisk.h"
//海康网络硬盘
class HCNetdisk : public Netdisk{
class HCNetdisk {
    std::string devicename;
    long userid;
    std::string username;
    std::string password;
    std::string host;
    int port;
private:
    int downloadByTime_wrapper(long userid, int channel, struct tm *start, struct tm *end, char *destfile);
    int saveRecordFile(int userId, char * srcfile, char * destfile);
public:
    HCNetdisk(const std::string &_devicename): devicename(_devicename) {}
    static bool envInited ;
    HCNetdisk(const std::string &_devicename = "HC"): Netdisk(_devicename) {}
    ~HCNetdisk() {}
    virtual ~HCNetdisk();
    static void netdisk_init(HCNetdisk_EnvConfig &config);
    virtual int login(Netdisk_LoginInfo &loginInfo);
    int login(Netdisk_LoginInfo &loginInfo);
    virtual int logout();
    int logout();
    virtual int downloadByTime(Netdisk_DownloadRequest &request, std::vector<std::string> *files);
    int downloadByTime(Netdisk_DownloadRequest &request);
    static void netdisk_init(Netdisk_EnvConfig *config);
    static void netdisk_deinit();
};
 
netdisk/include/netdisk.h
@@ -25,30 +25,36 @@
 
// 网络硬盘 抽象类
class Netdisk {
protected:
    std::string devicename;
    std::string devicename; //设备名称
    int startChannel;       //起始通道号
    int maxChannels;        //最大通道数
    long userid;
    std::string username;
    std::string password;
    std::string host;
    int port;
    long userid;            //用户id
    std::string username;   //用户名
    std::string password;   //密码
    std::string host;       //ip
    int port;               //端口
   
public:
    HCNetdisk(const std::string &_devicename): devicename(_devicename) {}
    Netdisk(const std::string &_devicename): devicename(_devicename) {}
    ~HCNetdisk() {}
    virtual ~Netdisk() {}
    static void netdisk_init(HCNetdisk_EnvConfig &config);
    int login(Netdisk_LoginInfo &loginInfo);
    virtual int login(Netdisk_LoginInfo &loginInfo) = 0;
    int logout();
    virtual int logout() = 0;
    int downloadByTime(Netdisk_DownloadRequest &request);
    virtual int downloadByTime(Netdisk_DownloadRequest &request, std::vector<std::string> *files) = 0;
    int getStartChannel() {return startChannel;}
    int getMaxChannels() {return maxChannels;}
};
#endif
netdisk/test
Binary files differ
netdisk/test.c
@@ -2,14 +2,12 @@
#include "netdisk.h"
#include "hcnetdisk.h"
int main() {
    HCNetdisk_EnvConfig config;
    config.libpath = "../hclib/";
    HCNetdisk::netdisk_init(config);
    HCNetdisk *netdisk = new HCNetdisk("海康");
    //Netdisk *netdisk = dhnetdisk_new();
void test1() {
    Netdisk *netdisk = new HCNetdisk("海康");
    //登录
    Netdisk_LoginInfo loginInfo;
@@ -19,6 +17,7 @@
    loginInfo.password = "a1234567";
    netdisk->login(loginInfo);
    std::cout << "起始通道:" << netdisk->getStartChannel() << ", 最大通道号:" << netdisk->getMaxChannels() << std::endl;
    //下载
    Netdisk_DownloadRequest request;
    request.start.tm_year = 2020-1900; // 这个时间类型从1900开始算作第一年
@@ -38,15 +37,46 @@
    request.channel = 1;
    request.destpath = "/home/basic/data/Downloads/test";
    if (netdisk->downloadByTime(request) != 0) {
    std::vector<std::string> files;
    if (netdisk->downloadByTime(request, &files) != 0) {
        printf("下载失败\n");
    } else {
         for(auto f : files) {
            std::cout << f << '\n';
        }
    }
    netdisk->logout();
}
void test2() {
     
    HCNetdisk netdisk("海康");
    //Netdisk *netdisk = dhnetdisk_new();
     
    //登录
    Netdisk_LoginInfo loginInfo;
    loginInfo.host = "192.168.20.11";
    loginInfo.port = 8000;
    loginInfo.username = "admin";
    loginInfo.password = "a1234567";
    netdisk.login(loginInfo);
    std::cout << "起始通道:" << netdisk.getStartChannel() << ", 最大通道号:" << netdisk.getMaxChannels() << std::endl;
}
int main() {
    Netdisk_EnvConfig config;
    config.libpath = "../hclib/";
    HCNetdisk::netdisk_init(&config);
    test1();
    // test2();
    HCNetdisk::netdisk_deinit();
}
test/test_static.c
New file
@@ -0,0 +1,40 @@
#include <iostream>
using namespace std;
class Box {
   public:
      static int objectCount;
      // Constructor definition
      Box(double l = 2.0, double b = 2.0, double h = 2.0) {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
         // Increase every time object is created
         objectCount++;
      }
      double Volume() {
         return length * breadth * height;
      }
   private:
      double length;     // Length of a box
      double breadth;    // Breadth of a box
      double height;     // Height of a box
};
// Initialize static member of class Box
int Box::objectCount = 0;
int main(void) {
   Box Box1(3.3, 1.2, 1.5);    // Declare box1
   Box Box2(8.5, 6.0, 2.0);    // Declare box2
   // Print total number of objects.
   cout << "Total objects: " << Box::objectCount << endl;
   return 0;
}