using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using libzkfpcsharp;
using System;
using System.Threading;
namespace API.Controllers
{
[Route("api/")]
[ApiController]
public class HomeController : Controller
{
private class ZKTecoReader
{
public byte[] CapturedFingerprintData { get; private set; }
private IntPtr mDevHandle = IntPtr.Zero;
private IntPtr mDBHandle = IntPtr.Zero;
private byte[] FPBuffer;
private int mfpWidth = 256; // Replace with the actual width of the fingerprint image
private int mfpHeight = 288; // Replace with the actual height of the fingerprint image
private bool isCapturing = false;
public bool Initialize(out int errorCode)
{
int ret = zkfp2.Init();
errorCode = ret;
return ret == zkfperrdef.ZKFP_ERR_OK;
}
public bool OpenDevice(int deviceIndex)
{
mDevHandle = zkfp2.OpenDevice(deviceIndex);
return mDevHandle != IntPtr.Zero;
}
public bool InitDB()
{
mDBHandle = zkfp2.DBInit();
return mDBHandle != IntPtr.Zero;
}
public bool StartCapture()
{
FPBuffer = new byte[mfpWidth * mfpHeight];
isCapturing = true;
Thread captureThread = new Thread(DoCapture);
captureThread.IsBackground = true;
captureThread.Start();
return true;
}
public void StopCapture()
{
isCapturing = false;
}
private void DoCapture()
{
try
{
while (isCapturing && CapturedFingerprintData == null)
{
int cbCapTmp = 2048;
byte[] CapTmp = new byte[cbCapTmp];
int ret = zkfp2.AcquireFingerprint(mDevHandle, FPBuffer, CapTmp, ref cbCapTmp);
if (ret == zkfp.ZKFP_ERR_OK)
{
CapturedFingerprintData = CapTmp;
// Handle captured fingerprint data
// You can raise an event, store the data, or perform any desired operations.
}
Thread.Sleep(200);
}
}catch(Exception ex)
{
string x = ex.Message + ex.StackTrace;
}
}
// Add additional methods as needed for enrollment, verification, identification, etc.
public void CloseDevice()
{
StopCapture();
zkfp2.CloseDevice(mDevHandle);
zkfp2.DBFree(mDBHandle);
zkfp2.Terminate();
}
}
private ZKTecoReader reader = new ZKTecoReader();
[HttpGet("readfinger")]
public JsonResult ReadFingerPrint()
{
int errorCode;
bool initialized = reader.Initialize(out errorCode);
if (!initialized)
{
Console.WriteLine($"Failed to initialize the SDK. Error code: {errorCode}");
return Json($"Failed to initialize the SDK. Error code: {errorCode}");
}
bool deviceOpened = reader.OpenDevice(0);
if (!deviceOpened)
{
Console.WriteLine("Failed to open the device.");
return Json("Failed to open the device.");
}
bool dbInitialized = reader.InitDB();
if (!dbInitialized)
{
Console.WriteLine("Failed to initialize the fingerprint database.");
return Json("Failed to initialize the fingerprint database.");
}
bool captureStarted = reader.StartCapture();
if (!captureStarted)
{
Console.WriteLine("Failed to start capturing fingerprints.");
return Json("Failed to start capturing fingerprints.");
}
// Sleep for a while to capture the fingerprint
Thread.Sleep(5000);
// Access the captured fingerprint data
byte[] capturedFingerprintData = reader.CapturedFingerprintData;
string fingerprintData = Convert.ToBase64String(capturedFingerprintData);
reader.StopCapture();
reader.CloseDevice();
// You can now use the fingerprintData as needed
return Json(new { status = true, message = "Fingerprint captured successfully.", data = fingerprintData });
}
}
}
this part has issue:
int ret = zkfp2.AcquireFingerprint(mDevHandle, FPBuffer, CapTmp, ref cbCapTmp);
the error is :
System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'
You may want to use this open source wrapper
Here is the usage example