对于非门禁、报警主机产品,您可以通过本文获取并设置相关用户的密码。但门禁报警主机无法使用,会报码错误17。
调用方法: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表示失败 |
声明变量类: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; //预订的
}
声明变量类: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();
}
NET_DVR_GetDVRConfig
同上
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方法进行设置