Tuesday, March 7, 2017

Melihat dan Melihat data Karyawan dari Mesin Absensi dengan Lazarus+ Freepascal di Linux

Tags
Melihat dan Melihat data Karyawan dari Mesin Absensi dengan Lazarus+ Freepascal di Linux - Pada peluang ini saya mencoba share pengalaman mengenai tutorial membaca data dari mesin ketidakhadiran di lingkungan Linux dengan memakai software yang dibangun dengan Lazarus+Freepascal, semoga berguna.

Suatu waktu, saya mendapat tugas untuk membikin software untuk membaca data abensi dari sebuahmesin ketidakhadiran (lebih cocoknya submodule) via network. Tugas ini kelihatannya simple, namun nyatanya menjadi sangat susah sebab software itu wajib berlangsung di Linux Ubuntu serta sayangnya SDK dari mesin ketidakhadiran tersebut nyatanya hanya terdapat untuk Wi***** saja . Hadeehhh.

Baca Juga : Cara internet dengan aman dan Anonymous Pakai Tor dan Free VPN di Linux dan Windows

Syukurlah, tetap ada 1 jalan meskipun unofficial, yaitu dengan memakai fitur WebService+SOAP yang dimiliki oleh mesin ketidakhadiran tersebut. Saya tak bakal membahas dengan cara detail apakah itu WebService serta SOAP (sebab terbukti saya tak mempunyai lumayan ilmunya :D ). Intinya, dengan fitur tersebut, kami bisa meperbuat koneksi ke mesin absensi, kemudian mengirimkan XML command dengan format tertentu untuk memperoleh respon berupa data ketidakhadiran serta lain-lain.

Sekali lagi, untuk permasalahan saya, fitur tersebut tak di support dengan cara official, sehingga TIDAK ADA dokumentasi lengkap bagaimana format XML  SOAP tersebut. Beruntunglah kamu yang mempunyainya dengan cara lengkap. Tidak hanya itu, tak semua mesin ketidakhadiran mempunyai fitur tersebut, sehingga silakan kamu cek manual mesin ketidakhadiran kamu terlebih dahulu.

OK, selanjutnya kami bakal mencoba membikin software kecil yang bakal meperbuat koneksi serta merequest data ketidakhadiran ke mesin absensi. Software ini bakal kami buat dengan memakai Lazarus serta Freepascal. Versi yang saya gunakan kini merupakan Lazarus 1.0.14 serta FPC 2.6.2.

Pertama, untuk meperbuat koneksi ke mesin absensi, saya memakai komponen bernama lNet. Komponen tersebut bisa di download di sini. Silahkan kamu download, kemudian install komponent tersebut. Seusai kamu sukses install component tersebut, maka bakal timbul tab baru bernama lNet di component Lazarus.

klik gambar untuk memperbesar

Kemudian, buatlah project baru dengan nama yang kamu sukai. Dengan cara otomatis bakal dibuatkan 1 form bernama form1 dengan nama unit unit1. Kemudian tambahkan komponent label, edittext, spinedit, memo serta LTCPComponent pada form1 tersebut, semacam foto di bawah ini.

klik gambar untuk memperbesar

Edit1 : bakal dipakai untuk input hostname dari mesin absensi
Spinedit1 : bakal dipakai untuk input port webservice mesin absensi, default 80
Edit2 : bakal dipakai untuk input password dari mesin absensi. Jangan lupa, sebab Edit2 untuk input password, maka tentukan kualitas property PasswordChar nya, contohnya dengan *

klik gambar untuk memperbesar

Memo1 : akan digunakan untuk menuliskan command XML SOAP.
Memo2 : akan digunakan untuk menampikan respond dari mesin absensi.
LTCPComponent1 :  komponent inti untuk melakukan koneksi ke mesin absensi dan untuk mengirimkan command serta menerima respon dari mesin absensi.

Sebelum mulai coding, kamu wajib mengenal bagaimana bentuk format XML command yang bakal dikirim ke mesin absensi. Di bawah ini merupakan bentuk string command untuk memperoleh data ketidakhadiran pegawai.
POST /iWsService HTTP/1.0Content-Type: text/xmlContent-Length: 128
<GetAttLog><ArgComKey xsi:type="xsd:integer">0</ArgComKey><Arg><PIN xsi:type="xsd:integer">All</PIN></Arg></GetAttLog>

Secara umum, format XML command tersebut terdiri atas header serta body. Header rutin sama untuk semua command (kecuali dibagian Content-Length). Pada misal di atas, maka headernya merupakan :
POST /iWsService HTTP/1.0Content-Type: text/xmlContent-Length: 128
dan body nya adalah :
<GetAttLog><ArgComKey xsi:type="xsd:integer">0</ArgComKey><Arg><PIN xsi:type="xsd:integer">All</PIN></Arg></GetAttLog>
Nilai dari Content-Length adalah panjang dari string command body. Pada contoh di atas adalah 128 karakter. Nilai ini tentu bisa berubah-ubah sesuai dengan jenis command yang diberikan.

<GetAttLog> adalah root node XML yang nama node nya menentukan jenis commandnya. GetAttLog (mungkin kependekan dari Get Attendance Log), sesuai dengan namanya, command ini untuk meminta data kehadiran/absensi yang tersimpan di dalam mesin absensi.

<ArgComKey xsi:type="xsd:integer">0</ArgComKey> , ArgComKey artinya node ini berisi password dari mesin ketidakhadiran yang tipenya integer. Kualitasnya dalam faktor ini merupakan 0 (secara default, password WebService dari mesin ketidakhadiran biasanya merupakan 0). Ganti kualitas 0 sesuai dengan password dari mesin absensi.

 <PIN xsi:type="xsd:integer">All</PIN> adalah argument/parameter dari command GetAttLog. PIN artinya merupakan data ketidakhadiran dari pegawai dengan PIN berapakah yang ingin diambil ? Apabila kualitasnya All, maka artinya ambil semua data ketidakhadiran yang ada. Apabila umpama disini dengan 166, maka hanya data ketidakhadiran dari pegawai dengan ID 166 yang bakal diambil.

Baca Juga : Cara Mengatasi Error GPG KEYEXPIRED di Ubuntu dengan Mudah

OK, seusai kamu mengenal garis besar struktur XML command tersebut, maka salah satu tutorial mengimplementasikannya merupakan dengan membikin XML command tersebut menjadi konstanta. Silahkan buat constanta semacam misal di bawah ini pada form1.

interface
uses  Classes, SysUtils, FileUtil, lNetComponents, Forms, Controls, Graphics,  Dialogs, StdCtrls, Spin, lNet;
const
  COMMAND_HEADER =    'POST /iWsService HTTP/1.0'+LineEnding+    'Content-Type: text/xml'+LineEnding+    'Content-Length: %d '+LineEnding+LineEnding; // 2 line end ini harus ada !!!
type



Maksud dari Content-Length: %d merupakan, kualitas dari Content-Length nanti bakal diganti/isi sesuai dengan panjang karanter body. Nah, untuk body nya, tak saya buatkan konstantanya, melainkan saya tuliskan langsung ke dalam Memo1. Silahkan kamu isi property Lines dari Memo1 dengan string di bawah ini.

<GetAttLog><ArgComKey xsi:type="xsd:integer">%s</ArgComKey><Arg><PIN xsi:type="xsd:integer">All</PIN></Arg></GetAttLog>
%s di atas maksudnya merupakan, kualitas password dari mesin ketidakhadiran nanti bakal diganti dengan sebuahkualitas, dalam faktor ini bakal diisi sesuai dengan kualitas yang diinput ke dalam Memo2.

klik gambar untuk memperbesar


Selanjutnya, tambahkan events ke dalam LTCPComponent1, yaitu pada OnConnect, OnDisconnect, OnError dan OnReceive.

klik gambar untuk memperbesar


Di bawah ini adalah masing-masing kodenya.

procedure TForm1.LTCPComponent1Connect(aSocket: TLSocket);begin  Memo2.Append('Connected');end;
procedure TForm1.LTCPComponent1Disconnect(aSocket: TLSocket);begin  Memo2.Append('Disconneted');end;
procedure TForm1.LTCPComponent1Error(const msg: string; aSocket: TLSocket);begin  Memo2.Append('Error --> '+msg);end;
procedure TForm1.LTCPComponent1Receive(aSocket: TLSocket);var  lStr: String;begin  lStr :='';  if (aSocket.GetMessage(lStr)>0) then  begin    Memo2.Text:=Memo2.Text+lStr;  end;end;
Intinya, bakal timbul pesan di dalam memo2 pada saat connect, disconnect serta error. Sedangkan pada OnReceive, maka butuh cek terlebih dahulu apakah ada data yang dikirim alias tidak. Apabila ada, maka tambahkan data string itu ke dalam Memo2.

Sekarang kami tambahkan event OnClick pada button1 (connect). Pada saat tombol tersebut ditekan, maka perbuat koneksi ke dalam mesin ketidakhadiran dengan kualitas host serta port sesuai dengan yang diinput pada edit1 serta spinedit1.

procedure TForm1.Button1Click(Sender: TObject);begin  if not LTCPComponent1.Connect(Edit1.Text,SpinEdit1.Value) then     ShowMessage('Connection Fail');end;
Terakhir, tambahkan event OnClick pada button2 (Send). Pada saat tombol tersebut ditekan, kirimkan command ke dalam mesin absensi.

procedure TForm1.Button2Click(Sender: TObject);var  lCmd: String;begin  Memo2.Clear;  // isi password sesuai dengan yang diinput pada edit2
  lCmd :=    Format(Memo1.Text,[Edit2.Text]);    //Isi Content-Length sesuai dengan panjang body  lCmd :=    Format(COMMAND_HEADER,[Length(lCmd)])+    lCmd;

  // kirimkan commend ke mesin  LTCPComponent1.SendMessage(lCmd);end;



Yang dilakukan kode di atas adalah, pertama nilai %s dari <ArgComKey xsi:type="xsd:integer">%s</ArgComKey> diganti dengan nilai yang diinput ke dalam Edit2 (password) dengan mengunakan prosedut format. Kemudian, nilai dari Content-Length: %d pada header diganti dengan panjang karakter body yang sudah diisi dengan password. String tersebut kemudian dikirim ke mesin dengan memakai prosedur SendMessage dari LTCPComponent.

OK, coding berakhir. Mudah-mudahan tak terlalu mbulet ya. Kini saatnya build serta run software untuk menonton hasilnya. Apabila semuanya sukses dicompile tanpa persoalan, maka hasilnya semacam di bawah ini.

klik gambar untuk memperbesar

klik gambar untuk memperbesar

Yups. Selamat untuk kamu yang telah sukses. Apabila belum, jangan patah semangat, silahkan coba semakin.

Software kecil ini sebetulnya tetap setengah jalan. Iya setengah jalan. Seusai kamu sukses meperbuat koneksi, mengirim command serta menerima hasilnya, maka langkah selanjutnya merupakan pasti saja parsing. String XML respond tersebut pasti wajib diparsing terlebih dahulu untuk memperoleh kualitas-kualitas nya. Nah, tahap tersebut merupakan PR untuk kamu :D . Saya yakin kamu dapat bahkan mungkin telah mempunyai library sendiri untuk memparsing XML tersebut.

Baca Juga : Cara Install Node.js versi Terbaru di Linux Ubuntu
Source code lengkap dari aplikasi ini dapat anda download di sini. Atau versi dengan sedikit modifikasi di sini.

Tambahan :
Di bawah ini adalah beberapa XML command yang saya ketahui dari hasil browsing.

UNTUK BACA DATA ATTLOG=============================================================<GetAttLog><ArgComKey xsi:type="xsd:integer">ComKey</ArgComKey>
<Arg>
<PIN xsi:type="xsd:integer">ID pegawai</PIN>
</Arg>
</GetAttLog>

UNTUK CLEAR ATTLOG DATA, HATI-HATI !!!
==============================================================
<ClearData>
<ArgComKey xsi:type="xsd:integer">
<Arg><PIN xsi:type="xsd:integer">ID pegawai</PIN></Arg></GetAttLog>
UNTUK CLEAR ATTLOG DATA, HATI-HATI !!!==============================================================<ClearData><ArgComKey xsi:type="xsd:integer">ComKey</ArgComKey>
<Arg><Value xsi:type="xsd:integer">3</Value></Arg>
</ClearData>
<Arg><Value xsi:type="xsd:integer">3</Value></Arg></ClearData>
UNTUK MENAMPILKAN DATA PEGAWAI============================================================== <GetUserInfo> <ArgComKey Xsi:type="xsd:integer">ComKey</ ArgComKey> <Arg> <PIN Xsi:type="xsd:integer">ID Pegawai</ PIN> </Arg> </GetUserInfo>

MENAMPILKAN SEMUA DATA PEGAWAI==============================================================
<GetAllUserInfo><ArgComKey xsi:type="xsd:integer">ComKey</ArgComKey></GetAllUserInfo>

RESTART MESIN ABSENSI==============================================================<Restart><ArgComKey xsi:type="xsd:integer">ComKey</ArgComKey></Restart>

MEMBACA TEMPLATE FINGER PRINT===============================================================<GetUserTemplate><ArgComKey xsi:type="xsd:integer">ComKey</ArgComKey><Arg><PIN xsi:type="xsd:integer">ID Pegawai</PIN><FingerID xsi:type="xsd:integer">No Finger</FingerID></Arg></GetUserTemplate>


1 comments so far

Saya punya program realtime tarik data absensi dengan fitur adms/cloud pada mesin. Kelebihannya adalah bisa dipasang di shared hosting maupun vps. Tidak membutuhkan soap dan scheduler (cron job) untuk tariknya, jadi bener2 realtime. Program saya memanfaatkan fitur ADMS/CLoud pada mesin absensinya seperti layaknya vendor-vendor mesin yang menyewakan cloud absensi dengan koneksi mesin ke server2 mereka. Program saya dari PHP dan MYSQL. Kelebihannya adalah bisa tarik realtime, upload sidik jari dari satu mesin ke mesin lainnya, upload user dan privilage user, hapus sidik jari, hapus transaksi, reboot, tarik informasi mesin dan lain2. Berminat?? hub 0813 48021 778 (WA)


EmoticonEmoticon