0
votes

I am using ZKFinger SDK2.3.3.1 version and Device Communication Protocol SDK(32Bit Ver6.2.4.1 -- DLL Version : zkemkeeper.dll - 6.2.4.1. I have a small USB fingerprint scanner. When I scan the fingerprint,

I get an array of bytes . I saved it to disc in a bitmap file and jpg both and the fingerprint looks quite good scanned. To set the fingerprint template to a user on the device, i decomporessed fingerprint image, and then call SetUserTmp Function of zkemkeeper.dll.

I am getting size error , (-3) in code.

How can i go further? What is my mistake? 

Below is my code for transfering finger from USB device to BioMetric device

   bool fullImage = false;

            zkfpEng.SaveJPG("Myfirstfinger.jpg");

            string strtmp, sRegTemplate;
            object pTemplate;


            sRegTemplate = zkfpEng.GetTemplateAsStringEx("9");

            pTemplate = zkfpEng.DecodeTemplate1(sRegTemplate);

            // Note: 10.0Template can not be compressed
            zkfpEng.SetTemplateLen(ref pTemplate, 602);
            zkfpEng.SaveTemplate("Myfirstfingerprint.tpl", pTemplate);



            byte[] TmpData = new byte[700];

            TmpData =ObjectToByteArray(pTemplate);



            if (bIsConnected == false)
            {
                MessageBox.Show("Please connect the device first!", "Error");
                return;
            }



            int idwFingerIndex = Convert.ToInt32(cbFingerIndex.Text.Trim());

            int idwEnrollNumber = Convert.ToInt32(txtUserID.Text.Trim());
            int iTmpLength = 0;
            string sdwEnrollNumber = txtUserID.Text.Trim();


            axCZKEM1.EnableDevice(iMachineNumber, false);
            Cursor = Cursors.WaitCursor;
            bool IsSetTmp = false;

            IsSetTmp = axCZKEM1.SetUserTmp(iMachineNumber, idwEnrollNumber, idwFingerIndex, ref TmpData[0]);
            int errCode = 0;
            axCZKEM1.GetLastError(ref errCode);
            MessageBox.Show(IsSetTmp.ToString() + " " + errCode.ToString());
            if (IsSetTmp == true)
            {
                MessageBox.Show("User template set successfully!", "Success");
            }
            else
            {
                MessageBox.Show("User template not set successfully!", "Error");
            }
2
You have confuse the server side programming with what is running on client side computer.Aristos
firstly, i connect to my USB Device with client connect code, and save my fingerprint image. Then i will connect to other Bio-metric device to transfer my taken fingerprint image template after compressing it.Priya
What fingerprint scanner (hardware) do you use?Olegas

2 Answers

2
votes

i think you don't have to convert it to image file, just like Remin said. here some example. i'm using xaf and mysql db

private void DownloadUserInformationAction_Execute(object sender, SimpleActionExecuteEventArgs e)
    {
        IObjectSpace os = Application.CreateObjectSpace();
        Terminal terminal = (Terminal)View.SelectedObjects[0];

        //create new czkemclass obj
        CZKEMClass myCZKEMClass = new CZKEMClass();

        //connecting the device
        myCZKEMClass.Connect_Net(terminal.IPAddress, terminal.Port);

        //Initialize variable for store temporary user information
        int tMachineNo = 0;
        string tEnrollNo = "";
        string tName = "";
        string tPassword = "";
        int tPrivilage = 0;
        bool tEnabled = false;
        int tFingerIndex;
        int tFlag = 0;
        string tTemplateData = "";
        int tTemplateLength = 0;
        myCZKEMClass.EnableDevice(terminal.DeviceId, false);
        myCZKEMClass.ReadAllUserID(terminal.DeviceId);
        myCZKEMClass.ReadAllTemplate(terminal.DeviceId);
        while (myCZKEMClass.SSR_GetAllUserInfo(tMachineNo, out tEnrollNo, out tName, out tPassword, out tPrivilage, out tEnabled))
        {
            for (tFingerIndex = 0; tFingerIndex < 10; tFingerIndex++)
            {
                if (myCZKEMClass.GetUserTmpExStr(tMachineNo, tEnrollNo, tFingerIndex, out tFlag, out tTemplateData, out tTemplateLength))
                {
                    EmployeeBiometric employeeBiometric = new EmployeeBiometric(terminal.Session);
                    //employeeBiometric.EnrollNumber = tEnrollNo;
                    XPCollection<Employee> employees = new XPCollection<Employee>(terminal.Session);
                    employeeBiometric.Employee = employees.Where(emp => emp.EnrollNo == tEnrollNo).FirstOrDefault();//(emp => emp.Sequence.ToString() == tEnrollNo).FirstOrDefault();
                    employeeBiometric.UserName = tName;
                    employeeBiometric.Password = tPassword;
                    employeeBiometric.Privilege = (Privilege)Enum.ToObject(typeof(Privilege), tPrivilage);
                    employeeBiometric.Enabled = tEnabled;
                    employeeBiometric.FingerprintIndex = tFingerIndex;
                    employeeBiometric.FingerprintTemplate = tTemplateData;
                    employeeBiometric.TemplateLength = tTemplateLength;
                    terminal.Session.CommitTransaction();

                }

            }
        }
        myCZKEMClass.EnableDevice(terminal.DeviceId, true);
    }

that's method for downloading the your fingerprint image from device to your apps.

and here you can upload it back to another device

private void UploadUserInformationAction_Execute(object sender, PopupWindowShowActionExecuteEventArgs e)
    {
        IObjectSpace os = Application.CreateObjectSpace();
        EmployeeBiometric employeeBiometric = (EmployeeBiometric)View.SelectedObjects[0];
        EmployeeBiometricParameter param = (EmployeeBiometricParameter)e.PopupWindowViewCurrentObject;

        //create new czkemclass obj
        CZKEMClass myCZKEMClass = new CZKEMClass();

        //connecting the device
        myCZKEMClass.Connect_Net(param.Terminal.IPAddress, param.Terminal.Port);
        myCZKEMClass.EnableDevice(param.Terminal.DeviceId, false);


        int myCount = View.SelectedObjects.Count;
        //Set specific user to fingerprint device
        for (int i = 1; i <= myCount; i++)
        {
            int tMachineNo = param.Terminal.DeviceId;
            string tEnrollNo = employeeBiometric.Employee.EnrollNo;//Sequence.ToString();
            string tName = employeeBiometric.UserName;
            string tPassword = employeeBiometric.Password;
            int tPrivilege = (int)employeeBiometric.Privilege;
            bool tEnabled = employeeBiometric.Enabled;
            int tFingerIndex = employeeBiometric.FingerprintIndex;
            string tTmpData = employeeBiometric.FingerprintTemplate;
            int tFlag = 1;

            if (myCZKEMClass.SSR_SetUserInfo(tMachineNo, tEnrollNo, tName, tPassword, tPrivilege, tEnabled))
            {
                myCZKEMClass.SetUserTmpExStr(tMachineNo, tEnrollNo, tFingerIndex, tFlag, tTmpData);
            }
        }

        myCZKEMClass.RefreshData(param.Terminal.DeviceId);
        myCZKEMClass.EnableDevice(param.Terminal.DeviceId, true);
    }

and this is my "Terminal" Class

public partial class Terminal : XPCustomObject
{
    Guid fOid;
    [Key(AutoGenerate = true), Browsable(false)]
    public Guid Oid
    {
        get { return fOid; }
        set { SetPropertyValue<Guid>("Oid", ref fOid, value); }
    }

    private Branch _Branch;
    [RuleRequiredField("", DefaultContexts.Save, "Branch required")]
    public Branch Branch
    {
        get
        {
            return _Branch;
        }
        set
        {
            SetPropertyValue("Branch", ref _Branch, value);
        }
    }
    string fDescription;
    [RuleUniqueValue("", DefaultContexts.Save, "The value was already registered within the system.", ResultType = ValidationResultType.Warning)]
    [RuleRequiredField("", DefaultContexts.Save, "Description required")]
    public string Description
    {
        get { return fDescription; }
        set { SetPropertyValue<string>("Description", ref fDescription, value); }
    }
    string fIPAddress;
    [Size(15)]
    public string IPAddress
    {
        get { return fIPAddress; }
        set { SetPropertyValue<string>("IPAddress", ref fIPAddress, value); }
    }

    private int _Port;
    public int Port
    {
        get
        {
            return _Port;
        }
        set
        {
            SetPropertyValue("Port", ref _Port, value);
        }
    }

    string fDeviceDescription;

    public string DeviceDescription
    {
        get { return fDeviceDescription; }
        set { SetPropertyValue<string>("DeviceDescription", ref fDeviceDescription, value); }
    }

    private int _DeviceId;
    public int DeviceId
    {
        get
        {
            return _DeviceId;
        }
        set
        {
            SetPropertyValue("DeviceId", ref _DeviceId, value);
        }
    }

    private bool _Disabled;
    public bool Disabled
    {
        get
        {
            return _Disabled;
        }
        set
        {
            SetPropertyValue("Disabled", ref _Disabled, value);
        }
    }}
0
votes

Read the FP as string and push the same string to the Biometric device without any compression or conversion.