海康威视SDK

Posted 摧残一生 涅槃重生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了海康威视SDK相关的知识,希望对你有一定的参考价值。

获取配置信息

非门禁和报警主机产品,可通过该文章来获取和设置相关用户的密码,而门禁和报警主机无法使用,码错误会报17。

非报警主机和门禁获取配置信息

方法及参数
  1. 调用方法:NET_DVR_GetDVRConfig(userId, 4181, 0, ptrDevUser, (uint)nSize, ref dwReturn)

    //参数配置 begin
    [DllImport(@"..\\..\\runtime\\hk\\HCNetSDK.dll")]
    public static extern bool NET_DVR_GetDVRConfig(int lUserID, uint dwCommand, int lChannel, IntPtr lpOutBuffer, uint dwOutBufferSize, ref uint lpBytesReturned);
    
    参数 说明
    lUserID 登录时返回的句柄
    dwCommand 4181为:获取用户参数
    lChannel 从0开始,每32个用户为一组
    lpOutBuffer true为成功,false为失败
    dwOutBufferSize 接收数据的长度,lpOutBuffer的长度
    lpBytesReturned 实际指针的长度
    返回值 true为成功,false为失败
  2. 声明变量类:NET_DVR_USER_V51

    [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct NET_DVR_USER_V51
    
        public uint dwSize;  //结构体大小
        public uint dwMaxUserNum; //设备支持的最大用户数-只读
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_USERNUM_V30, ArraySubType = UnmanagedType.Struct)]
        public NET_DVR_USER_INFO_V51[] struUser;  /* 用户参数 */
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = PASSWD_LEN, ArraySubType = UnmanagedType.I1)]
        public byte[] sloginPassword;          /* 登陆密码确认 */
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 240, ArraySubType = UnmanagedType.I1)]
        public byte[] byRes; //保留
    
    
  3. 声明变量类:NET_DVR_USER_INFO_V51

    修改密码或其他用户参数时,需修改该变量的值

    //单用户参数(子结构)(扩展)
    [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct NET_DVR_USER_INFO_V51
    
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)]
        public byte[] sUserName;            /* 用户名只能用16字节 */
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = PASSWD_LEN, ArraySubType = UnmanagedType.I1)]
        public byte[] sPassword;            /* 密码 */
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_RIGHT, ArraySubType = UnmanagedType.I1)]
        public byte[] byLocalRight;    /* 本地权限 */
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_RIGHT, ArraySubType = UnmanagedType.I1)]
        public byte[] byRemoteRight;/* 远程权限 */
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.U4)]
        public uint[] dwNetPreviewRight;            /* 远程可以预览的通道,从前往后顺序排列,遇到0xffffffff后续均为无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.U4)]
        public uint[] dwLocalRecordRight;            /* 本地可以录像的通道,从前往后顺序排列,遇到0xffffffff后续均为无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.U4)]
        public uint[] dwNetRecordRight;            /* 远程可以录像的通道,从前往后顺序排列,遇到0xffffffff后续均为无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.U4)]
        public uint[] dwLocalPlaybackRight;            /* 本地可以回放的通道,从前往后顺序排列,遇到0xffffffff后续均为无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.U4)]
        public uint[] dwNetPlaybackRight;            /* 远程可以回放的通道,从前往后顺序排列,遇到0xffffffff后续均为无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.U4)]
        public uint[] dwLocalPTZRight;                /* 本地可以PTZ的通道,从前往后顺序排列,遇到0xffffffff后续均为无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.U4)]
        public uint[] dwNetPTZRight;                /* 远程可以PTZ的通道,从前往后顺序排列,遇到0xffffffff后续均为无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.U4)]
        public uint[] dwLocalBackupRight;            /* 本地备份权限通道,从前往后顺序排列,遇到0xffffffff后续均为无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.U4)]
        public uint[] dwLocalPreviewRight;		/* 本地预览权限通道,从前往后顺序排列,遇到0xffffffff后续均为无效*/
        public NET_DVR_IPADDR struUserIP;                /* 用户IP地址(为0时表示允许任何地址) */
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MACADDR_LEN, ArraySubType = UnmanagedType.I1)]
        public byte[] byMACAddr;    /* 物理地址 */
        public byte byPriority;                /* 优先级,0xff-无,0--低,1--中,2--高 */
        public byte byAlarmOnRight;         // 报警输入口布防权限 1-有权限,0-无权限
        public byte byAlarmOffRight;         // 报警输入口撤防权限 1-有权限,0-无权限
        public byte byBypassRight;           // 报警输入口旁路权限 1-有权限,0-无权限 
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.I1)]
        public byte[] byRes1;               //四字节对齐
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_RIGHT, ArraySubType = UnmanagedType.I1)]
        public byte[] byPublishRight;  //信息发布专有权限
        public uint dwPasswordValidity;   //密码有效期,仅管理员用户可以修改,单位:天,填0表示永久生效
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = PASSWD_LEN, ArraySubType = UnmanagedType.I1)]
        public byte[] byKeypadPassword;    //键盘密码
        public byte byUserOperateType;    //用户操作类型,1-网络用户,2-键盘用户,3-网络用户+键盘用户
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 1007, ArraySubType = UnmanagedType.I1)]
        public byte[] byRes;
    
    
调用代码实例
uint error = 0;
//设置用户信息配置
// 设置返回的字节数
UInt32 dwReturn = 0;
// 声明NET_DVR_USER_V51参数
CHCNetSDK.NET_DVR_USER_V51 devUser = new CHCNetSDK.NET_DVR_USER_V51();
// 获得NET_DVR_USER_V51参数的字节长度
Int32 nSize = Marshal.SizeOf(devUser);
// 声明与NET_DVR_USER_V51参数的字节长度相同的内存空间
IntPtr ptrDevUser = Marshal.AllocHGlobal(nSize);
// 将NET_DVR_USER_V51参数压入内存空间中
Marshal.StructureToPtr(devUser, ptrDevUser, false);
// 调用海康方法
bool b = CHCNetSDK.NET_DVR_GetDVRConfig(userId, 4181, 0, ptrDevUser, (uint)nSize, ref dwReturn);
if (b)

	// 将内存空间的数据转换为NET_DVR_USER_V51
	// 该值就是获取的参数信息
    CHCNetSDK.NET_DVR_USER_V51 strUserInfo = (CHCNetSDK.NET_DVR_USER_V51)Marshal.PtrToStructure(ptrDevUser, typeof(CHCNetSDK.NET_DVR_USER_V51));
    // 释放内存空间
    Marshal.FreeHGlobal(ptrDevUser);
else
	error = CHCNetSDK.NET_DVR_GetLastError();

非门禁和报警主机密码方法

方法及参数
  1. NET_DVR_GetDVRConfig同上

  2. NET_DVR_SetDVRConfig(userId, 4182, 0, ptrPicCfg1, (uint)nSize1)

    [DllImport(@"..\\..\\runtime\\hk\\HCNetSDK.dll")]
    public static extern bool NET_DVR_SetDVRConfig(int lUserID, uint dwCommand, int lChannel, System.IntPtr lpInBuffer, uint dwInBufferSize);
    
    参数 说明
    lUserID 登录时返回的句柄
    dwCommand 4182为:设置用户参数
    lChannel 从0开始,每32个用户为一组
    lpInBuffer NET_DVR_USER_V51实例压入的内存地址
    dwInBufferSize NET_DVR_USER_V51实例的长度
    返回值 true是成功,false是失败
步骤

通过NET_DVR_GetDVRConfig方法获得配置项后,通过给struAcsAlarmInfo1.struUser[0].sPassword赋值数据来设置admin用户密码。

注意:返回的struAcsAlarmInfo1.struUser[0].sPassword是无法获得到密码的

代码实现
//声明NET_DVR_USER_V51类
CHCNetSDK.NET_DVR_USER_V51 devUser = new CHCNetSDK.NET_DVR_USER_V51();
Int32 nSize = Marshal.SizeOf(devUser);
IntPtr ptrDevUser = Marshal.AllocHGlobal(nSize);
// 将NET_DVR_USER_V51实例压入内存中,得到IntPtr指针
Marshal.StructureToPtr(devUser, ptrDevUser, false);
// 获得用户配置参数
b = CHCNetSDK.NET_DVR_GetDVRConfig(userId, 4181, 0, ptrDevUser, (uint)nSize, ref dwReturn);
if (b)

    // 将参数从内存中提取出来
    CHCNetSDK.NET_DVR_USER_V51 struAcsAlarmInfo = (CHCNetSDK.NET_DVR_USER_V51)Marshal.PtrToStructure(ptrDevUser, typeof(CHCNetSDK.NET_DVR_USER_V51));
    // 释放内存
    Marshal.FreeHGlobal(ptrDevUser);
    // 尝试获得密码,结果为0
    String password1 = Encoding.UTF8.GetString(struAcsAlarmInfo.struUser[0].sPassword);
    // 设置新密码
    Encoding.UTF8.GetBytes(newPassword).CopyTo(struAcsAlarmInfo.struUser[0].sPassword, 0);
    Int32 nSize1 = Marshal.SizeOf(struAcsAlarmInfo);
    IntPtr ptrPicCfg1 = Marshal.AllocHGlobal(nSize1);
    // 将struAcsAlarmInfo压入内存
    Marshal.StructureToPtr(struAcsAlarmInfo, ptrPicCfg1, false);
    // 调用设置方法
    b = CHCNetSDK.NET_DVR_SetDVRConfig(userId, 4182, 0, ptrPicCfg1, (uint)nSize1);
    // 不管有没有错误,都获得错误码
    error = CHCNetSDK.NET_DVR_GetLastError();
    // 释放内存
    Marshal.FreeHGlobal(ptrPicCfg1);

return error;

注:门禁和报警主机会返回false,错误码为23,意思是设备不支持。需要使用NET_DVR_SetAlarmDeviceUser方法进行设置

海康威视SDK+VS+opencv开发

海康威视SDK+VS+opencv开发(一)

1.海康威视sdk下载

直接去海康官网下载基本的显示sdk。
海康的官网-》服务支持-》下载中心-》sdk下载。

选择合适的版本下载,我的下载是win64

2.海康sdk配置

1.创建vs工程

2.加入海康sdk
直接拷贝下载好的sdk过来

3.配置属性表
在vs工程的属性管理器中添加新的属性表命名为HC_X64_Release,再依次添加附加包含目录附加依赖项

..\\3rdParty\\HC_vision_SDK_x64\\include

../3rd_x64/HC_vision_SDK_x64/lib/HCCore.lib
../3rd_x64/HC_vision_SDK_x64/lib/HCNetSDK.lib
../3rd_x64/HC_vision_SDK_x64/lib/PlayCtrl.lib
../3rd_x64/HC_vision_SDK_x64/lib/GdiPlus.lib
../3rd_x64/HC_vision_SDK_x64/lib/HCNetSDKCom/HCAlarm.lib
../3rd_x64/HC_vision_SDK_x64/lib/HCNetSDKCom/HCGeneralCfgMgr.lib
../3rd_x64/HC_vision_SDK_x64/lib/HCNetSDKCom/HCPreview.lib


至此,海康的sdk配置完成。

3.opencv配置

1.opencv下载
去open官网下载相应的版本,安装至自己的电脑中,我安装的是opencv4.5.2

1)配置库目录文件
在vs工程的第三方库3rdParty文件夹下分别建立两个文件夹
includelib

再向lib文件夹下拷贝来自本地安装好的opencv下的libbin文件夹。

将opencv中vc14下的binlib文件夹拷贝到建立的lib文件夹下。


2)配置头目录文件
在opencv安装路径下将opencv-4.5.2\\build下的include文件夹拷贝出来放入3rdParty\\open-4.5.2下的include文件即可。(即覆盖原来为空的include文件夹)


3)配置头文件
加入以下内容:

../3rd_x64/opencv452-x64/include
../3rd_x64/opencv452-x64/include/opencv
../3rd_x64/opencv452-x64/include/opencv2


4)配置库文件
加入以下内容:

../3rd_x64/opencv452-x64/lib/lib/opencv_world452.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib

配置完成。

以上是关于海康威视SDK的主要内容,如果未能解决你的问题,请参考以下文章

海康威视SDK

海康威视SDK

海康摄像SDK开发笔记:海康威视网络摄像头SDK介绍与模块功能

海康摄像SDK开发笔记:海康威视网络摄像头SDK介绍与模块功能

java如何通过海康威视SDK捕捉ip摄像头流?

Unity3D开发之——海康威视摄像机SDK集成