C# ZKTeco 生物识别设备入门






4.95/5 (57投票s)
使用 C# 实现 Zkteco (K14) 生物识别设备
引言
在某些需求场景下,您可能需要将生物识别设备集成到您自己的应用程序中,或者实现其部分功能,例如获取考勤记录、用户信息、将指纹模板备份到您的系统数据库,或者简单地将设备中存储的数据导出到某个远程端点。
正是为此目的,本文作为一篇入门指南,提供了一些源代码片段,旨在帮助 C# 开发者节省宝贵时间,并处理那些繁琐的工作。
如果您手头有生物识别设备(用于考勤的指纹读取器)并希望从中提取有价值的数据("黄金"),那么本文包含了一些有用的旧代码片段。
已实现的设备规格
Device Name : K14
Firmware Ver : ver. 4.0.1 ( build 39 )
Vendor : ZKTeco Inc.
FP : 500
Records : 50000
注意如果您使用的是不同的设备型号,例如 ZK4500、ZK9500、SLK20M 或 SLK20R,那么 这里提供了一个很好的起点。
如果您使用的是 Realtime Biometric 等不同品牌的设备
在阅读以下文章之前,如果您对以下内容有较好的理解,将非常有益:
- 生物识别设备的工作原理、功能和特性。
- 如何使用
Regsvr32
工具注册/注销 DLL。 - 关于
ref
和out
参数工作原理的一些知识。
本文及提供的源代码将帮助您实现以下功能:
- 注册 SDK 组件。
- ping 设备。
- 连接设备。
- 从设备提取某些数据(日志数据、用户信息等)。
- 用于将数据上传到设备的源代码。
- 重启设备。
- 如何注册设备特定事件 [未实现/您需要根据自己的需求自行实现]。
背景
如今,生物识别设备在全球许多企业中得到了广泛应用。ZKTeco 等公司生产各种形态、尺寸和功能的 **生物识别门禁和考勤** 设备。对于实施这些技术的组织而言,它们提供了更好的用户身份验证和安全方式。这是当今世界日益增长的需求。因此,开发者很可能会在某个时候遇到其实现。
Using the Code
注意:以下程序适用于 **K14 型号** 设备。其他设备可能具有不同的 SDK,因此过程会略有不同。
为了实现任何生物识别设备,您都需要在系统中注册相关组件,这可以通过使用 Regsvr32
工具轻松完成。如果您不了解其工作原理,请查阅相关主题的博客文章。我们已经为此准备了一个批处理文件,所以这方面我们很方便。
您可以 从这里 下载 SDK。我已经将一个 SDK 示例附在此文章中。您可以查看 Register_SDK.bat 文件中的源代码,了解注册机制。
注册组件
- 以管理员权限启动命令提示符。
- 导航到 SDK 位置。
- 执行
Register_SDK
批处理文件
注册成功后
注册完成后,您应该会看到以下对话框。
现在,要实现生物识别设备,您需要使用 zkemkeeper.dll。
实现 SDK
- 在您的项目中添加对 zkemkeeper.dll 的引用。
- 创建一个类文件,并实现上述 dll 提供的
IZKEM
接口。 - 使用
CZKEM
类文件执行与设备相关的操作。
假设您的生物识别设备已连接到本地局域网。要与设备成功通信,您需要知道其 **IP 地址** 和 **端口号**。
IP address : Assign a static IP in the device itself
Default Port : 4370
Machine No : 1
现在我们有了有效的 IP 和端口,让我们看看我随本文一起提供的名为 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);
// Entering 65535 for the EventMask value registers for all events
EventMask
需要一个整数值,该值根据事件的类型而变化。EventMask
值的完整列表如下:
1 | OnAttTransaction , OnAttTransactionEx | |
2 (1<<1) | OnFinger | |
4 (1<<2) | OnNewUser | |
8 (1<<3) | OnEnrollFinger | |
16 (1<<4) | OnKeyPress | |
256 (1<<7) | OnVerify | |
512 (1<<8) | OnFingerFeature | |
1024 (1<<9) | OnDoor , OnAlarm | |
2048 (1<<10) | OnHIDNum | |
4096 (1<<11) | OnWriteCard | |
8192 (1<<12) | OnEmptyCard | |
16384 (1<<13) | OnDeleteTemplate |
要注册多个事件,我们可以对相关事件的二进制代码进行按位或 (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/手册以获取更详细的实现信息。
如果您有任何疑问或反馈,请随时提出。
Peace !!