Berkenalan Dengan ISO 8583 Menggunakan Java

download Berkenalan Dengan ISO 8583 Menggunakan Java

of 75

description

ISO 8583 dengan menggunakan Java

Transcript of Berkenalan Dengan ISO 8583 Menggunakan Java

Berkenalan dengan ISO 8583 Menggunakan Java

LicenseRedistribution and use in textual and binary forms, with or without modification, are permitted provided that the following conditions are met:1. Redistributions of this book must retain the above copyright notice, this list of conditions and the following disclaimer.2. The names of the authors may not be used to endorse or promote products derived from this book without specific prior written permission.THIS BOOK IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS BOOK, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Published by Martinus Ady H on November 9th, 2010 Tentang Buku Ini

Latar Belakang PembacaPembaca diasumsikan telah memahami dasar-dasar pemrograman Java dan pemrograman jaringan pada Java menggunakan Socket. Konsep CLASSPATH juga harus dimengerti. Buku ini tidak mewajibkan editor tertentu. Pembaca diharapkan sudah mahir mengoperasikan editor favoritnya masing-masing dan tahu bagaimana meletakkan kode program dan pustaka (jar) yang digunakan pada tempat yang benar. Aturan PenulisanBeberapa aturan penulisan yang digunakan pada buku ini kurang lebih sebagai berikut : Penulisan Kode ProgramSeluruh kode program maupun isi file konfigurasi pada buku ini ditulis seperti dibawah ini :

Perintah Command PromptSedangkan perintah command prompt ditulis dengan menggunakan huruf seperti dibawah ini :mkdir coba Output Eksekusi PerintahOutput dari hasil eksekusi perintah pada command prompt terlihat seperti dibawah ini :

Penulisan Nama FileUntuk penulisan nama file yang digunakan pada buku ini ditandai dengan huruf yang berwarna hijau seperti berikut :/etc/rc.d/rc.httpd CatatanBeberapa bagian pada buku ini mungkin berisi dengan catatan-catatan khusus. Catatan pada buku ini dibagi menjadi beberapa bagian yaitu :1. Bahaya, biasanya catatan ini muncul untuk menghindari penggunaan perintah atau suatu aksi yang mempunyai akibat sangat fatal. Tampilan dari catatan bahaya ini contohnya adalah seperti dibawah ini : Jangan mengetikkan perintah rm -rf / pada sistem operasi GNU/Linux atau Unix anda, jika tidak ingin semua data anda hilang.2. Tips, biasanya catatan ini muncul untuk memberitahu cara tercepat ataushortcutdari suatu perintah. Sedangkan tampilan dari catatan tips ini adalah seperti dibawah ini : Ketikkan perintah cd ~/ untuk menuju ke /home direktori anda secara cepat.3. Informasi, catatan ini digunakan untuk menunjukkan referensi saja.

PendahuluanSupaya memudahkan pemahaman, pada tulisan ini penulis akan mencoba menjelaskan tahap demi tahap kepada para pembaca. Dimulai dari perkenalan apa itu ISO (International Organization for Standardization) 8583, pengenalan format data atau pesan (message) pada ISO 8583, bagaimana membuat sebuah implementasi sederhana ISO 8583 dalam bahasa pemrograman Java menggunakanServerSocketdanSocketsampai bagaimana membuat sebuah implementasi ISO 8583 dengan menggunakan pustaka (library) jPOS.Sebagai awal pembahasan, pada bab ini kita akan membahas topik-topik dasar yaitu : Apa Itu ISO 8583 ?Apa ituISO 8583?ISO 8583ini adalah sebuah standart internasional untuk transaksi finansial. Dan standart atau protokol ini sudah sejak lama digunakan oleh perbankan untuk menjembatani komunikasi-nya (walaupun tidak menutup kemungkinan pihak selain bank menggunakan protokolISO 8583), dengan adanya sebuah standart komunikasi seperti ini maka tidak menutup kemungkinan transaksi dapat tetap dilakukan antar pihak yang terkait walaupun menggunakan sistem atau bahasa pemrograman yang berbeda.

Sedangkan dimana kita dapat melihat penggunaan nyataISO 8583ini ? PenggunaanISO 8583ini dapat kita lihat secara nyata yaitu pada mesin-mesin EDC seperti dibawah ini :

Selain pada mesin EDC, penggunaanISO 8583ini juga banyak diterapkan pada komunikasi antar bank ataupun antaraSwitcherdenganBiller.

Tipe Message ISO 8583ISO 8583ini sebenarnya dibagi menjadi 3 buah komponen yaitu :1. Message Header, ini dapat digunakan sebagai penanda awal dari sebuahmessage.2. Application Data, ini adalah inti dariISO 8583. Semua format dan definisimessageterdapat pada bagian ini.3. Message Trailer, ini dapat digunakan sebagai penanda akhir dari sebuahmessage.dan jika digambarkan, struktur diatas akan terlihat seperti gambar dibawah ini untuk sebuahmessagelengkapISO 8583: Dalam beberapa kasus, kadang-kadang dalam setiapmessagekita hanya menjumpai penggunaanMessage HeaderatauMessage Trailersaja. PenggunaanMessage HeaderdanMessage Trailerini sepenuhnya tergantung pada setiap pihak yang berkepentingan dan harusnya informasi ini tertulis jelas pada dokumen spesifikasi teknis yang telah dimusyawarahkan dan disepakati bersama oleh kedua belah pihak atau lebih.

KarenaMessage HeaderdanMessage Trailerhanya digunakan sebagai penanda saja, maka sekarang mari kita bahas tentang apa ituApplication Datayang terdapat dalamISO 8583ini. Sama seperti strukturISO 8583diatas,Application Dataini juga dibagi menjadi beberapa bagian yang kurang lebih seperti berikut :1. MTI (Message Type Indicator), adalah 4 digit karakter yang digunakan sebagai penanda awal darimessageutamaISO 8583.2. Bitmap, adalah 8 bytes data binari atau 16 digit nilai hexadecimal yang digunakan sebagai penanda bit-bit atau data element mana saja yang aktif. (16 digit disini merupakan panjang standart dari Primary Bitmap saja, silahkan lihat penjelasan pada bab tentangBitmap).3. Data Element (DE), adalah bit-bit yang berisi informasi yang sebenarnya pada transaksi itu sendiri.

Message Type IndicatorSeperti yang sudah dijelaskan pada bab sebelum-nya,MTI (Message Type Indicator)ini terdiri dari 4 digit karakter yang digunakan sebagai awalmessageutamaISO 8583itu sendiri.MTI (Message Type Indicator)ini sendiri dibagi menjadi seperti gambar dibawah ini :

Keterangan Tiap Karakter MTISebagai contoh sederhana, MTI 0110 bisa dijelaskan seperti dibawah ini :

Keterangan MTI (Diambil dari http://en.wikipedia.org/wiki/ISO_8583)Untuk lebih jelasnya, sekarang mari kita masuk kedalam pembahasan tiap-tiap komponen yang terdapat dalamMTI (Message Type Indicator)beserta contoh-contoh-nya yang akan dijelaskan pada bab-bab dibawah ini :

Versi ISO 8583Posisi pertama atau digit pertama dariMTI (Message Type Indicator)ini digunakan sebagai penanda versiISO 8583yang digunakan. Sedangkan versi yang terdapat dalamISO 8583adalah sebagai berikut :

Versi ISO 8583 (Diambil dari http://en.wikipedia.org/wiki/ISO_8583)

Message ClassSedangkan pada posisi kedua atau digit kedua dariMTI (Message Type Indicator)ini digunakan untuk tujuan apa pesan itu secara keseluruhan. Dan kode atau nilai yang standart digunakan untuk mengisi digit kedua ini dapat dilihat pada gambar dibawah ini :

Keterangan Message Class Pada MTI (Diambil dari http://en.wikipedia.org/wiki/ISO_8583)

Message FunctionPosisi ketiga atau digit ketiga dariMTI (Message Type Indicator)ini digunakan untuk mendifinisikan fungsi dari sebuahmessageapakah iturequest,responseataupunadvice. Dan kode atau nilai yang standart digunakan untuk mengisi digit ketiga ini dapat dilihat pada gambar dibawah ini :

Keterangan Message Function Pada MTI (Diambil dari http://en.wikipedia.org/wiki/ISO_8583)

Message OriginPosisi keempat atau digit terakhir dariMTI (Message Type Indicator)ini digunakan untuk mendefinisikan dari manamessageini berasal (lokasi pengirim pesan). Dan kode atau nilai yang standart digunakan untuk mengisi digit keempat ini dapat dilihat pada gambar dibawah ini :

Keterangan Message Origin Pada MTI (Diambil dari http://en.wikipedia.org/wiki/ISO_8583)

Contoh Message Type indicatorSetelah mengetahui setiap komponen yang terdapat padaMTI (Message Type Indicator), sekarang mari kita lihat beberapa contohMTI (Message Type Indicator)yang standart digunakan seperti gambar dibawah ini (walaupun tidak semua implementasi MTIISO 8583mempunyai arti dan makna yang sama) :

Beberapa Contoh MTI (Diambil dari http://en.wikipedia.org/wiki/ISO_8583)

BitmapSeperti yang sudah sedikit dibahas pada babTipe Message ISO 8583didepan, komponen kedua dariApplication Datayang terdapat dalamISO 8583ini adalahBitmap. Apasih sebenarnyaBitmapini ?Bitmapini adalah sebuah komponen yang mempunyai panjang 16 karakter (atau lebih, tergantung apakahSecondaryatauTertiary Bitmapaktif atau tidak) dalam hexadecimal, dan nilai yang terdapat dalam bitmap ini digunakan untuk me-representasikanfieldatauData Elementkeberapa yang aktif.SebuahmessageISO 8583kurang lebih pasti mempunyai satu bitmap yang biasa disebut sebagaiPrimary Bitmap, yang menandakan bahwaData Element1 sampai 64 aktif. SedangkanSecondary Bitmapakan muncul jikaData Element65 sampai 128 aktif, begitu juga untukTertiary/Third Bitmapdigunakan jikaData Element129 sampai 192 aktif walaupun jarang sekali sebuahmessagesampai menggunakanTertiary Bitmap.Bitmap ini bisa merupakan 8 bytes data binari ataupun 16 karakter hexadecimal dari 0-9, A-F pada ASCII atau EBCDIC karakter, sebuahfieldatauData Elementakan aktif jika nilai bitmap ini bernilai TRUE(ditandai dengan nilai 1). Sedangkan untukfieldatauData Elementyang tidak aktif, akan bernilaiFALSE(ditandai dengan nilai 0[nol]) pada bitmap.Agar lebih memudahkan penjelasan, sekarang mari kita masuk ke pembahasan yang lebih detail tentang bitmap pada sub-bab dibawah ini : Cara Menghitung Bitmap

Pada penjelasan sebelum-nya kita sudah mengetahui ciri-ciri sebuahBitmap, dan untuk kepentingan menghitung sebuahBitmapada beberapa poin penting yang harus selalu di ingat ketika ingin membaca atau membuat sebuahBitmap. Poin-poin penting yang perlu dicatat yaitu :

Ada 3 macam Bitmap, yaitu :1. Primary Bitmap, semuamessageISO 8583pasti mempunyai ini.FieldatauData Elementyang aktif adalah 1-64.2. Secondary Bitmap, ini digunakan jikafieldatauData Elementyang aktif adalah 65-128. Ciri-ciri adanyaSecondary Bitmapini adalahbit pertama dari PRIMARY BITMAP pasti bernilai 1 atau TRUE3. Tertiary/Third Bitmap, ini digunakan jikafieldatauData Elementyang aktif adalah 129-192. Identitas adanyaTertiary/Third Bitmapini adalah aktif-nyafieldatauData Elementke 65.

SeluruhfieldatauData ElementyangTIDAK AKTIF AKAN BERNILAI 0 (NOL/FALSE) DAN UNTUK YANG AKTIF AKAN BERNILAI 1 (TRUE) Bitmap dapat berisi 8 byte data binary, atau 16 karakter hexadecimal (0-9 dan A-F) pada ASCII atau EBCDIC (lihat pada penjelasan informasi dibawah ini) Untuk mengetahuifieldatauData Elementmana yang aktif, kita harus mengkonversi nilai hexadecimal ke binary. Jika dalam 1messageyang aktif hanyaPrimary Bitmapsaja, maka panjangBitmaptersebut adalah 64 bit. Dimana8 Byte Primary Bitmap == 64 Bit(Ingat 1 byte = 8 bits) JikaSecondary Bitmapaktif, maka panjangBitmapakan menjadi64*2yaitu128 bitatau bisa juga disebut menjadi 32 karakter hexadecimal. Begitu juga jikaTertiary Bitmapaktif.

Setelah mengetahui beberapa poin penting dalam menghitung sebuahBitmapdan sebelum mulai untuk melakukan konversi, ada baiknya kita segarkan dulu pikiran kita kembali ke bangku kuliahyang membahas tentang konversi dariHEXA to BINARY to DECIMAL. Mungkin ada yang masih ingat tentang tabel konversi dibawah ini ?? Karena tabel dibawah ini akan kita jadikan sebagai acuan untuk mengetahuifieldatauData Elementmana yang aktif:

Tabel Konversi Decimal to HexaDecimal to BinarySemua perlengkapan sudah siap, sekarang bagaimana jika kita mempunyai sebuahBitmapseperti ini5030004100010000?FieldatauData Elementberapakah yang akan aktif ??Untuk menghitung-nya, sekarang pecahkan 16 digit nilai Bitmap tersebut menjadi masing-masing 2 digit dan konversikan tiap 1 digit hexadecimal tersebut menjadi sebuah nilai binary seperti dibawah ini :

Hasil Konversi dari HexaDecimal ke BinaryNah jika sudah, sekarang rangkailah kembali nilai binary yang dihasilkan dari proses konveri dari hexa tersebut secara ber-urutan dari angka50,30, 00, 41, 00, 01, 00 dan 00tersebut menjadi seperti gambar dibawah ini :

Rangkaian Bitmap Dalam BinaryDari gambar diatas, kita sudah bisa mengatahuifieldatauData Elementmana saja yang aktif. Dan karena padaBitmapdiatas kita tidak melihat adanyaSecondary Bitmapmaka kita akan melakukan pengecekan darifieldke 1 sampaifieldke 64 yang bisa kita lihat seperti dibawah ini :

Dan hasil akhir darifieldatauData Elementyang aktif adalah sebagai berikut :

Hasil Akhir Data Element Yang Aktif

Secondary BitmapSekarang, bagaimana caranya untuk mengetahui atau meng-identifikasi adanyaSecondary Bitmap? Seperti yang sudah dijelaskna diatas, cara paling mudah identifikasi-nya yaitu1 digit setelah 4 digit MTI (karakter pertama dari bitmap), jika dikonversikan ke binary digit awal-nya pasti bernilai 1 (TRUE) dan jika nilai-nya adalah 1 (TRUE) maka panjang Bitmap yang harus diambil adalah 32 karakter untuk keperluan melihatfieldatauData Elementyang aktif.Sebagai contoh, sekarang mari kita tambahkan beberapafieldatauData Elementyang sudah kita ketahui diatas menjadi seperti dibawah ini :

Contoh Data Element Dengan Secondary BitmapSetelah mengetahuiData Elementyang aktif, sekarang mari kita coba konversikan menjadi sebuahBitmapdengan mengisi 0 (nol) untukData Elementyang tidak aktif, dan 1 (satu) untukData Elementyang aktif. Dan hasil-nya kurang lebih menjadi seperti dibawah ini :

KarenaSecondary Bitmapkita aktif, sekarang rubahlahBIT PERTAMA dari Bitmapdibawah ini dengan angka 1 hingga hasil-nya menjadi seperti dibawah ini :

Sekarang dari nilai binary yang sudah kita dapatkan, konversikan menjadi nilai hexadecimal dan kita akan mendapatkan nilaiBitmapyang kurang lebih hasilnya akan seperti gambar dibawah ini :Bitmap Dengan Secondary Bitmap

Data Element Data Element Standart ISO 8583

ISO-Defined Data Elements

Diambil dari http://en.wikipedia.org/wiki/ISO_8583

Contoh Menyusun Message Lengkap ISO 8583Setelah mengetahui apa ituMTI, BitmapdanData Element, sekarang mari kita mulai dengan sebuah contoh bagaimana cara menyusun sebuahmessageISO 8583yang lengkap sampai siap untuk dikirimkan keclient/server.Sebagai contoh kita mempunyai tugas untuk membuat sebuahNetwork Management Request Messageyang menggunakanISO 8583versi 1993 denganData Elementyang aktif adalahDEke3,7,11,12,13,48dan70dengan konfigurasi tiap-tiapData Elementadalah sebagai berikut :

Tahapan yang perlu dilakukan yaitu adalah :

Pembuatan Message Type Identifier, yang diminta adalahNetwork Management Request Messagedengan versi 1993. Jadi nilaiMTIyang cocok adalah sebagai berikut :1800dengan penjelasan : Digit pertama bernilai 1 (satu) berarti menggunakan versi 1993 dariISO 8583 Digit kedua bernilai 8 (delapan) berartiNetwork Management Message Digit ketiga bernilai 0 (nol) berartiRequest Digit keempat bernilai 0 (nol) berarti ini adalahAcquirer Pembuatan Bitmap, pembuatanBitmapdapat dilakukan dengan cara sebagai berikut : KonversiData Element 3,7,11,12,13,48dan70menjadi binary dengan cara sebagai berikut : KarenaSecondary Bitmapaktif (adanyaData Elementke70), maka ganti nilai bit pertama bitmap dengan nilai 1 (satu) seperti dibawah ini : Konversi nilai10100010001110000000000000000000000000000000000100000000000000000000010000000000000000000000000000000000000000000000000000000000menjadi nilai hexadecimal dengan cara sebagai berikut :

Dari hasil konversi dari binary ke hexadecimal, didapatkan nilaiBitmapsebagai berikut :A2380000000100000400000000000000 Pengabungan Data Element, sedangkan penggabungan nilaiData Elementmenghasilkan nilai sebagai berikut :123456201009141234560110300914009ECHO TEST001

Setelah semua proses perhitungan selesai dilakukan, sekarang mari kita gabungkan antaraMTI, BITMAPdanApplication Datamenjadi satu yang hasil akhirnya adalah seperti dibawah ini :1800A2380000000100000400000000000000123456201009141234560110300914009ECHO TEST001

Implementasi Menggunakan JavaNah setelah kita mengetahui formatmessageISO 8583, sekarang bagaimana meng-implementasikan-nya pada bahasa pemrograman Java ? Sebelum kita menulis kode, yang harus kita lakukan pertama kali yaitu adalah menyusun spesifikasi yang akan kita gunakan untuk berkomunikasi. Pada kenyataan-nya, spesifikasi ini sangat penting peranan-nya dan ada kemungkin tiapvendormempunyaispesifikasi yang berbedaantara satu dengan yang lain. Sebagai catatan,perhatikan betul-betul spesifikasiyang sudah disepakati bersama. Dan sekarang, bagaimanakah cara membuat sebuah spesifikasi untukmessageISO 8583dan implementasi-nya pada bahasa pemrograman Java akan kita bahas pada bab-bab dibawah ini :

Pembuatan Spesifikasi Message Network ManagementAgar komunikasi antara server dan client dapat berjalan dengan sukses, maka diperlukan sebuah kesepakatan yang harus ditaati oleh kedua belah pihak. Beberapa persyaratan tersebut yaitu mencakup tentang : Message Protokol, protokol yang akan digunakan dalam contoh kasus ini adalahISO 8583:1993yang ditandai dengan angka1 (satu)padaMTI (Message Type Indicator). Connection Type, mode koneksi yang akan digunakan adalah modeconnection-orienteddimanaclientmembuka koneksi keserversekali dan mengirimkan banyakmessage(connect once -> many transaction) Message System, untuk seluruhmessageyang dikirimkan keserverharus menggunakan4 bit headersebagai penanda panjangmessageyang dikirimkanDan dibawah ini adalah format message Network Management Request/Response :NETWORK MANAGEMENT REQUEST Message Type Identifier :1800 Sender :Client Purpose :Request network management action to Server

NETWORK MANAGEMENT RESPONSE Message Type Identifier :1810 Sender :Server Purpose :Response network management action for Client

Pembuatan spesifikasi untukmessageNetwork Managementsudah selesai, sekarang mari kita implementasikan dengan membuat sebuah aplikasi server-nya dahulu.

Pembuatan Aplikasi ServerSekarang buatlah sebuah project Java biasa pada NetBeans IDE dan berilah nama project tersebut contohnyaImplementasi, dan buatlah sebuahpackagedahulu dengan nama id.web.martinusadyh.iso8583.helper. Didalampackageyang telah kita buat, buatlah sebuahhelper classdengan namaDecimalHexBinaryConverter.javayang mempunyai fungsi sebagaikonverterketika kita ingin menghitung nilaiBitmapyang kurang lebih seperti kode dibawah ini :

id.web.martinusadyh.iso8583.helper.DecimalHexBinaryConverter.javapackage id.web.martinusadyh.iso8583.helper;public class DecimalHexBinaryConverter {public static String decimalToHexa(Integer decimalNumber) {return Integer.toHexString(decimalNumber);}public static String decimalToBinary(Integer decimalNumber) {StringBuilder binaryNumber = new StringBuilder();StringBuilder sbBinary = new StringBuilder();String binaryString = Integer.toBinaryString(decimalNumber);char[] binary = binaryString.toCharArray();int counter = 0;// ambil dari index karakter terakhirfor (int i=binary.length-1; i>=0; i--) {counter++;sbBinary.append(binary[i]);// reset counter ke nol jika berhasil mengambil 4 digit karakterif (counter == 4) counter = 0;}// 4 adalah panjang karakter tiap blok di binary// ex: dec [100] == binary [0110 0100]for (int i=0; i 0) sbBinary.append("0");}// sekarang dibalikfor (int i=sbBinary.length()-1; i>=0;i--) {binaryNumber.append(sbBinary.toString().charAt(i));}return binaryNumber.toString();}public static Integer binaryToDecimal(String binaryNumber) {return Integer.parseInt(binaryNumber, 2);}public static String binaryToHexa(String binaryNumber) {return decimalToHexa(binaryToDecimal(binaryNumber));}public static Integer hexaToDecimal(String hexaNumber) {return Integer.parseInt(hexaNumber, 16);}public static String hexaToBinary(String hexaNumber) {return decimalToBinary(hexaToDecimal(hexaNumber));}}

Setelah selesai membuat konverter dariHexaToBinarydan sebalik-nya, sekarang buatlah sebuahHelper Classlagi yang fungsinya kali ini lebih berkaitan dengan field-field yang terdapat dalam formatISO 8583seperti mencari panjang bitmap yang sebenar-nya, mencari data element yang aktif dalam sebuahmessagedan lain-lain. Sekarang buatlah sebuah Java Class dengan namaISOUtildidalam packageid.web.martinusadyh.iso8583.helperyang isinya kurang lebih adalah sebagai berikut :

id.web.martinusadyh.iso8583.helper.ISOUtil.javapackage id.web.martinusadyh.iso8583.helper;public class ISOUtil {/** Mencari panjang dari Bitmap 16 karakter atau 32 karakter, jika bit pertama * nilai-nya == 1 (active/TRUE) maka secondary bitmap active dan otomatis * panjang bitmap menjadi 32 karakter. * @param originalMsg message asli ISO beserta dengan MTI-nya * @return panjang bitmap yang harus di potong / diambil. */public static Integer findLengthOfBitmap(String originalMsg) {// ambil 1 digit bitmap setelah MTIString bitPertama = originalMsg.substring(4,5);int panjangBitmap = 0;// cek nilai binary-nyaif (DecimalHexBinaryConverter.hexaToBinary(bitPertama).substring(0, 1).equalsIgnoreCase("1")) {panjangBitmap = 32;} else {panjangBitmap = 16;}return panjangBitmap;}public static String getHexaBitmapFromActiveDE(int[] activeDE) {StringBuilder finalHexaBitmap = new StringBuilder();StringBuilder binaryBitmapForReply = new StringBuilder();boolean secondarBitmapActive = false;int panjangBitmap = 16;// pengecekan secondary bitmapfor (int i=0; i 64) {secondarBitmapActive = true;panjangBitmap = 32;}}// x4 untuk mendapatkan jumlah seluruh data elemenpanjangBitmap *= 4;int counterBitmap=0;String active = "";for (int i=0;i= 100) msgHeader = "0" + networkReq.toString().length();if (networkReq.toString().length() >= 1000) msgHeader = String.valueOf(networkReq.toString().length());StringBuilder finalNetworkReqMsg = new StringBuilder();finalNetworkReqMsg.append(msgHeader);finalNetworkReqMsg.append(networkReq.toString());return finalNetworkReqMsg.toString();}}

Jika sudah, sekarang lakukan-lah prosesClean and Buildpada NetBeans dengan menekan kombinasi tombolSHIFT+F11dan harusnya tidak ada pesan kesalahan yang akan ditimbulkan

TestingPembuatan aplikasi server dan client sudah selesai dilakukan, sekarang langkah terakhir yang harus kita lakukan yaitu adalah mencoba untuk menjalankan kedua aplikasi tersebut. Sekarang jalankanlah dahulu aplikasi server-nya dengan cara klik kanan pada fileServerISO.javakemudian pilihlahRunDan jika tidak ada pesan kesalahan, maka padapallete outputNetBeans akan muncul tulisan seperti dibawah ini :

Jika sudah menjumpai tampilan seperti diatas, sekarang jalankan-lah fileClientISO.javadengan cara klik kanan kemudian pilih menuRun. Jika tidak pesan kesalahan, maka pada sisi client akan muncul tulisan seperti dibawah ini :

Dan kita juga bisa melihat respon yang diberikan server ketika terjadirequestdari client dengan melihat tampilan output-nya yang kurang lebih seperti dibawah ini :

Sampai disini, prosesrequest / responsetelah terjadi dengan baik antara sisi server dan sisi client.Bagaimana ? tidak susah bukan ? Nah pada bab selanjut-nya, kita akan membahas salah satulibrarydi Java yang sudah meng-otomatisasikan proses-proses yang telah kita lakukan secara manual diatas.

Pengenalan JPOSPada bab-bab awal implementasi, kita menggunakan classServerSocketdanSocketdimana untuk melakukanparsingharus kita lakukan secara manual satu-persatu. Beruntunglah kita sebagai programmer Java, karena di bahasa pemrograman Java terdapat 1 library yang cukup bagus yaitujPOS. Meskipun libraryjPOSiniopensource, tapi untuk dokumentasi-nya(jPOS Programmers Guide)kita diharuskan membeli sebesar$ 50saja (sebuah harga yang tidak terlalu mahal bukan ?)Sedangkan untuk source codejPOSsendiri, bisa kita download menggunakananonymous subversionpada alamathttps://jpos.svn.sourceforge.net/svnroot/jpos(untuk pengembangan menggunakan library jPOS, sangat dianjurkan untuk mendownload source code ini sebagai bahan referensi).Apasih kelebihan dari libraryjPOSini ? Yang jelas adalah, library ini memangkas semua proses manual yang harus kita lakukan ketika kita menggunakanSocketbiasa. Selain itu,jPOSjuga mendukung beberapa protokol-protokol yang biasa digunakan dalam implementasiISO 8583. Untuk dapat menggunakanjposada beberapa hal dasar yang harus kita ketahui yaitu : ISOPackagerPackageratauISOPackagerpada library libraryjPOSini digunakan sebagai definisi panjang dan tipe data tiap-tiapData Elementyang akan digunakan dalam komunikasi. Ada banyak contohpackageryang dapat kita lihat dalam direktorijpos/dist/cfg/packageryang salah satu contoh-nya yaitupackageruntukiso93ascii.xmlseperti dibawah ini: packager/iso93ascii.xml

Selain menggunakan file xml,packagerjuga dapat dikonfigurasikan melalui file java dengan ketentuan kita harusmeng-extendsclassISOBasePackagerseperti dibawah ini : id.web.martinusadyh.iso8583.jpos.CustomPackagerpackage id.web.martinusadyh.iso8583.jpos;import org.jpos.iso.IFA_AMOUNT;import org.jpos.iso.IFA_BINARY;import org.jpos.iso.IFA_BITMAP;import org.jpos.iso.IFA_LLCHAR;import org.jpos.iso.IFA_LLLCHAR;import org.jpos.iso.IFA_LLNUM;import org.jpos.iso.IFA_NUMERIC;import org.jpos.iso.IFB_BINARY;import org.jpos.iso.IF_CHAR;import org.jpos.iso.ISOBasePackager;import org.jpos.iso.ISOFieldPackager;/** * * @author Martinus Ady H */public class CustomPackager extends ISOBasePackager {public CustomPackager() {setFieldPackager(new ISOFieldPackager[]{/*000*/new IFA_NUMERIC(4, "Message Type Indicator"),/*001*/ new IFA_BITMAP(16, "BIT MAP"),/*002*/ new IFA_LLNUM(19, "PAN - PRIMARY ACCOUNT NUMBER"),/*003*/ new IFA_NUMERIC(6, "PROCESSING CODE"),/*004*/ new IFA_NUMERIC(12, "AMOUNT, TRANSACTION"),/*005*/ new IFA_NUMERIC(12, "AMOUNT, SETTLEMENT"),/*006*/ new IFA_NUMERIC(12, "AMOUNT, CARDHOLDER BILLING"),/*007*/ new IFA_NUMERIC(10, "TRANSMISSION DATE AND TIME"),/*008*/ new IFA_NUMERIC(8, "AMOUNT, CARDHOLDER BILLING FEE"),/*009*/ new IFA_NUMERIC(8, "CONVERSION RATE, SETTLEMENT"),/*010*/ new IFA_NUMERIC(8, "CONVERSION RATE, CARDHOLDER BILLING"),/*011*/ new IFA_NUMERIC(6, "SYSTEM TRACE AUDIT NUMBER"),/*012*/ new IFA_NUMERIC(6, "TIME, LOCAL TRANSACTION"),/*013*/ new IFA_NUMERIC(4, "DATE, LOCAL TRANSACTION"),/*014*/ new IFA_NUMERIC(4, "DATE, EXPIRATION"),/*015*/ new IFA_NUMERIC(4, "DATE, SETTLEMENT"),/*016*/ new IFA_NUMERIC(4, "DATE, CONVERSION"),/*017*/ new IFA_NUMERIC(4, "DATE, CAPTURE"),/*018*/ new IFA_NUMERIC(4, "MERCHANTS TYPE"),/*019*/ new IFA_NUMERIC(3, "ACQUIRING INSTITUTION COUNTRY CODE"),/*020*/ new IFA_NUMERIC(3, "PAN EXTENDED COUNTRY CODE"),/*021*/ new IFA_NUMERIC(3, "FORWARDING INSTITUTION COUNTRY CODE"),/*022*/ new IFA_NUMERIC(3, "POINT OF SERVICE ENTRY MODE"),/*023*/ new IFA_NUMERIC(3, "CARD SEQUENCE NUMBER"),/*024*/ new IFA_NUMERIC(3, "NETWORK INTERNATIONAL IDENTIFIEER"),/*025*/ new IFA_NUMERIC(2, "POINT OF SERVICE CONDITION CODE"),/*026*/ new IFA_NUMERIC(2, "POINT OF SERVICE PIN CAPTURE CODE"),/*027*/ new IFA_NUMERIC(1, "AUTHORIZATION IDENTIFICATION RESP LEN"),/*028*/ new IFA_AMOUNT(9, "AMOUNT, TRANSACTION FEE"),/*029*/ new IFA_AMOUNT(9, "AMOUNT, SETTLEMENT FEE"),/*030*/ new IFA_AMOUNT(9, "AMOUNT, TRANSACTION PROCESSING FEE"),/*031*/ new IFA_AMOUNT(9, "AMOUNT, SETTLEMENT PROCESSING FEE"),/*032*/ new IFA_LLNUM(11, "ACQUIRING INSTITUTION IDENT CODE"),/*033*/ new IFA_LLNUM(11, "FORWARDING INSTITUTION IDENT CODE"),/*034*/ new IFA_LLCHAR(28, "PAN EXTENDED"),/*035*/ new IFA_LLNUM(37, "TRACK 2 DATA"),/*036*/ new IFA_LLLCHAR(104, "TRACK 3 DATA"),/*037*/ new IF_CHAR(12, "RETRIEVAL REFERENCE NUMBER"),/*038*/ new IF_CHAR(6, "AUTHORIZATION IDENTIFICATION RESPONSE"),/*039*/ new IF_CHAR(2, "RESPONSE CODE"),/*040*/ new IF_CHAR(3, "SERVICE RESTRICTION CODE"),/*041*/ new IF_CHAR(8, "CARD ACCEPTOR TERMINAL IDENTIFICACION"),/*042*/ new IF_CHAR(15, "CARD ACCEPTOR IDENTIFICATION CODE"),/*043*/ new IF_CHAR(40, "CARD ACCEPTOR NAME/LOCATION"),/*044*/ new IFA_LLCHAR(25, "ADITIONAL RESPONSE DATA"),/*045*/ new IFA_LLCHAR(76, "TRACK 1 DATA"),/*046*/ new IFA_LLLCHAR(999, "ADITIONAL DATA - ISO"),/*047*/ new IFA_LLLCHAR(999, "ADITIONAL DATA - NATIONAL"),/*048*/ new IFA_LLLCHAR(999, "ADITIONAL DATA - PRIVATE"),/*049*/ new IF_CHAR(3, "CURRENCY CODE, TRANSACTION"),/*050*/ new IF_CHAR(3, "CURRENCY CODE, SETTLEMENT"),/*051*/ new IF_CHAR(3, "CURRENCY CODE, CARDHOLDER BILLING"),/*052*/ new IFB_BINARY(8, "PIN DATA"),/*053*/ new IFA_NUMERIC(16, "SECURITY RELATED CONTROL INFORMATION"),/*054*/ new IFA_LLLCHAR(120, "ADDITIONAL AMOUNTS"),/*055*/ new IFA_LLLCHAR(999, "RESERVED ISO"),/*056*/ new IFA_LLLCHAR(999, "RESERVED ISO"),/*057*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL"),/*058*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL"),/*059*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL"),/*060*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE"),/*061*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE"),/*062*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE"),/*063*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE"),/*064*/ new IFA_BINARY(8, "MESSAGE AUTHENTICATION CODE FIELD"),/*065*/ new IFA_BINARY(8, "BITMAP, EXTENDED"),/*066*/ new IFA_NUMERIC(1, "SETTLEMENT CODE"),/*067*/ new IFA_NUMERIC(2, "EXTENDED PAYMENT CODE"),/*068*/ new IFA_NUMERIC(3, "RECEIVING INSTITUTION COUNTRY CODE"),/*069*/ new IFA_NUMERIC(3, "SETTLEMENT INSTITUTION COUNTRY CODE"),/*070*/ new IFA_NUMERIC(3, "NETWORK MANAGEMENT INFORMATION CODE"),/*071*/ new IFA_NUMERIC(4, "MESSAGE NUMBER"),/*072*/ new IFA_NUMERIC(4, "MESSAGE NUMBER LAST"),/*073*/ new IFA_NUMERIC(6, "DATE ACTION"),/*074*/ new IFA_NUMERIC(10, "CREDITS NUMBER"),/*075*/ new IFA_NUMERIC(10, "CREDITS REVERSAL NUMBER"),/*076*/ new IFA_NUMERIC(10, "DEBITS NUMBER"),/*077*/ new IFA_NUMERIC(10, "DEBITS REVERSAL NUMBER"),/*078*/ new IFA_NUMERIC(10, "TRANSFER NUMBER"),/*079*/ new IFA_NUMERIC(10, "TRANSFER REVERSAL NUMBER"),/*080*/ new IFA_NUMERIC(10, "INQUIRIES NUMBER"),/*081*/ new IFA_NUMERIC(10, "AUTHORIZATION NUMBER"),/*082*/ new IFA_NUMERIC(12, "CREDITS, PROCESSING FEE AMOUNT"),/*083*/ new IFA_NUMERIC(12, "CREDITS, TRANSACTION FEE AMOUNT"),/*084*/ new IFA_NUMERIC(12, "DEBITS, PROCESSING FEE AMOUNT"),/*085*/ new IFA_NUMERIC(12, "DEBITS, TRANSACTION FEE AMOUNT"),/*086*/ new IFA_NUMERIC(16, "CREDITS, AMOUNT"),/*087*/ new IFA_NUMERIC(16, "CREDITS, REVERSAL AMOUNT"),/*088*/ new IFA_NUMERIC(16, "DEBITS, AMOUNT"),/*089*/ new IFA_NUMERIC(16, "DEBITS, REVERSAL AMOUNT"),/*090*/ new IFA_NUMERIC(42, "ORIGINAL DATA ELEMENTS"),/*091*/ new IF_CHAR(1, "FILE UPDATE CODE"),/*092*/ new IF_CHAR(2, "FILE SECURITY CODE"),/*093*/ new IF_CHAR(5, "RESPONSE INDICATOR"),/*094*/ new IF_CHAR(7, "SERVICE INDICATOR"),/*095*/ new IF_CHAR(42, "REPLACEMENT AMOUNTS"),/*096*/ new IFA_BINARY(8, "MESSAGE SECURITY CODE"),/*097*/ new IFA_AMOUNT(17, "AMOUNT, NET SETTLEMENT"),/*098*/ new IF_CHAR(25, "PAYEE"),/*099*/ new IFA_LLNUM(11, "SETTLEMENT INSTITUTION IDENT CODE"),/*100*/ new IFA_LLNUM(11, "RECEIVING INSTITUTION IDENT CODE"),/*101*/ new IFA_LLCHAR(17, "FILE NAME"),/*102*/ new IFA_LLCHAR(28, "ACCOUNT IDENTIFICATION 1"),/*103*/ new IFA_LLCHAR(28, "ACCOUNT IDENTIFICATION 2"),/*104*/ new IFA_LLLCHAR(100, "TRANSACTION DESCRIPTION"),/*105*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"),/*106*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"),/*107*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"),/*108*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"),/*109*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"),/*110*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"),/*111*/ new IFA_LLLCHAR(999, "RESERVED ISO USE"),/*112*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"),/*113*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"),/*114*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"),/*115*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"),/*116*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"),/*117*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"),/*118*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"),/*119*/ new IFA_LLLCHAR(999, "RESERVED NATIONAL USE"),/*120*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"),/*121*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"),/*122*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"),/*123*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"),/*124*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"),/*125*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"),/*126*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"),/*127*/ new IFA_LLLCHAR(999, "RESERVED PRIVATE USE"),/*128*/ new IFA_LLLCHAR(999, "MAC 2")});}}Sedangkan cara penggunaan-nya adalah sebagai berikut :

ISO ChannelClassISOChannelatauChannelpada libraryjPOSini digunakan untuk membungkus detail implementasi dari protokol-protokol yang digunakan oleh setiap vendor. Selain ituISOChannelini juga digunakan untuk mengirimkan dan menerima objectISOMsg. BeberapaChannelyang telah didukung oleh libraryjPOSini antara lain :

ChannelatauISOChanneldisini mempunyai peran yang sangat penting sekali dalam proses tersambung atau tidak-nya antara vendor yang satu dengan yang lain dan biasanya implementasi tiap vendor berbeda-beda.Sedangkan pada libraryjPOS, penggunaanChannelini sangat mudah seperti terlihat pada potongan kode dibawah ini :

ISOServer dan ISOMUXJika pada implementasi sebelum-nya kita menggunakan classServerSocketsebagai implementasi sebuah server dan classSocketsebagai implementasi sebuah client, pada libraryjPOSkita dapat menggunakan classISOServersebagai implementasi Server-nya dan classISOMUXsebagai implementasi client-nya. Agarmessageyang kita kirimkan ke server tidak tertukar denganmessageyang lain, maka ketika kita melakukan inisialisasi padaISOMUXoverridelah methodgetKey(ISOMsg isoMsg)seperti contoh dibawah ini :CONTOH PENGGUNAAN ISOMUX :Sedangkan cara untuk menggunakan classISOServeradalah sebagai berikut :

ISOMsgClassISOMsgpada libraryjPOSini adalah merupakan inti darimessageyang akan kita kirim dan kita terima. Dibandingkan dengan cara manual yang telah kita lakukan pada tahap implementasi di bab sebelum-nya, untuk mengisi nilai pada data element tertentu pada class ISOMsg dapat kita lakukan secara langsung dengan cara seperti dibawah ini :

CONTOH PENGGUNAAN CLASS ISOMSG :

Sedangkan untuk mengirimkan-nya pada sebuah server, kita dapat membungkusISOMsgkedalam objectISORequestdan mengirimkan objectISORequesttersebut ke methodqueue(ISORequest isoRequest)pada classISOMUXseperti contoh dibawah ini :CARA MENGIRIMKAN MESSAGE MELALUI ISOREQUEST :

Dan untuk mendapat respon dari server, kita bisa menggunakan methodgetResponse(Integer TIMEOUT)dari classISORequestseperti kode dibawah ini :CARA MENGAMBIL RESPON MELALUI ISOREQUEST :

Sampai disini pembahasan tentang apa itujPOSsudah bisa dikatakan selesai.Nah sekarang bagaimanakah implementasi menggunakan jPOS ? Mari kita lihat pada bab selanjut-nya.

IMPLEMENTASI MENGGUNAKAN JPOSSetelah kita mengetahui apa itu libraryjPOS, sekarang bagaimana penggunaan-nya secara nyata ? Pada bab kali ini, kita akan menulis ulang spesifikasiNetwork Managementyang sebelum-nya sudah di implementasikan menggunakan Socket biasa. Nah untuk memulai-nya ada beberapa persiapan yang harus kita lakukan yaitu : Persiapan ProjectSebagai langkah awal, tambahkanlah dahulu 2 buah library yaitujdom-1.0.jardanjpos.jaryang dapat diambil dari direktorijpos(yang bisa kita download melalui subversion) kedalam project. Setelah itu, buatlah 1 buah direktori dengan namapackagerdidalam direktori project dan pastekan kedua file dibawah ini :genericpackager.dtd

iso93ascii.xml23456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652

Jika sudah, harusnya tampilan dari NetBeans akan tampak seperti gambar dibawah ini :

Tampilan Struktur Project

Pembuatan Aplikasi ServerSekarang buatlah sebuah class baru dan beri namaJPosServerdan simpan pada packageid.web.martinusadyh.iso8583.jpos. Karena kita menggunakan libraryjPOS, maka implementasi Server kita tidak serumit yang pertama.Dan inilah implementasi server kita yang menggunakan libraryjPOS: id.web.martinusadyh.iso8583.jpos.JPosServer.javapackage id.web.martinusadyh.iso8583.jpos;import java.io.IOException;import java.util.logging.Level;import java.util.logging.Logger;import org.jpos.iso.BaseChannel;import org.jpos.iso.ISOException;import org.jpos.iso.ISOMsg;import org.jpos.iso.ISOPackager;import org.jpos.iso.ISORequestListener;import org.jpos.iso.ISOServer;import org.jpos.iso.ISOSource;import org.jpos.iso.ServerChannel;import org.jpos.iso.channel.ASCIIChannel;import org.jpos.iso.packager.GenericPackager;/** * * @author Martinus Ady H */public class JPosServer implements ISORequestListener {/** * @param args the command line arguments */public static void main(String[] args) throws ISOException {String hostname = "localhost";int portNumber = 12345;// membuat sebuah packagerISOPackager packager = new GenericPackager("packager/iso93ascii.xml");// membuat channelServerChannel channel = new ASCIIChannel(hostname, portNumber, packager);// membuat serverISOServer server = new ISOServer(portNumber, channel, null);server.addISORequestListener(new JPosServer());new Thread(server).start();System.out.println("Server siap menerima koneksi pada port [" + portNumber+"]");}public boolean process(ISOSource isoSrc, ISOMsg isoMsg) {try {System.out.println("Server menerima koneksi dari ["+((BaseChannel)isoSrc).getSocket().getInetAddress().getHostAddress()+"]");if (isoMsg.getMTI().equalsIgnoreCase("1800")) {acceptNetworkMsg(isoSrc, isoMsg);}} catch (IOException ex) {Logger.getLogger(JPosServer.class.getName()).log(Level.SEVERE, null, ex);} catch (ISOException ex) {Logger.getLogger(JPosServer.class.getName()).log(Level.SEVERE, null, ex);}return false;}private void acceptNetworkMsg(ISOSource isoSrc, ISOMsg isoMsg) throws ISOException, IOException {System.out.println("Accepting Network Management Request");ISOMsg reply = (ISOMsg) isoMsg.clone();reply.setMTI("1810");reply.set(39, "00");isoSrc.send(reply);}}

Melihat perbedaan antara penulisan menggunakan libraryjPOSdengan menggunakanSocketbiasa ??? Jika belum, mari kita lihat bagaimana implementasi untuk client-nya.

Pembuatan Aplikasi ClientPembuatan aplikasi untuk client-nya pun tidak begitu susah, sekarang buatlah sebuah class baru dengan namaJPosClientdan simpan pada packageid.web.martinusadyh.iso8583.jpos. Setelah itu, pastekan kode dibawah ini :

id.web.martinusadyh.iso8583.jpos.JPosClient.javapackage id.web.martinusadyh.iso8583.jpos;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import org.jpos.iso.ISOException;import org.jpos.iso.ISOMUX;import org.jpos.iso.ISOMsg;import org.jpos.iso.ISOPackager;import org.jpos.iso.ISORequest;import org.jpos.iso.channel.ASCIIChannel;import org.jpos.iso.packager.GenericPackager;/** * * @author Martinus Ady H */public class JPosClient {/** * @param args the command line arguments */public static void main(String[] args) throws IOException, ISOException {String hostname = "localhost";int portNumber = 12345;// membuat sebuah packagerISOPackager packager = new GenericPackager("packager/iso93ascii.xml");// membuat channelASCIIChannel channel = new ASCIIChannel(hostname, portNumber, packager);ISOMUX isoMux = new ISOMUX(channel) {@Overrideprotected String getKey(ISOMsg m) throws ISOException {return super.getKey(m);}};new Thread(isoMux).start();// bikin network requestISOMsg networkReq = new ISOMsg();networkReq.setMTI("1800");networkReq.set(3, "123456");networkReq.set(7, new SimpleDateFormat("yyyyMMdd").format(new Date()));networkReq.set(11, "000001");networkReq.set(12, new SimpleDateFormat("HHmmss").format(new Date()));networkReq.set(13, new SimpleDateFormat("MMdd").format(new Date()));networkReq.set(48, "Tutorial ISO 8583 Dengan Java");networkReq.set(70, "001");ISORequest req = new ISORequest(networkReq);isoMux.queue(req);ISOMsg reply = req.getResponse(50*1000);if (reply != null) {System.out.println("Req ["+new String(networkReq.pack()) + "]");System.out.println("Res ["+new String(reply.pack()) + "]");}}}

Bagaimana tidak susah bukan ? Kode kita terlihat makin sederhanaNah jika sudah, sekarang coba lakukan prosesClean and Builddan jalankanlahJPosServerhingga muncul tampilan seperti dibawah ini :

Jika sudah menjumpai tampilan seperti diatas, sekarang jalankanlah aplikasi client-nya yaituJPosClient. Jika tidak ada pesan kesalahan, maka kita akan melihat tampilan seperti dibawah ini pada sisi client :

Dan tampilan seperti ini pada sisi server :

Sekarang cobalah secara bergantian jalankan server yang menggunakan classServerSocketbiasa dengan client yang menggunakan libraryjPOS. Begitu juga sebaliknya, client dari classSocketdan server yang menggunakan libraryjPOS. Seharus-nya sudah tidak ada masalah lagi.

REFERENSIDibawah ini adalah referensi-referensi yang penulis gunakan ketika menyusun buku ini, semoga bisa menjadi bahan referensi jika tulisan saya dirasa masih membingungkan. Secondary Bitmap in jPOS Bit and Byte Conversion Wikipedia ISO 8583 Introduction to ISO 8583 Wikipedia Hexadecimal

PENUTUPSemoga tulisan yang sangat sederhana ini bisa menjadi sumbangan buat kemajuan komunitas TI di Indonesia.