获取门禁记录方式-实时获取
实时获取
开启门禁布防,每次门禁有记录产生都会主动发送信息,其中布防的方式有两种,一种是布防后只能开启一个监听,该监听海康的4200软件也在使用,因此建议在使用期间不要开启4200;另一种监听能开启多个,不过感觉这个不靠谱,建议用第一个,毕竟4200都在用。
注意:使用实时获取时,人员编号不要有字母,例如“001”是可以的,但是“ry001”不行,因为在回调函数中只能获取到dwEmployeeNo变量而不能获取byte数组的变量信息,例如编号是“ry001”时,dwEmployeeNo为空。注意!注意!注意!
流程
-
NET_DVR_Init
(初始化) -
NET_DVR_SetDVRMessageCallBack_V50
(设置报警回调函数)- 引用方法
[DllImport(@"..\..\runtime\hk\HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRMessageCallBack_V50(int iIndex, MSGCallBack fMessageCallBack, IntPtr pUser);
-
参数说明
参数 说明 iIndex 默认为1 fMessageCallBack CHCNetSDK.MSGCallBack的回调函数 pUser IntPtr.Zero 返回值 true:成功;false:失败 -
代码举例
CHCNetSDK.MSGCallBack m_falarmData一定不能为局部变量
//设置报警回调函数,m_falarmData不能为局部变量,因为一旦设置为局部变量,回调函数则无法调用 m_falarmData = new CHCNetSDK.MSGCallBack(MsgCallback); if (!CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V50(1, m_falarmData, IntPtr.Zero)) { _logerror.Error("回调函数初始化失败"); }
MsgCallback类会在“步骤6”中体现
-
NET_DVR_Login_V40
(登录获得UserId) -
NET_DVR_SetupAlarmChan_V41
(设置布防)目的是布防,并且获得布防句柄,alarmHandle
- 引用方法
[DllImport(@"..\..\runtime\hk\HCNetSDK.dll")] public static extern int NET_DVR_SetupAlarmChan_V41(int lUserID, ref NET_DVR_SETUPALARM_PARAM lpSetupParam);
-
参数说明
参数 说明 lUserID 登录句柄 lpSetupParam 声明即可,一般不用赋值,如果赋值请参看海康SDK说明 返回值 布防句柄,后期撤防时需要该句柄进行撤防 -
代码举例
// 设置布防参数 CHCNetSDK.NET_DVR_SETUPALARM_PARAM struSetupAlarmParam = new CHCNetSDK.NET_DVR_SETUPALARM_PARAM(); struSetupAlarmParam.dwSize = (uint)Marshal.SizeOf(struSetupAlarmParam); //布防优先级 0最高,1次之,我自己设置的是1 struSetupAlarmParam.byLevel = 1; // 上传报警信息类型,只要设备不太老建议使用1,因为旧版本的回调函数是全局的,如果多类设备布防时会有问题 struSetupAlarmParam.byAlarmInfoType = 1; // 布防类型:0-客户端布防,1-实时布防,和4200抢占该状态 struSetupAlarmParam.byDeployType = (byte)0; // 布防 int alarmHandle = CHCNetSDK.NET_DVR_SetupAlarmChan_V41(userId, ref struSetupAlarmParam);
-
门禁产生记录(有人刷脸/指纹)
人为刷一次已经布防的门禁,让他产生记录
-
进入回调函数,通过判断lCommand为
CHCNetSDK.COMM_ALARM_ACS
时,开始解析门禁记录产生记录后会触发
MsgCallback
方法private void MsgCallback(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
参数说明
参数 说明 lCommand 命令 pAlarmer 报警设备信息 pAlarmInfo 报警记录信息 代码举例
public static readonly object _mj = new object(); private void MsgCallback(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser) { switch (lCommand) { case CHCNetSDK.COMM_ALARM_ACS: //进入门禁触发该方法 lock (_mj) { ProcessCommAlarmACS(ref pAlarmer, pAlarmInfo, dwBufLen, pUser); } System.GC.Collect(); break; // 报警主机触发该方法 case CHCNetSDK.COMM_ALARMHOST_CID_ALARM://报警主机CID报警上传 break; default: break; } }
ProcessCommAlarmACS
方法private void ProcessCommAlarmACS(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser) { try { // 登录句柄 int userId = pAlarmer.lUserID; // 门禁记录保存的entity,可自行设置 AcessLogEntity acessLogEntity = new AcessLogEntity(); // 将pAlarmInfo转换为NET_DVR_ACS_ALARM_INFO,门禁记录的struct CHCNetSDK.NET_DVR_ACS_ALARM_INFO struAcsAlarmInfo = (CHCNetSDK.NET_DVR_ACS_ALARM_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ACS_ALARM_INFO)); // 参见主动获取中的“AcessLogEntity.GetMinorType” if (AcessLogEntity.GetMinorType(struAcsAlarmInfo.dwMinor).Length < 1) { return; } char[] csTmp = new char[256]; // 获得门禁记录时间 acessLogEntity.AccessTime = String.Format("{0,4}-{1:D2}-{2} {3:D2}:{4:D2}:{5:D2}", struAcsAlarmInfo.struTime.dwYear, struAcsAlarmInfo.struTime.dwMonth, struAcsAlarmInfo.struTime.dwDay, struAcsAlarmInfo.struTime.dwHour, struAcsAlarmInfo.struTime.dwMinute, struAcsAlarmInfo.struTime.dwSecond); // 获得人员编号,这里的类型是uint,人员管理中的人员编号一定要设置为整形,不能带字母 uint pin = struAcsAlarmInfo.struAcsEventInfo.dwEmployeeNo; acessLogEntity.Name = Person[pin].Name; acessLogEntity.Verify = AcessLogEntity.GetMinorType(struAcsAlarmInfo.dwMinor); acessLogEntity.Pin = String.Format("{0}", pin); // 后续还有其他逻辑,因和实时获取记录无关,因此删除 } catch (Exception ex) { _logerror.Error("门禁报错", ex); } }
-
NET_DVR_CloseAlarmChan_V30
(撤防)- 引用方法
[DllImport(@"..\..\runtime\hk\HCNetSDK.dll")] public static extern int NET_DVR_Login_V40(ref NET_DVR_USER_LOGIN_INFO pLoginInfo, ref NET_DVR_DEVICEINFO_V40 lpDeviceInfo);
-
参数说明
参数 说明 pLoginInfo 登录时需要的信息:
sDeviceAddress:设备地址
wPort:端口号
sUserName:用户名
sPassword:密码lpDeviceInfo 声明即可,一般不用赋值,如果赋值请参看海康SDK说明 返回值 登录句柄,当返回值不等于-1时即为登录成功,该句柄后期会一直使用 -
代码举例
-
NET_DVR_Logout
(注销) -
NET_DVR_Cleanup
(结束)