using AKSWebBrowser.Commen; using CPF.Controls; using CPF.Linux; using CPF.Windows; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; namespace AksWebBrowser.Devices { //apt-get install gcc-c++ libstdc++-devel public class Fingerprint { public static int td = -1, pnWidth = 0, pnHeight = 0, init = -1; public static string callback = string.Empty, FileName = string.Empty; //开启定时 public static System.Timers.Timer timer = new System.Timers.Timer(500); public Fingerprint() { } //读取指纹 public static string LIVESCANFinger(string code) { try { init = LibFingerprint.LIVESCAN_Init(); if (init == 1) { // Log.Info("初始化指纹成功"); td = LibFingerprint.LIVESCAN_GetChannelCount(); if (td > 0) { // Log.Info("获得采集器通道数量成功"); int pnBright = 254; int status = LibFingerprint.LIVESCAN_GetBright(td, ref pnBright); // Log.Info(" 获得采集器当前的亮度:" + status); // Log.Info(" 获得采集器当前的亮度:" + pnBright); int pnContrast = 254; status = LibFingerprint.LIVESCAN_GetContrast(td, ref pnContrast); // Log.Info(" 获得采集器当前对比度:" + status); // Log.Info(" 获得采集器当前对比度:" + pnBright); int pnWidth = 0, pnHeight = 0; status = LibFingerprint.LIVESCAN_GetMaxImageSize(td, ref pnWidth, ref pnHeight); // Log.Info(" 获得采集器采集图像的宽度、高度的最大值:" + status); // Log.Info(" 获得采集器采集图像的宽度、高度的最大值:" + pnWidth + "*" + pnHeight); byte[] pszDesc = new byte[1024]; status = LibFingerprint.LIVESCAN_GetDesc(pszDesc); // Log.Info("获得接口规范的说明:" + status); // Log.Info("获得接口规范的说明返回数据:" + Encoding.UTF8.GetString(pszDesc)); MessageBox.Show("转变采集"); string time = DateTime.Now.ToString("yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo); FileName = "/tmp/" + time + ".bmp"; timer.Stop(); timer.Elapsed += OnTimedEvent; timer.AutoReset = true;//重复执行 timer.Enabled = true;//启动定时器 } else { // Log.Info("获得采集器通道数量失败"); } Task.Run(() => { LibFingerprint.LIVESCAN_Close(); }); } else { // Log.Info("初始化指纹失败,错误代码:" + init); } } catch (Exception ex) { if (init == 1) { Task.Run(() => { LibFingerprint.LIVESCAN_Close(); }); } //Log.Error("读取指纹异常:" + ex.Message); } return ""; } //定时任务 private static void OnTimedEvent(object sender, ElapsedEventArgs e) { try { int status = LibFingerprint.LIVESCAN_BeginCapture(td); byte[] pRawData = new byte[pnWidth * pnHeight]; status = LibFingerprint.LIVESCAN_GetFPRawData(td, pRawData); //status = LibFingerprint.LIVESCAN_GetFPBmpData(td, Encoding.UTF8.GetBytes(FileName)); if (status == 1) { // Log.Info("采集一帧图像:" + Encoding.UTF8.GetString(pRawData)); // Log.Info("获取指纹成功"); timer.Stop(); // Log.Info("停止采集"); } LibFingerprint.LIVESCAN_EndCapture(td); } catch (Exception ex) { //Log.Error("定时读取指纹异常:" + ex.Message); timer.Stop(); } } } class LibFingerprint { //初始化指纹 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_Init", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_Init(); //关闭 [DllImport("libID_FprCap", EntryPoint = " LIVESCAN_Close", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_Close(); //获得采集器通道数量 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_GetChannelCount", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_GetChannelCount(); //设置采集器当前的亮度 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_SetBright", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_SetBright(int nChannel, int nBright); //设置采集器当前对比度 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_SetContrast", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_SetContrast(int nChannel, int nContrast); //获得采集器当前的亮度 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_GetBright", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_GetBright(int nChannel, ref int pnBright); //获得采集器当前对比度 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_GetContrast", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_GetContrast(int nChannel, ref int pnContrast); // 获得采集器采集图像的宽度、高度的最大值 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_GetMaxImageSize", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_GetMaxImageSize(int nChannel, ref int pnWidth, ref int pnHeight); //获得当前图像的采集位置、宽度和高度 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_GetCaptWindow", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_GetCaptWindow(int nChannel, ref int pnOriginX, ref int pnOriginY, ref int pnWidth, ref int pnHeight); //设置当前图像的采集位置、宽度和高度 [DllImport("libID_FprCap", EntryPoint = " LIVESCAN_SetCaptWindow", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_SetCaptWindow(int nChannel, int nOriginX, int nOriginY, int nWidth, int nHeight); //调用采集器的属性设置对话框 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_Setup", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_Setup(); //采集器是否支持设置对话框 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_IsSupportSetup", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_IsSupportSetup(); //准备采集一帧图像 [DllImport("libID_FprCap", EntryPoint = "LIVESCAN_BeginCapture", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_BeginCapture(int nChannel); //采集一帧图像 [DllImport("libID_FprCap", EntryPoint = " LIVESCAN_GetFPRawData", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_GetFPRawData(int nChannel, byte[] pRawData); //采集一帧 BMP 格式图像数据 [DllImport("libID_FprCap", EntryPoint = " LIVESCAN_GetFPBmpData", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_GetFPBmpData(int nChannel, byte[] pBmpData); //结束采集一帧图像 [DllImport("libID_FprCap", EntryPoint = " LIVESCAN_EndCapture", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_EndCapture(int nChannel); //获得接口规范的说明 [DllImport("libID_FprCap", EntryPoint = " LIVESCAN_GetDesc", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int LIVESCAN_GetDesc(byte[] pszDesc); } }