Interop.zkemkeeper.dll kullanımı ve Parmak Okuma Sistemi

Son bir aydır yazılım danışmanlığını yapmakta olduğum hastanenin PDKS sistemi olan zkTECO firmasına ait parmak okutma cihazıyla ilgileniyorum. Bu cihaz Türkiye de kullanılan bir ürün olduğu için ilk başlarda veri okumada zorlanmam diye düşünmüştüm. Ancak yeterli Türkçe kaynak olmadığını, bu cihazı pazarlayan LiderZaman firmasının da yeterli kaynak paylaşmadığını görünce ihtiyacım olanı formlardan edindim. Bu zorlu süreç bana paylaşmanın ne kadar önemli olduğunu tekrar hatırlattı. O yüzden proje bitince yazmak istedim.

Öncelikle projenin amacı şuydu; 600 ‘e yakın personeli olan bir hastanede bir hemşirenin zamanında gelmemesi veya personel sorumlusunun bunu idare etmeye çalışması bir takim sorunlara sebep oluyor. Bu sorundan yola çıkarak, cihaz eskiden manuel bir şekilde parmak okutanları sisteme aktarıyordu. Biz bunu her 10 dakika bilgeleri aktar olarak değiştirdik. Ve en önemlisi belirlenen vardiya da işine gelmeyen personeli yöneticisine SMS olarak ilettik. Tüm müdür ve idari yöneticilere de mail olarak gönderdik. Böylece personel eksikliği anında belirleniyor ve sorun çözülmüş oluyor. Şimdi size cihazdan nasıl bilgi çektiğim konusunda bilgi vereceğim.

Öncelikle bu PDKS cihazlarından şu bilgiler gelir; PDKSID,PERSONEL NO, SAAT, TARIH buradan şunu anlamanız gerekir; gelen parmak okutma bilgisi giriş mi çıkışmı onu siz belirleyeceksiniz.

Bu bilgileri alırken yine dikkat etmeniz gereken bir şey var. Bilgileri oku dediğinizde cihaz disable yani pasif olur. O esnada parmak okutma yapılmaz. Cihaz bağlantınızı kapattığınızda tekrar aktif olur. O yüzden bu cihazdan bilgi çekme işlemi çok hızlı bitirilmeli yada musait bir zamanda yapılmalı. Ben cihazdan bilgileri çekmeyi PHP Soket programlama ile çözdüm ancak C# desteği ile cihazdan bilgileri silmeyi hallettim. Yine önemli bir nokta; siz cihazdan verileri silmediğiniz sürece 100K bilgi hafızada durur. Elektrik gittiği anda tüm bilgiler gider. Bir bakıma RAM ‘de tutar bilgileri. O yüzden her aktarımdan sonra silmeniz veri tekrarı olmaması için önemlidir.

İlgili firmaya ’10DK da bir veri yazsın istiyoruz’ dediğimizde bu sistemde bu tür işler olmaz demişlerdi. Buradan saygılarımı sunuyorum; ben yaptım oldu !

Kodlama kısmına gelince;
C# Örneklemesi

1-Adım:
zkemkeeper.dll ‘i indirip sisteme tanıtmanız gerekir. Bunun içinde şu kodu inc.bat olarak kayıt edip çalıştırın.(windows 10 için wow64 içine atın)
copy .\sdk\*.dll %windir%\system32\
regsvr32 %windir%\system32\zkemkeeper.dll

2- Adım:
Bunu ekledikten sonra Projeniniz Referance kısmından Add Referance diyerek Interop.zkemkeeper.dll ekleyin.

3-Adım:


int toplam = 0;
string sdwEnrollNumber = "0";
int idwVerifyMode = 0;
int idwInOutMode = 0;
int idwYear = 0;
int idwMonth = 0;
int idwDay = 0;
int idwHour = 0;
int idwMinute = 0;
int idwSecond = 0;
int idwWorkcode = 0;
bool bIsConnected = axCZKEM1.Connect_Net("192.168.1.241", 4370); //Ip ve Port bilgisini cihazın ayarlar kısmından öğrenebilirsiniz.
axCZKEM1.RegEvent(axCZKEM1.MachineNumber, 65535);
axCZKEM1.EnableDevice(1, false);
if (bIsConnected == true)
{
if (axCZKEM1.ReadGeneralLogData(1))//Hafızadan okuma modunda aç
while (axCZKEM1.SSR_GetGeneralLogData(1, out sdwEnrollNumber, out idwVerifyMode,
out idwInOutMode, out idwYear, out idwMonth, out idwDay, out idwHour, out idwMinute, out idwSecond, ref idwWorkcode))
{
int leng = sdwEnrollNumber.Length;
if (leng == 1) sdwEnrollNumber = "0000" + sdwEnrollNumber;
if (leng == 2) sdwEnrollNumber = "000" + sdwEnrollNumber;
if (leng == 3) sdwEnrollNumber = "00" + sdwEnrollNumber;
if (leng == 4) sdwEnrollNumber = "0" + sdwEnrollNumber;
string minute = "";
string hour = "";
if (idwMinute < 10) minute = "0" + idwMinute.ToString(); else minute = idwMinute.ToString();
if (idwHour < 10) hour = "0" + idwHour.ToString(); else hour = idwHour.ToString();
string saat = hour + ":" + minute;
string tarih = idwDay.ToString() + "." + idwMonth.ToString() + "." + idwYear.ToString();
string[] veriler = new string[2];
veriler[0] = sdwEnrollNumber.ToString();
veriler[1] = saat;
veriler[2] = tarih;
kayitlar += "PRNO:" + sdwEnrollNumber.ToString() + "-SAAT:" + saat + "-TARIH:" + tarih + "\n";

4- Hafızadan silmek için:

axCZKEM1.EnableDevice(1, true);
axCZKEM1.ClearGLog(1);

Tüm işlem bu kadar. Ama esas işlem cihazdan veriler geldikten sonra oluyor. Bu konuda yardıma ihtiyacı olan arkadaşlara yardımcı olabilir, firmanız için gerekli yazılımı geliştirebilirim.

11.539 views

1 Yorum

  1. Öylesine geçiyordum da yazmadan edemedim.

    İnternette kolayca bulamadığı bişeyi bulduğunda, erinmeyip kolayca bulunsun diye paylaşan insanlar takdire şayandır. Tebrik ederim.

    Reply
  2. merhaba , benimde hastane yemekhanesinde sıkıntım var aynı cihazla ilgili,
    sorun şu cihaza kartlar tanımlanıyor. lakin sadece yemek saatlerinde okuması diğer saatlerde okumaması ve o yemek saatinde yemek yeme hakkı yoksa okumaması ve turnikeyi açmaması gerekmektedir.
    konuyla ilgili veri okuma falan bağlantı hepsini yapıyorum. ama bu yemek saatlerine göre o kişinin yemek yiyiyip yemeyeceği konusunda sıkıntı yaşamaktayım yardımınızı bekliyorum…

    Reply
    • Parmak okutma okunan veriyi alma burada sorun yaşamıyorsanız turnikeyi tetiklemekte sorun yaşıyorsanız size tavsiyede bulunamayacağım 🙂 Ben bu işlem için baya sıkıntılı bir süreç yaşadım. Şuanda çalışan bir sistem var ancak anlatıp sızı dahada sıkıntıya sokmak istemiyorum.

      Geç cevap verdiğim için kusura bakmayın.

      Reply
  3. Merhaba,
    Bende bu cihazla ilgili program yazıyorum. Merak ettiğim konu şu bu cihazlardan php ile kullanıcı ekleme silme işlemi yapabilirmiyiz?
    Php socket yardımı ile logları çekiyorumdan kastınız cihazı online moda alıp kart okuyunca anlık veri mi fırlatıyor yoksa komut ile bütün kodları mı alıyorsunuz?
    Php ile ilgili örnek paylaşabilirmisiniz?
    Cihaz nasıl veri gönderiyor nasıl yakalamayı başarıyorsunuz?

    Reply
  4. the name ‘axCZKEM1’ does not exist in the current context
    hatası alıryorum nerede hata yapmış olabilirim.

    Reply
  5. önerebileceğiniz başka bir cihaz varmı ? Bende yeni bir projeye başlayacam. bu cihaz gerçekten çok zamanımı aldı…

    Reply
  6. Mrb cihazda parmakizi kayıtları olan kullanıcıların parmakizi kayıtlarını nasıl silebilriz. Bizim sistemde mfkart ile giriş yapılmakta, parmakizi ile girş olmaması için silmek istiyorum nasıl yapabilirim..

    Reply
  7. Vaktinizi ayırıp bu değerli bilgileri kalıcı olarak başkalarıyla paylaştığınız için teşekkürler.. Sizin birkaç dakikanızı aldı yazmak belki ancak diğerlerini birkaç günlük iş yükünden kurtardı.

    Reply
  8. cihazdan anlık veri çekiyorum ve giriş yapılıp yapılmadığına dair bilgileri alıyorum. Sorunum cihaz kartı okuduğunda direkt olarak kapıyı açıyor içerisinde kullanıcının kaydı olduğu için. Ben ise kullanıcı kartı okunduğunda kapının tetik almamasını, bunu event içerisinde yakalayıp ben izin verirsem kapıya tetik göndermeyi istiyorum. Çok fazla dokümanlarını inceledim ve internette araştırma yaptım fakat sonuca ulaşamadım. getDoorState komutu mevcut fakat setDoorState komutu yok görünüyor. Farklı bir kütüphane olan SBXPC isimli kütüphanede kapı kapatma komutu mevcut fakat projeye bir türlü ekleyemedim. Bu dll ile de ilgili bilginiz var ise bilgilendirirseniz sevinirim.

    Reply

Leave a Comment.