在许多情况下,可能需要将生物识别设备集成到自己的应用程序中,或者使用它的一些功能,比如获取考勤记录、用户信息、将指纹模板备份到系统数据库中,或者简单地将设备中存储的数据导出到某个远程端点。本文就是为此目的而编写的入门指南,提供了一些源代码片段,以帮助C#开发者节省宝贵的时间,避免繁琐的工作。
虽然设备会有不同的型号,有不同的SDK,但实现过程大致相同。本文包含了一些有用的旧代码片段,如果曾经得到一个生物识别设备(用于考勤的指纹读取器),并希望从中提取数据(金子),这是一个好的起点。
设备名称:K14
固件版本:ver. 4.0.1 (build 39)
供应商:ZKTeco Inc.
指纹容量:500
记录容量:50000
注意:如果使用的是不同型号的设备,如ZK4500、ZK9500、SLK20M或SLK20R,这里是一个这些设备型号的良好起点。如果使用的是Realtime Biometric等不同品牌的设备,那么在阅读本文之前,最好对以下内容有所了解:
本文和提供的源代码将帮助完成以下事项:
生物识别设备在当今世界被许多公司广泛使用。像ZKTeco这样的公司生产各种形状和大小的生物识别访问控制和考勤设备,每种型号都有不同的功能集。它们为实施它的组织提供了更好的用户认证和安全方式。这是当今世界日益增长的需求。因此,开发者可能会在某个时候遇到其实现。
注意:以下程序适用于K14型号的设备。其他设备可能有不同的SDK,因此程序集会略有不同。
为了实现任何生物识别设备,必须在系统中注册相关组件,这可以通过使用Regsvr32工具轻松完成。如果不知道它如何工作,请阅读一些相关主题的博客文章。已经为此目的准备了一个批处理文件,所以在这里很酷。
可以从这里下载SDK。已经在本文中附带了一个SDK样本。可以通过查看Register_SDK.bat文件中的源代码来了解注册机制。
成功注册后,应该看到以下对话框:
现在,为了实现生物识别设备,必须使用zkemkeeper.dll。
假设生物识别设备连接在本地网络上。为了成功地与设备通信,需要知道IP地址和端口号。
现在有了有效的IP和端口,让通过源代码来了解demo项目BioMetrix,已经在本文中附带了这个项目。该应用程序通过显示一些API实现来提供帮助。
ZKemClient.cs文件实现了IZKEM接口,包含以下代码。
以下代码有助于在给定的IPAddress和Port上连接到设备,并在成功连接后注册一些事件。(事件尚未实现,需要根据需要自己实现。)
public bool Connect_Net(string IPAdd, int Port)
{
if (objCZKEM.Connect_Net(IPAdd, Port))
{
if (objCZKEM.RegEvent(1, 65535))
{
objCZKEM.OnConnected += ObjCZKEM_OnConnected;
objCZKEM.OnDisConnected += objCZKEM_OnDisConnected;
objCZKEM.OnEnrollFinger += ObjCZKEM_OnEnrollFinger;
objCZKEM.OnFinger += ObjCZKEM_OnFinger;
objCZKEM.OnAttTransactionEx += new _IZKEMEvents_OnAttTransactionExEventHandler(zkemClient_OnAttTransactionEx);
}
return true;
}
return false;
}
为了在设备中发生某些事情时触发任何事件,需要注册事件:
bool RegEvent(int dwMachineNumber, int EventMask);
EventMask需要一个整数值,其值根据事件类型而变化。EventMask的完整值列表如下:
要注册多个事件,可以在相关事件的二进制代码之间执行XOR操作。要注册所有实时事件,EventMask的值可以设置为65535,已经在上面的代码中实现了。
可以通过提供机器号(通常是1)来获取用户信息。API实现了out参数以返回输出。在指纹设备中存储了一些随机用户数据,并使用以下代码将其检索回来并显示出来。在这里,TmpData是用户(指纹)模板数据。
public ICollection<UserInfo> GetAllUserInfo(ZkemClient objZkeeper, int machineNumber)
{
string sdwEnrollNumber = string.Empty, sName = string.Empty,
sPassword = string.Empty, sTmpData = string.Empty;
int iPrivilege = 0, iTmpLength = 0, iFlag = 0, idwFingerIndex;
bool bEnabled = false;
ICollection<UserInfo> lstFPTemplates = new List<UserInfo>();
objZkeeper.ReadAllUserID(machineNumber);
objZkeeper.ReadAllTemplate(machineNumber);
while (objZkeeper.SSR_GetAllUserInfo(machineNumber, out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled))
{
for (idwFingerIndex = 0; idwFingerIndex < 10; idwFingerIndex++)
{
if (objZkeeper.GetUserTmpExStr(machineNumber, sdwEnrollNumber, idwFingerIndex, out iFlag, out sTmpData, out iTmpLength))
{
UserInfo fpInfo = new UserInfo();
fpInfo.MachineNumber = machineNumber;
fpInfo.EnrollNumber = sdwEnrollNumber;
fpInfo.Name = sName;
fpInfo.FingerIndex = idwFingerIndex;
fpInfo.TmpData = sTmpData;
fpInfo.Privelage = iPrivilege;
fpInfo.Password = sPassword;
fpInfo.Enabled = bEnabled;
fpInfo.iFlag = iFlag.ToString();
lstFPTemplates.Add(fpInfo);
}
}
}
return lstFPTemplates;
}
结论
这为项目提供了起点。现在有了生物识别设备,可以自己尝试源代码并进行实验。有许多程序和事件需要实现,可以根据需要使用。此外,可能还想参考随本文附带的SDK。还有其他SDK/手册可以在线找到,以获取更详细的实现。