海康威视SDK

2023-10-06 14:46

获取配置信息

对于非门禁、报警主机产品,您可以通过本文获取并设置相关用户的密码。但门禁报警主机无法使用,会报码错误17。

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

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

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

    [StructLayoutAttribute(LayoutKind.Sequential)]
    公共结构NET_DVR_USER_V51
    {
        公共 uint dwSize; //结构尺寸
        公共 uint dwMaxUserNum; //设备支持的最大用户数-只读
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_USERNUM_V30,ArraySubType = UnmanagedType.Struct)]
        公共 NET_DVR_USER_INFO_V51[] struUser; /* 用户参数 */
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = PASSWD_LEN,ArraySubType = UnmanagedType.I1)]
        公共字节[] slogin密码; /* 登录密码确认 */
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 240,ArraySubType = UnmanagedType.I1)]
        公共字节[] byRes; //预订的
    }
    
  3. 声明变量类:NET_DVR_USER_INFO_V51

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

    //单用户参数(子结构)(扩展)
    [StructLayoutAttribute(LayoutKind.Sequential)]
    公共结构NET_DVR_USER_INFO_V51
    {
        [MarshalAsAttribute(UnmanagedType.ByValArray、SizeConst = NAME_LEN、ArraySubType = UnmanagedType.I1)]公共字节[] sUserName; /* 用户名只能使用16字节 */
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = PASSWD_LEN,ArraySubType = UnmanagedType.I1)]
        公共字节[] sPassword; /* 密码 */
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_RIGHT,ArraySubType = UnmanagedType.I1)]
        公共字节[] byLocalRight; /* 本地权限 */
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_RIGHT,ArraySubType = UnmanagedType.I1)]
        public byte[] byRemoteRight;/* 远程权限 */
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_CHANNUM_V40,ArraySubType = UnmanagedType.U4)]
        公共 uint[] dwNetPreviewRight; /* 可远程预览的通道按照从前到后的顺序排列。如果遇到0xffffffff则后续通道无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_CHANNUM_V40,ArraySubType = UnmanagedType.U4)]
        公共 uint[] dwLocalRecordRight; /* 本地可录制的通道按照从前到后的顺序排列。如果遇到0xffffffff则后续通道无效*/[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_CHANNUM_V40,ArraySubType = UnmanagedType.U4)]
        公共 uint[] dwNetRecordRight; /* 可远程录制的通道,按从前到后的顺序排列。如果遇到0xffffffff则后续通道无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_CHANNUM_V40,ArraySubType = UnmanagedType.U4)]
        公共 uint[] dwLocalPlaybackRight; /* 本地可播放的频道按照从前到后的顺序排列。如果遇到0xffffffff则后续通道无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_CHANNUM_V40,ArraySubType = UnmanagedType.U4)]
        公共 uint[] dwNetPlaybackRight; /* 可远程播放的通道按照从前到后的顺序排列。如果遇到0xffffffff则后续通道无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_CHANNUM_V40,ArraySubType = UnmanagedType.U4)]
        公共 uint[] dwLocalPTZRight; /* 本地云台通道按照从前到后的顺序排列。如果遇到0xffffffff则后面的无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_CHANNUM_V40,ArraySubType = UnmanagedType.U4)]公共 uint[] dwNetPTZRight; /* 远程云台通道按照从前到后的顺序排列。如果遇到0xffffffff则后面的无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_CHANNUM_V40,ArraySubType = UnmanagedType.U4)]
        公共 uint[] dwLocalBackupRight; /* 本地备份权限通道,按照从前到后的顺序排列,如果遇到0xffffffff则后面的无效*/
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_CHANNUM_V40,ArraySubType = UnmanagedType.U4)]
        公共 uint[] dwLocalPreviewRight; /* 本地预览权限通道,按从前到后的顺序排列,如果遇到0xffffffff,则后面的无效*/
        公共NET_DVR_IPADDR struUserIP; /* 用户IP地址(为0时表示允许任何地址) */
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MACADDR_LEN,ArraySubType = UnmanagedType.I1)]
        公共字节[] byMACAddr; /* 实际地址 */
        公共字节按优先级; /* 优先级,0xff-无,0--低,1--中,2--高 */
        公共字节 byAlarmOnRight; //报警输入端口布防权限 1-有权限,0-无权限
        公共字节 byAlarmOffRight; // 报警输入端口撤防权限 1-有权限,0-无权限公共字节byBypassRight; // 报警输入端口旁路权限 1-有权限,0-无权限
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 2,ArraySubType = UnmanagedType.I1)]
        公共字节[] byRes1; //四字节对齐
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = MAX_RIGHT,ArraySubType = UnmanagedType.I1)]
        公共字节[] byPublishRight; //信息发布独享权限
        公共 uint dwPasswordValidity; //密码有效期,只有管理员用户可以修改,单位:天,填0表示永久有效
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = PASSWD_LEN,ArraySubType = UnmanagedType.I1)]
        公共字节[] byKeypadPassword; //键盘密码
        公共字节 byUserOperateType; //用户操作类型,1-网络用户,2-键盘用户,3-网络用户+键盘用户
        [MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst = 1007,ArraySubType = UnmanagedType.I1)]
        公共字节[] byRes;
    }
    
调用代码示例
uint 错误 = 0;
//设置用户信息配置
//设置返回的字节数
UInt32 dwReturn = 0;
// 声明NET_DVR_USER_V51参数m.gsm-guard.net_DVR_USER_V51 devUser = new m.gsm-guard.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 = m.gsm-guard.net_DVR_GetDVRConfig(userId, 4181, 0, ptrDevUser, (uint)nSize, ref dwReturn);
如果(b)
{
//将内存空间中的数据转换为NET_DVR_USER_V51
// 这个值就是获取到的参数信息
    m.gsm-guard.net_DVR_USER_V51 strUserInfo = (m.gsm-guard.net_DVR_USER_V51)Marshal.PtrToStructure(ptrDevUser, typeof(m.gsm-guard.net_DVR_USER_V51));
    // 释放内存空间
    Marshal.FreeHGlobal(ptrDevUser);
}别的{
错误= m.gsm-guard.net_DVR_GetLastError();
}

非门禁及报警面板密码方式

方法及参数
  1. NET_DVR_GetDVRConfig同上

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

    [DllImport(@"..\..\runtime\hk\HCNetSDK.dll")]公共静态 extern bool NET_DVR_SetDVRConfig(int lUserID, uint dwCommand, int lChannel, System.IntPtr lpInBuffer, uint dwInBufferSize);
    
    参数 使用说明
    l用户ID 登录时返回句柄
    dwCommand 4182为:设置用户参数
    l频道 从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类
m.gsm-guard.net_DVR_USER_V51 devUser = new m.gsm-guard.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 = m.gsm-guard.net_DVR_GetDVRConfig(userId, 4181, 0, ptrDevUser, (uint)nSize, ref dwReturn);
如果(b)
{
    //从内存中提取参数
    m.gsm-guard.net_DVR_USER_V51 struAcsAlarmInfo = (m.gsm-guard.net_DVR_USER_V51)Marshal.PtrToStructure(ptrDevUser, typeof(m.gsm-guard.net_DVR_USER_V51));
    //释放内存
    Marshal.FreeHGlobal(ptrDevUser);
    // 尝试获取密码,结果为0
    字符串密码1 = 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 = m.gsm-guard.net_DVR_SetDVRConfig(userId, 4182, 0, ptrPicCfg1, (uint)nSize1);
    // 无论是否有错误,获取错误码
    错误= m.gsm-guard.net_DVR_GetLastError();//释放内存
    Marshal.FreeHGlobal(ptrPicCfg1);
}
返回错误;

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