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