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.

Volley ile Android Json haberleşmesi

Merhaba,

Android ile uğraşıyorsanız mutlaka bir servis kullanıyorsunuzdur. Ben servis olarak Json kullanıyorum. Bu servis ile Android tarafında Volley kütüphanesi ile haberleşiyorum. Eğer zorlanan arkadaşlar varsa Volley nasıl kullanılır ufak bir örnekle anlatmaya çalışacağım.

1. Adım Öncelikle volley.jar ‘ı indirip. Projemizde app/libs/ içine kopyalamamız gerekiyor.
2. Adım Kopyaladıktan sonra Android studio kullananlar için “proje sağ tuş – Open Module Setting – Dependencies – Add( alt+insert) – file dependencies” diyerek /libs içinde ki volleyi bağımlılıklara ekliyoruz.
3. Adım AndroidManifest.xml dosyasını açıp içersine aşağıdaki yetkiyi ekliyoruz.

<uses-permission android:name="android.permission.INTERNET"/>

4. Adım volley sınıfı olan kodları yeni bir sınıf oluşturup “AppController.java” diyerek kayıt ediyoruz. Ve bunu /src/main/java/” içersine ekliyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class AppController extends Application {
    public static final String TAG = AppController.class.getSimpleName();
 
    private RequestQueue mRequestQueue;
 
    private static AppController mInstance;
 
    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }
 
    public static synchronized AppController getInstance() {
        return mInstance;
    }
 
    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        }
 
        return mRequestQueue;
    }
 
    public  void addToRequestQueue(Request req, String tag) {
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        getRequestQueue().add(req);
    }
 
    public  void addToRequestQueue(Request req) {
        req.setTag(TAG);
        getRequestQueue().add(req);
    }
 
    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }
}

5. Adım Her sınıf eklendikten sonra AndroidMaifest.xml ‘e bu sınıf kayıt edilmelidir. Bizde açıp aşağıdaki kodu “application” tagından sonra ekliyoruz.

  android:name=".AppController"

6. Adım Adım Son olarak json formatınıza göre sınıf yazmanız gerekiyor. Ben Array yapısını kullanıyorum, Json formatım şu:

  {
  "error": false,
  "sabitler": [
    {
      "yoneticiAdi": "Erkan Yeşersin",
      "yoneticiMail": "yesersin@gmail.com",
      "yoneticiTel": "123456",
      "yoneticiIban": "TR10200020000200002000000",
      "karOrani": "20" 
    }
  ]
}

7. Adım Veri çekmek için kullandıgımız sınıfımda şu şekilde:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
private  void JsonOrnegiFonksiyonu(){
 
        final StringRequest strReq = new StringRequest(Request.Method.GET,
                "http://erkanyesersin.com/ornekJson.php", new Response.Listener<String>() {
 
            @Override
            public void onResponse(String response) {
                try {
                    jsonResponse = "";
                    JSONObject jObj=new JSONObject(response);
 
                    boolean error = jObj.getBoolean("error");
                    if (!error) {
 
                        JSONArray questionsArray = jObj.getJSONArray("sabitler");
                        for (int i = 0; i < questionsArray.length(); i++) {
                            JSONObject c = questionsArray.getJSONObject(i);
 
                            String yoneticiAdi = c.getString("yoneticiAdi");
                            String yoneticiMail = c.getString("yoneticiMail");
                            String yoneticiIban = c.getString("yoneticiIban");
 
                            jsonResponse += "Name: " + yoneticiAdi + "\n\n";
                            jsonResponse += "Email: " + yoneticiMail + "\n\n";
                            jsonResponse += "Home: " + yoneticiIban + "\n\n";
                        } 
                        txtResponse.setText(jsonResponse); 
                    } 
 
                } catch (JSONException e) {
                    Log.i("BekleyenSiparis","Excep "+e.getMessage());
                    e.printStackTrace();
                }
 
            }
 
        }, new Response.ErrorListener() {
 
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_SHORT).show();
 
            }
        });
 
        AppController.getInstance().addToRequestQueue(strReq, "ConstantInfo");
    }

8. Adım Veri göndermek için kullandıgımız sınıfımda şu şekilde:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  private void jsonSave(){
        StringRequest stringRequest = new StringRequest(Request.Method.POST,
                "http://erkanyesersin.com/test.php",new Response.Listener<String>(){
 
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jObj = new JSONObject(response);
                    Toast.makeText(getApplicationContext(),jObj.getString("mesaj"),Toast.LENGTH_LONG).show();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
 
            }
        }, new Response.ErrorListener() {
 
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "Registration Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_LONG).show();
 
            }
        }) {
            //Esas post işini yapan kısım.
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = map;
                map.put("test", "erkanssss");
                //burada put: ilk parameter $_POST["test"] olandır. Diğeride postun değeridir.
                return params;
            }
 
        };
        AppController.getInstance().addToRequestQueue(stringRequest, "ers");
    }

Apache Maven Kurulumu ve Kullanımı -1

Maven bir proje yönetim aracıdır. “Ben projelerimi zaten kendim (ya da IDE’m vasıtasıyla) yönetebiliyorum. Bunun için bir araca ne gerek var?”, demeyin. Eğer böyle diyorsanız muhtemelen projeleriniz Maven kullanmanızı gerektirecek büyüklükte değildir. Kurumsal projeler ise bazen o kadar büyük olabiliyor ki, Maven gibi araçlara ihtiyaç duyulabiliyor.

İhtiyac duymanız halinde nasıl kurulacağı ve kullanılacağı ile ilgili bir yazı dizisi paylaşmak istiyorum. Öncelikle kurulumla başlayalım.

Adım 1: http://maven.apache.org/download.cgi adresinden apache-maven-3.3.3-bin.zipgibi son sürüme ait dosyayı indirin.

Adım 2: Arşiv dosyasını hızlı erişim için c:\maven gibi bir dosya içersine ayıklama yapın.

Adım 3: Mavenı sisteme tanıtmamız gerekiyor. Bunun içinde “Başlat > Kontrol Paneli >Sistem> Gelişmiş Sistem Ayarları > Gelişmiş > Ortam değişkenleri > Sistem Değişkenleri ” (Dikkat: Kullanıcı Değişkenleri Değil) Burada  “path” diye bir değişken adı olacak onu bulun “düzenle” yi tıklayın. Düzenle dediğinizde satırın en sonuna gidin “;(noktalı virgül)” den sonra “c:\maven\bin” yazın. Sistem tanımlaması bitti. Dikkat etmeniz gereken isimlerin dogru olmasıdır.

Adım 4: Bakalım çalışıyor mu deyip “Başlat > Çalıştır > cmd ” yazalım. Çıkan ekrana mvn -vyazın

 

Özetle yapmanız gereken için şu görseli izleyiniz: http://recordit.co/b2mtLFwIu6