使用海康SDK获取NVR通道配置信息(含通道名称)

 
一:出发点
在一些视频监控项目中经常需要对挂载在NVR下的摄像头进行配置。
由于这些配置信息在NVR里已经存在,如果能将NVR中的通道配置信息导出,会大大减少前端的配置工作。
网上的通过海康SDK查询NVR通道信息的帖子很多,但是很多都不包含摄像头的通道名称,我在查阅了海康SDK的文档后使用C++实现了对通道名称、用户名、设备IP地址的读取。
现在把实现方式贴出来,希望对有需要的人提供些参考。
 
二:使用方法
 
1.NET_DVR_GetDVRConfig函数

 

2.使用NET_DVR_GET_IPPARACFG参数获取网络连接信息,使用NET_DVR_GET_PICCFG_V30参数获取通道名称。

 

 

 

 
三.主要代码:
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include "HCNetSDK.h"
int main()
{
    NET_DVR_Init();
    //设置连接时间与重连时间
    NET_DVR_SetConnectTime(2000, 1);
    NET_DVR_SetReconnect(10000, true);
    // 注册设备
    LONG lUserID;
    //登录参数,包括设备地址、登录用户、密码等
    NET_DVR_USER_LOGIN_INFO struLoginInfo = { 0 };
    struLoginInfo.bUseAsynLogin = 0; //同步登录方式
    strcpy(struLoginInfo.sDeviceAddress, "192.168.20.106"); //设备IP地址
    struLoginInfo.wPort = 8000; //设备服务端口
    strcpy(struLoginInfo.sUserName, "admin"); //设备登录用户名
    strcpy(struLoginInfo.sPassword, "111111hk"); //设备登录密码
    //设备信息, 输出参数
    NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = { 0 };
    lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
    if (lUserID < 0)
    {
        printf("Login failed, error code: %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return -1;
    }
    NET_DVR_IPPARACFG_V40 ipcfg;
    DWORD bytesReturned = 0;
    ipcfg.dwSize = sizeof(NET_DVR_IPPARACFG_V40);
    int iGroupNO = 0;
    bool resCode = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPPARACFG_V40, iGroupNO,  &ipcfg, sizeof(NET_DVR_IPPARACFG_V40), &bytesReturned);
    if (!resCode)
    {
        DWORD code = NET_DVR_GetLastError();
        std::cout << "NET_DVR_GetDVRConfig failed " << NET_DVR_GetErrorMsg((LONG*)(&code))  << std::endl;
        NET_DVR_Logout(lUserID);
        NET_DVR_Cleanup();
        return -1;
    }
    std::cout << "设备组 " << ipcfg.dwGroupNum << " 数字通道个数 " << ipcfg.dwDChanNum <<  " 起始通道 " << ipcfg.dwStartDChan << std::endl << std::endl;
        for (int i = 0; i < ipcfg.dwDChanNum; i++)
        {      
        NET_DVR_PICCFG_V30 channelInfo;
        bytesReturned = 0;
        channelInfo.dwSize = sizeof(NET_DVR_PICCFG_V30);
        int channelNum = i + ipcfg.dwStartDChan;
        NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_PICCFG_V30, channelNum, &channelInfo,  sizeof(NET_DVR_PICCFG_V30), &bytesReturned);
        std::cout <<"通道号 "<< channelNum << "\t通道名称 " << channelInfo.sChanName;
        std::cout << "\t用户名 " << ipcfg.struIPDevInfo[i].sUserName << "\t密码 " <<  ipcfg.struIPDevInfo[i].sPassword;
        std::cout << "\t设备ID " << (int)ipcfg.struIPDevInfo[i].szDeviceID;
        std::cout << "\tip地址 " << ipcfg.struIPDevInfo[i].struIP.sIpV4 << "\t端口 " <<  ipcfg.struIPDevInfo[i].wDVRPort << std::endl;
    }
    //释放SDK资源
    NET_DVR_Logout(lUserID);
    NET_DVR_Cleanup();
    return 0;
四.输出结果:
 

 

posted @   飞翔天空energy  阅读(8493)  评论(2编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示