using irisHelper; using libzkfpcsharp; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading; namespace fingerPrint { public class FingerPrintModule { // 指纹模块设备句柄 IntPtr fingerPrintDevHandle = IntPtr.Zero; IntPtr dbHandle = IntPtr.Zero; private FingerPrintZkMgr fingerPrintZkMgr; // 指纹图像 byte[] fpImgBuffer; // 单次采集的指纹模板数据 byte[] capTemp; // 单次采集的指纹模板数据长度 最长为2048个字节 int cbCapTmp = 0; // 指纹图像宽度和高度 private int fpWidth = 0; private int fpHeight = 0; private int userIdReced = 0; public FingerPrintZkMgr FingerPrintZkMgr { get => fingerPrintZkMgr; set => fingerPrintZkMgr = value; } public FingerPrintModule() { FingerPrintZkMgr = new FingerPrintZkMgr(); } public int ConnectDeivce() { int retCode = zkfp2.Init(); if (retCode == zkfperrdef.ZKFP_ERR_OK) { int devCount = zkfp2.GetDeviceCount(); if (devCount > 0) { LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "指纹采集设备初始化成功[devCount=" + devCount + "]"); // 默认打开第一个设备 retCode = OpenFingerDevice(0); } else { zkfp2.Terminate(); LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "没有找到指纹采集设备"); } } else { LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "初始化指纹采集设备异常[retCode=" + retCode + "]"); } return retCode; } public int OpenFingerDevice(int index) { fingerPrintDevHandle = zkfp2.OpenDevice(index); if (fingerPrintDevHandle == IntPtr.Zero) { // 指纹设备打开失败 LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "指纹采集设备打开失败"); return -1; } else { LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "指纹采集设备打开成功"); if (InitFingerPrintDatabase() < 0) { // 数据库初始化失败 return -2; } else { // 读取参数中的指纹图像宽度和高度 byte[] paramValue = new byte[4]; int size = 4; zkfp2.GetParameters(fingerPrintDevHandle, 1, paramValue, ref size); zkfp2.ByteArray2Int(paramValue, ref fpWidth); zkfp2.GetParameters(fingerPrintDevHandle, 2, paramValue, ref size); zkfp2.ByteArray2Int(paramValue, ref fpHeight); fpImgBuffer = new byte[fpWidth * fpHeight]; capTemp = new byte[2048]; return 0; } } } public int InitFingerPrintDatabase() { dbHandle = zkfp2.DBInit(); if (dbHandle == IntPtr.Zero) { LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "指纹数据库初始化失败"); return -1; } else { LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "指纹数据库初始化成功"); return 0; } } public int ClearFingerPrintDatabase() { return zkfp2.DBClear(dbHandle); } public int SetFingerTemplate(Dictionary<int, JObject> userFingerList) { int retCode = 0; if (IntPtr.Zero == fingerPrintDevHandle) { return -1; } foreach (var item in userFingerList) { int userId = item.Key; JObject obj = item.Value; int tempLen = Int16.Parse(obj.GetValue("lenth").ToString()); byte[] tempData = new byte[tempLen]; Array.Copy(Convert.FromBase64String(obj.GetValue("template").ToString()), tempData, tempLen); int ret = zkfp2.DBAdd(dbHandle, userId, tempData); /* StringBuilder sb = new StringBuilder(); sb.Append("length:").Append(tempLen).Append(","); sb.Append("data:").Append(obj.GetValue("template").ToString()); LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, sb.ToString()); */ if (ret == 0) { retCode++; } else { LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "userId " + userId + " add db error, code = " + ret); } } return retCode; } public int DoCapture() { int ret = zkfp2.AcquireFingerprint(fingerPrintDevHandle, fpImgBuffer, capTemp, ref cbCapTmp); if (ret == zkfperrdef.ZKFP_ERR_OK) { int score = 0; ret = zkfp2.DBIdentify(dbHandle, capTemp, ref userIdReced, ref score); if (ret == 0) { return userIdReced; } } return ret; } public void ReadFileData(string filePath, ref byte[] bData, ref int dataLen) { FileStream file = new FileStream(filePath, FileMode.Open); byte[] byFpTemplate = new byte[dataLen]; file.Seek(0, SeekOrigin.Begin); file.Read(byFpTemplate, 0, (int)dataLen); file.Close(); bData = byFpTemplate; } } }