获取门禁记录方式-实时获取

发布时间 2023-05-27 08:42:18作者: 摧残一生

实时获取

开启门禁布防,每次门禁有记录产生都会主动发送信息,其中布防的方式有两种,一种是布防后只能开启一个监听,该监听海康的4200软件也在使用,因此建议在使用期间不要开启4200;另一种监听能开启多个,不过感觉这个不靠谱,建议用第一个,毕竟4200都在用。

注意:使用实时获取时,人员编号不要有字母,例如“001”是可以的,但是“ry001”不行,因为在回调函数中只能获取到dwEmployeeNo变量而不能获取byte数组的变量信息,例如编号是“ry001”时,dwEmployeeNo为空。注意!注意!注意!

流程
  1. NET_DVR_Init(初始化)

  2. NET_DVR_SetDVRMessageCallBack_V50(设置报警回调函数)

    1. 引用方法
    [DllImport(@"..\..\runtime\hk\HCNetSDK.dll")]
    public static extern bool NET_DVR_SetDVRMessageCallBack_V50(int iIndex, MSGCallBack fMessageCallBack, IntPtr pUser);
    
    1. 参数说明

      参数 说明
      iIndex 默认为1
      fMessageCallBack CHCNetSDK.MSGCallBack的回调函数
      pUser IntPtr.Zero
      返回值 true:成功;false:失败
    2. 代码举例

      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”中体现

  3. NET_DVR_Login_V40(登录获得UserId)

  4. NET_DVR_SetupAlarmChan_V41(设置布防)

    目的是布防,并且获得布防句柄,alarmHandle

    1. 引用方法
    [DllImport(@"..\..\runtime\hk\HCNetSDK.dll")]
    public static extern int NET_DVR_SetupAlarmChan_V41(int lUserID, ref NET_DVR_SETUPALARM_PARAM lpSetupParam);
    
    1. 参数说明

      参数 说明
      lUserID 登录句柄
      lpSetupParam 声明即可,一般不用赋值,如果赋值请参看海康SDK说明
      返回值 布防句柄,后期撤防时需要该句柄进行撤防
    2. 代码举例

      // 设置布防参数
      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);
      
  5. 门禁产生记录(有人刷脸/指纹)

    人为刷一次已经布防的门禁,让他产生记录

  6. 进入回调函数,通过判断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);
        }
    
    }
    
  7. NET_DVR_CloseAlarmChan_V30(撤防)

    1. 引用方法
    [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);
    
    1. 参数说明

      参数 说明
      pLoginInfo 登录时需要的信息:
      sDeviceAddress:设备地址
      wPort:端口号
      sUserName:用户名
      sPassword:密码
      lpDeviceInfo 声明即可,一般不用赋值,如果赋值请参看海康SDK说明
      返回值 登录句柄,当返回值不等于-1时即为登录成功,该句柄后期会一直使用
    2. 代码举例

  8. NET_DVR_Logout(注销)

  9. NET_DVR_Cleanup(结束)