最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

获取门禁记录方式-实时获取|世界时快讯

来源:博客园

实时获取

开启门禁布防,每次门禁有记录产生都会主动发送信息,其中布防的方式有两种,一种是布防后只能开启一个监听,该监听海康的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
      fMessageCallBackCHCNetSDK.MSGCallBack的回调函数
      pUserIntPtr.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次之,我自己设置的是1struSetupAlarmParam.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(结束)

关键词: