Click here to Skip to main content
15,885,985 members
Articles / Programming Languages / C#

C# ZKTeco Biometric Device Getting Started

Rate me:
Please Sign up or sign in to vote.
4.95/5 (61 votes)
7 Feb 2020CPOL5 min read 542.5K   120.9K   68   260
An implementation of a Zkteco (K14) Biometric Device using C#
This article is written as a getting started guide with a few pieces of source code such that it helps C# developers integrate a biometric device into their own application. The article and the source code provided will help you with the following things: Registering the SDK components, ping the device, connecting to the device, extracting data out of the device (Log Data, User Info, etc.), and how to register to device specific events.

Introduction

There are requirements where you have to integrate a biometric device into your own application or some features of it like fetching the attendance recordors, user information, backing up the fingerprint templates into your system database or simply export the data stored in the device to some remote endpoint.

For that very purpose, this article is written as a getting started guide with a few pieces of source code such that it helps C# developers to save some valuable time with all the troublesome work.

Note: Though the devices will be of various models, with a different set of sdk, the implementation procedure will be somewhat the same.

The following article contains some useful old pieces of code, if you ever get your hands on a biometric device (fingerprint reader for Time & Attendance) and want to extract gold(data) out of it.

Implemented Device Specification

Device Name : K14
Firmware Ver : ver. 4.0.1 ( build 39 )
Vendor : ZKTeco Inc.
FP : 500
Records : 50000

 

NOTE:
If you are working with a different model of the device like ZK4500, ZK9500, SLK20M or SLK20RHere is a good starting point for those device models.

If you are working with a different brand like the Realtime Biometric

Prior to going through the following article, it would be beneficial if you have some good understanding of the following things:

  • How a biometric device works, its features and functionalities
  • How to Register/ Unregister DLLs using the Regsvr32 utility
  • Some knowledge about how the ref and out parameters work

The article and the source code provided will help you with the following things:

  • Registering the SDK components
  • Ping the device
  • Connecting to the device
  • Extracting some random data out of the device (Log Data, User Info, etc.)
  • Source code to upload data to the device
  • Restarting the device
  • How to register to device specific events [Not Implemented/ You will have to implement it yourself per your need]

Background

Biometric Devices are being used extensively in many corporations through out the world these days. Companies like ZKTeco manufacture biometric access control and Time and Attendance in various shapes and sizes with different set of features per model. They provide a better way of user authentication and security in organizations who implement it. It is a growing demand in today's world. Hence, developers are likely to come across its implementation at some point.

Using the Code

Note: The follow procedures are applicable for the K14 model devices. Other devices might have a different set of SDK, hence a slightly different set of procedures.

In order to implement any biometric device, you will have to register the related components in the system, which can be easily done by using the Regsvr32 utility. If you don't know how it works, please go through some blog posts in the related topic. We already have a batch file ready for that very purpose, Hence, we are cool here.

You can download the SDK from here. I have already attached an SDK sample along with this article. You can go through the source code inside the Register_SDK.bat  file to see the registration mechanism.

Registering the Components

  1. Fire up a Command Prompt with Administrator Privilege
  2. Navigate to the SDK location
  3. Execute the Register_SDK batch fileImage 1

On Successful Registration

You should be seeing the following dialog once your registration is complete:

Image 2

Now, To implement the biometric device, you will have to use the zkemkeeper.dll.

 

Implementing the SDK

  1. Add Reference to the zkemkeeper.dll in your project.
  2. Create a class file and implement the IZKEM interface provided by the above dll.
  3. Use the CZKEM class file to perform device related operations.

Let's say your Biometric device is connected in the local area network. To make a successful communication with the device, you need to know the IP address and the Port No.

IP address : Assign a static IP in the device itself
Default Port : 4370
Machine No : 1

Now we have a valid IP and Port, let's go through the source code used in the demo project entitled BioMetrix which I have attached along with this article. The application helps by showing some of the API implementations.

The ZKemClient.cs file implements the IZKEM interface which contains the following code.

 

Connecting to the Device

The following code helps connect to the device at the given IPAddress and Port and on successful connection, it registers some events.

(The events are not implemented though, you will have to implement it yourself as per your need.)

C#
public bool Connect_Net(string IPAdd, int Port)
{
    if (objCZKEM.Connect_Net(IPAdd, Port))
    {
        if (objCZKEM.RegEvent(1, 65535))
        {
            objCZKEM.OnConnected += ObjCZKEM_OnConnected;
            objCZKEM.OnDisConnected += objCZKEM_OnDisConnected; 
            objCZKEM.OnEnrollFinger += ObjCZKEM_OnEnrollFinger; 
            objCZKEM.OnFinger += ObjCZKEM_OnFinger; 
            objCZKEM.OnAttTransactionEx += 
               new _IZKEMEvents_OnAttTransactionExEventHandler(zkemClient_OnAttTransactionEx);
        }
        return true;
    }
    return false;
}

 

Registering Events

To fire any event when something occurs in the device, we need to register the event:

C#
 bool RegEvent(int dwMachineNumber, int EventMask); 
// Entering 65535 for the EventMask value registers for all events

The EventMask requires an integer value whose value varies based on the type of event.
The complete list of EventMask values are given below:

1 OnAttTransaction, OnAttTransactionEx  
2 (1<<1) OnFinger
4 (1<<2) OnNewUser
8 (1<<3) OnEnrollFinger
16 (1<<4) OnKeyPress
256 (1<<7) OnVerify
512 (1<<8) OnFingerFeature
1024 (1<<9) OnDoor, OnAlarm
2048 (1<<10) OnHIDNum
4096 (1<<11) OnWriteCard
8192 (1<<12) OnEmptyCard
16384 (1<<13) OnDeleteTemplate

To register for multiple-events, we can perform XOR operations between binary codes of related events.

To register all real-time events, the value of EventMask can be set as 65535 which I have implemented in the above code.

 

Fetching User Info

The user information can be fetched by providing a machine number ( It is generally 1 ). The API implements the out parameter to give back the output. I had stored some random user data in the fingerprint device and used the following code to retrieve it back and display it.  Here, The TmpData is the users (fingerprint) template data.

C#
public ICollection<UserInfo> GetAllUserInfo(ZkemClient objZkeeper, int machineNumber)
{
    string sdwEnrollNumber = string.Empty, sName = string.Empty, 
                             sPassword = string.Empty, sTmpData = string.Empty;    
    int iPrivilege = 0, iTmpLength = 0, iFlag = 0, idwFingerIndex;
    bool bEnabled = false;

    ICollection<UserInfo> lstFPTemplates = new List<UserInfo>();
    objZkeeper.ReadAllUserID(machineNumber);
    objZkeeper.ReadAllTemplate(machineNumber);
    
    while (objZkeeper.SSR_GetAllUserInfo(machineNumber, out sdwEnrollNumber, 
                      out sName, out sPassword, out iPrivilege, out bEnabled))
    {
        for (idwFingerIndex = 0; idwFingerIndex < 10; idwFingerIndex++)
        {
            if (objZkeeper.GetUserTmpExStr(machineNumber, sdwEnrollNumber, 
                   idwFingerIndex, out iFlag, out sTmpData, out iTmpLength))
            {
                UserInfo fpInfo = new UserInfo();
                fpInfo.MachineNumber = machineNumber;
                fpInfo.EnrollNumber = sdwEnrollNumber;
                fpInfo.Name = sName;
                fpInfo.FingerIndex = idwFingerIndex;
                fpInfo.TmpData = sTmpData;
                fpInfo.Privelage = iPrivilege;
                fpInfo.Password = sPassword;
                fpInfo.Enabled = bEnabled;
                fpInfo.iFlag = iFlag.ToString();

                lstFPTemplates.Add(fpInfo);
            }
        }
    }
    return lstFPTemplates;
}

 

Result

Image 3

Conclusion

Well, that gives you the starting point for your project. With a biometric device in hand, you can now experiment with the source code yourself and play along.

There are numerous procedures and events to be implemented which you can use per you need. Also, you might want to take help from the SDK that I have attached along with this article. There are other SDK/manuals which you can find online for more detailed implementation.

Feel free for any queries and feedbacks.

Peace !!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Assurance IQ
Nepal Nepal
I am a Software Engineer and a developer by profession.

The following things describes me:
1. I am a real time/run time developer : Basically learn and implement things on the fly.
2. Definitely not a technology racist : Love to work and explore any technology that i come across.
3. Prefer Beer over H2O : Code with passion and for fun

I am interested in Research & Development based tasks, exploring, experimenting and trying out new things.
Technologies i have been using up until now are C#, ASP.NET, Win Services, Web Services, Restful Web API, Windows Application, Windows Phone Application, Store Apps, couple of JavaScript frameworks, Xamarin Forms, NodeJS, React, ReactNative, AngularJS, SQL Server, MongoDB, Postgres etc.

Comments and Discussions

 
Questioncapture the fingerprint Pin
Member 1405901211-Feb-19 18:57
Member 1405901211-Feb-19 18:57 
AnswerRe: capture the fingerprint Pin
Dynamix SOL19-Jun-19 2:23
Dynamix SOL19-Jun-19 2:23 
QuestionIs there any SDK available in Php like what you did using C#? Pin
Jem Bros5-Feb-19 16:23
Jem Bros5-Feb-19 16:23 
AnswerRe: Is there any SDK available in Php like what you did using C#? Pin
Member 1415501618-Feb-19 22:06
Member 1415501618-Feb-19 22:06 
QuestionNot working with InBio160/260/460 Controller please share code for InBio Controller Pin
Member 140542131-Feb-19 0:29
Member 140542131-Feb-19 0:29 
QuestionUser active & inactive Pin
Mahmudunnabi18-Dec-18 0:19
Mahmudunnabi18-Dec-18 0:19 
QuestionBiometrics devece using Model F17 Pin
Member 1283711911-Dec-18 1:01
Member 1283711911-Dec-18 1:01 
QuestionAbout register new user with face Pin
Mohamed Salah Tag6-Nov-18 4:58
Mohamed Salah Tag6-Nov-18 4:58 
I can send order to device to start enroll fingerprint .but i can't find any function to use to start enroll new face.
Questionhow can i get in/out status Pin
Member 140043871-Oct-18 22:54
Member 140043871-Oct-18 22:54 
QuestionHow to get the image fingerprint from TmpData ? Pin
Mohammed Alromimah27-Sep-18 12:32
professionalMohammed Alromimah27-Sep-18 12:32 
AnswerRe: How to get the image fingerprint from TmpData ? Pin
Member 1408804231-Dec-18 0:31
Member 1408804231-Dec-18 0:31 
QuestionConnection does not work on differente threads Pin
Member 1393313921-Sep-18 15:50
Member 1393313921-Sep-18 15:50 
GeneralMy vote of 5 Pin
Maciej Los20-Sep-18 21:10
mveMaciej Los20-Sep-18 21:10 
Questionuser id 0 is not accept zkt f18 ex: 00308 Pin
Member 1396185126-Aug-18 0:09
Member 1396185126-Aug-18 0:09 
QuestionHow to send the time and date Pin
killerGru22-Aug-18 13:27
killerGru22-Aug-18 13:27 
AnswerRe: How to send the time and date Pin
Member 1113160922-Feb-19 1:57
Member 1113160922-Feb-19 1:57 
QuestionHow to fire event when someone logged in Pin
Member 139436079-Aug-18 21:31
Member 139436079-Aug-18 21:31 
AnswerRe: How to fire event when someone logged in Pin
Member 1403808630-Oct-18 21:36
Member 1403808630-Oct-18 21:36 
GeneralRe: How to fire event when someone logged in Pin
Golden Basim14-Jun-23 5:27
professionalGolden Basim14-Jun-23 5:27 
QuestionNot working with Inbio 260/460/pro series Pin
agung.imannuel19-Jul-18 23:40
agung.imannuel19-Jul-18 23:40 
QuestionDoes it work on zk40 device.. Pin
Member 1388393322-Jun-18 23:49
Member 1388393322-Jun-18 23:49 
AnswerRe: Does it work on zk40 device.. Pin
bensonz28-Jul-18 4:06
bensonz28-Jul-18 4:06 
QuestionHow I can upload user data to zkTeco machine? Pin
Onudipto8-Jun-18 21:18
Onudipto8-Jun-18 21:18 
AnswerRe: How I can upload user data to zkTeco machine? Pin
Member 1390229510-Jul-18 2:47
Member 1390229510-Jul-18 2:47 
AnswerRe: How I can upload user data to zkTeco machine? Pin
Member 1390229510-Jul-18 5:00
Member 1390229510-Jul-18 5:00 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.