C# 仅从生物识别设备中提取新数据+;zkemkeeper

C# 仅从生物识别设备中提取新数据+;zkemkeeper,c#,fingerprint,biometrics,C#,Fingerprint,Biometrics,我已成功连接到生物识别设备,并能够使用以下方法使用zkemceeper.dll提取所有记录 axCZKEM1.ReadGeneralLogData(iMachineNumber) 通过每次使用上述方法,它将提取设备中特定时间存在的所有数据 但我希望每次都能得到新插入的数据。在Zkemkeeper中是否有可能,如果没有,是实现这一点的最佳方法吗?请分享你的想法。提前感谢ReadGeneralLogicData用于加载所有考勤日志。要获得新注册的事件,必须使用dll文件中提供的RegEvent a

我已成功连接到生物识别设备,并能够使用以下方法使用zkemceeper.dll提取所有记录

axCZKEM1.ReadGeneralLogData(iMachineNumber)
通过每次使用上述方法,它将提取设备中特定时间存在的所有数据


但我希望每次都能得到新插入的数据。在Zkemkeeper中是否有可能,如果没有,是实现这一点的最佳方法吗?请分享你的想法。提前感谢

ReadGeneralLogicData用于加载所有考勤日志。要获得新注册的事件,必须使用dll文件中提供的RegEvent api注册事件

RegEvent的签名

VARIANT_BOOL RegEvent([in]长dwMachineNumber,[in]长事件掩码) dwb为零 事件掩码为1

一旦注册,每次登录时都会调用OnAttTransactionEx事件

事件签名为

OnAttTransactionEx(BSTR注册号、长IsInValid、长AttState、长 验证方法,长年,长月,长日,长小时,长分钟,长秒, 长工作代码)

如果您正在寻找WebApi支持,可以参考

但是我使用的是essl f18型号,我的供应商说这个硬件不支持实时事件

^这就是为什么我要写我的答案,它确实支持实时事件。正如我自己在F-18系列上所做的那样

从Ramshri的回答继续,有两种方法可以实现你想要的

1:通过注册实时事件

2:从机器上获取你已经拥有的所有数据,然后重构到你所需要的

第一种方法:

public int sta_RegRealTime(ListBox lblOutputInfo)
        {
            if (GetConnectState() == false)
            {
                lblOutputInfo.Items.Add("*Please connect first!");
                return -1024;
            }

            int ret = 0;

            if (axCZKEM1.RegEvent(GetMachineNumber(), 65535))//Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all)
            {
                //common interface
                this.axCZKEM1.OnFinger += new zkemkeeper._IZKEMEvents_OnFingerEventHandler(axCZKEM1_OnFinger);
                this.axCZKEM1.OnVerify += new zkemkeeper._IZKEMEvents_OnVerifyEventHandler(axCZKEM1_OnVerify);
                this.axCZKEM1.OnFingerFeature += new zkemkeeper._IZKEMEvents_OnFingerFeatureEventHandler(axCZKEM1_OnFingerFeature);
                this.axCZKEM1.OnDeleteTemplate += new zkemkeeper._IZKEMEvents_OnDeleteTemplateEventHandler(axCZKEM1_OnDeleteTemplate);
                this.axCZKEM1.OnNewUser += new zkemkeeper._IZKEMEvents_OnNewUserEventHandler(axCZKEM1_OnNewUser);
                this.axCZKEM1.OnHIDNum += new zkemkeeper._IZKEMEvents_OnHIDNumEventHandler(axCZKEM1_OnHIDNum);
                this.axCZKEM1.OnAlarm += new zkemkeeper._IZKEMEvents_OnAlarmEventHandler(axCZKEM1_OnAlarm);
                this.axCZKEM1.OnDoor += new zkemkeeper._IZKEMEvents_OnDoorEventHandler(axCZKEM1_OnDoor);

                //only for color device
                this.axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx);
                this.axCZKEM1.OnEnrollFingerEx += new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx);

                //only for black&white device
                this.axCZKEM1.OnAttTransaction -= new zkemkeeper._IZKEMEvents_OnAttTransactionEventHandler(axCZKEM1_OnAttTransaction);
                this.axCZKEM1.OnWriteCard += new zkemkeeper._IZKEMEvents_OnWriteCardEventHandler(axCZKEM1_OnWriteCard);
                this.axCZKEM1.OnEmptyCard += new zkemkeeper._IZKEMEvents_OnEmptyCardEventHandler(axCZKEM1_OnEmptyCard);
                this.axCZKEM1.OnKeyPress += new zkemkeeper._IZKEMEvents_OnKeyPressEventHandler(axCZKEM1_OnKeyPress);
                this.axCZKEM1.OnEnrollFinger += new zkemkeeper._IZKEMEvents_OnEnrollFingerEventHandler(axCZKEM1_OnEnrollFinger);


                ret = 1;
            }
            else
            {
                axCZKEM1.GetLastError(ref idwErrorCode);
                ret = idwErrorCode;

                if (idwErrorCode != 0)
                {
                    lblOutputInfo.Items.Add("*RegEvent failed,ErrorCode: " + idwErrorCode.ToString());
                }
                else
                {
                    lblOutputInfo.Items.Add("*No data from terminal returns!");
                }
            }
            return ret;
        }
及其定义:

 //If your fingerprint(or your card) passes the verification,this event will be triggered,only for color device
        void axCZKEM1_OnAttTransactionEx(string EnrollNumber, int IsInValid, int AttState, int VerifyMethod, int Year, int Month, int Day, int Hour, int Minute, int Second, int WorkCode)
        {
            string time = Year + "-" + Month + "-" + Day + " " + Hour + ":" + Minute + ":" + Second;

            gRealEventListBox.Items.Add("Verify OK.UserID=" + EnrollNumber + " isInvalid=" + IsInValid.ToString() + " state=" + AttState.ToString() + " verifystyle=" + VerifyMethod.ToString() + " time=" + time);

            throw new NotImplementedException();
        }

        //If your fingerprint(or your card) passes the verification,this event will be triggered,only for black%white device
        private void axCZKEM1_OnAttTransaction(int EnrollNumber, int IsInValid, int AttState, int VerifyMethod, int Year, int Month, int Day, int Hour, int Minute, int Second)
        {
            string time = Year + "-" + Month + "-" + Day + " " + Hour + ":" + Minute + ":" + Second;
            gRealEventListBox.Items.Add("Verify OK.UserID=" + EnrollNumber.ToString() + " isInvalid=" + IsInValid.ToString() + " state=" + AttState.ToString() + " verifystyle=" + VerifyMethod.ToString() + " time=" + time);

            throw new NotImplementedException();
        }

        //After you have placed your finger on the sensor(or swipe your card to the device),this event will be triggered.
        //If you passes the verification,the returned value userid will be the user enrollnumber,or else the value will be -1;
        void axCZKEM1_OnVerify(int UserID)
        {
            if (UserID != -1)
            {
                gRealEventListBox.Items.Add("User fingerprint verified... UserID=" + UserID.ToString());
            }
            else
            {
                gRealEventListBox.Items.Add("Failed to verify... ");
            }

            throw new NotImplementedException();
        }
第二种方法: 现在,假设您已经获取了所有数据,但只需要上次获取的数据之后的数据。例如,;每次调用
axCZKEM1.ReadGeneralLogData(iMachineNumber)时,都需要将更新的数据存储到数据库中
将返回列表数据与数据库中的数据进行比较(使用
DateTime列
,因为它将作为表中唯一的数据),如下所示


i收集

要执行您想要执行的操作,您可以按照以下步骤操作:

  • 从设备获取所有日志数据(并将其保存到数据库)
  • 从设备中删除所有日志数据(使用函数
    ClearGLog()
    这样,每次获取考勤日志时,您都会得到最新的考勤日志。
    您可以尝试在每次有人进入时获取实时事件,但您将错过在计算机未打开时注册的事件。如果您不想错过任何考勤记录,您应该这样做。

    此外,您应该在获取日志数据之前禁用设备,并在从设备中删除日志数据之后启用它。您可以使用启用设备(machineNumber,1=enable | 0=disable)执行此操作。
  • 谢谢。但是我使用的是essl f18型号,我的供应商说这个硬件不支持实时事件。如果您的供应商是技术人员,您确定吗。他们可能是转售商。他们可能知道硬件故障排除。此后,他们将不知道软件是如何工作的。因此,我建议您仔细检查您的结论。事实上,我试图使用
    onattransactionex
    注册事件。我的设备完全被阻止,然后我得出结论,这是不可能的..好的。这是令人惊讶的。如果您正在寻找购买更多的机器,那么您可以从支持OnAttTransactionEx事件的列表中选择类似的名为RSP10t的机器。
    ICollection<AttendanceLog> lstMachineInfo = manipulator.GetLogData(objZkeeper2, machineNum);
            if (lstMachineInfo != null && lstMachineInfo.Count > 0)
            {
                var lastRecord = db.yourTableNameHere.OrderByDescending(x => x.DateTime).FirstOrDefault();
    
    
                if (lastRecord != null)
                {
                    lstMachineInfo = lstMachineInfo.Where(x => x.DateTime > lastRecord.DateTime).ToList();
                }
    
                foreach (var p in lstMachineInfo)
                {
                    db.yourTableNameHere.Add(p);
                }
    
                db.SaveChanges();