Newer
Older
IRIS_REFACTOR / fingerPrint / FingerPrintModule.cs
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;
        }
    }
}