4.1. Fase Konstruksi dan Percobaan
4.1.6 Implementasi Sistem Penjual
Aplikasi server ini bertugas untuk menerima pesan yang
masuk, memproses pengisian pulsa dan selanjutnya memberikan
konfirmasi kepada pelanggan perihal transaksi pengisian pulsa
tersebut. Tugas pengisian pulsa ini dapat berjalan apabila serverdalam
keadaan hidup ”ON”. Berikut merupakan tampilan Sistem dalam
keadaan server ”OFF”. Dan otomatis akan menampilkan menu
konfigurasi server.
Gambar 64 Aplikasi server Sicho Cell
2. Konfigurasihandphone
Sebelum menjalankan aplikasi server, penjual harus melakukan
pengaturan koneksi antara aplikasi dengan handphone. Pengaturan
dapat dilakukan dengan memanggil halaman menu konfigurasi
handphone. Pengaturan tersebut untuk mengubah nilai port, boudrate,
flowcontrol, databits, stopbits, dan parity sesuai dengan kemampuan
handphoneyang terkoneksi.
Untuk memperoleh nama port digunakan perintah portList =
CommPortIdentifier.getPortIdentifiers(); dan hasilnya akan
disimpan ke dalam variabel vectorPort yang bertipe Vector.
Setelah dipilih port yang sesuai, dalam hal ini adalah COM4 dan
handphone yang digunakan adalah siemens C55 maka pengaturan
koneksinya adalah sebagai berikut.
Gambar 65 menu konfigurasi handphone
Setelah proses pengaturan sudah sesuai dengan handphone maka
langkah selanjutnya adalah menekan tombol ”START”. Berikut
merupakan listinguntuk menjalankan server.
Vector vectorPort = new Vector();
portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (!vectorPort.contains(portId.getName())) { vectorPort.addElement(portId.getName()); } } }
if (statusServer == 1) {
Enumeration portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) {
CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equalsIgnoreCase(portName)) { try {
port = (SerialPort) portId.open("SMS", 50000); statusServer = 2;
} catch (PortInUseException piue) { port.close(); return false; } } } } } if (statusServer == 2) { try { output = port.getOutputStream(); input = port.getInputStream(); } catch (IOException ioe) { port.close();
} }
if (statusServer == 2) { try {
dapatNilaiParameter(boudrate, databits, stopbits, parity, flowcontrol); port.setSerialPortParams(nilaiBaud, nilaiData, nilaiStop, nilaiParity); port.setFlowControlMode(nilaiFlow); port.notifyOnDataAvailable(true); kirimAT("AT" + "\15", 1250); kirimAT("AT+CMGF=0" + "\15", 1250); kirimAT("AT+CSCS=GSM" + "\15", 1250); kirimAT("AT+CNMI=1,1,2,2,1" + "\15", 1250); kirimAT("AT+CMGL=0" + "\15", 1250); statusServer = 3;
} catch (UnsupportedCommOperationException ucoe) { port.close(); return false; } } if (statusServer == 3) { try { port.addEventListener(this);
} catch (TooManyListenersException ex) {
Logger.getLogger(TampilanUtama.class.getName()).log(Level.SEVERE, null, ex); }
threadTerimaSMS = new ThreadBukaSMS(); threadTerimaSMS.start();
cekStatusPengirimanPulsa = new ThreadCekStatusPengirimanPulsa(); cekStatusPengirimanPulsa.start();
kirimSmsPelanggan = new ThreadKirimSmsPelanggan(); kirimSmsPelanggan.start();
kirimSmsPenyedia = new ThreadKirimSmsPenyedia(); kirimSmsPenyedia.start();
return true; }
return false; }
Setelah server berjalan server akan mengecek apakah ada pesan
baru masuk atau tidak, berikut listing yang dijalankan jika ada
pesan baru yang masuk.
Listingdi atas adalah listinguntuk membaca responsdari terminal.
Apabila ada responsdari terminal atau sms baru masuk maka akan
memanggil fungsi terimaAT. Berikut ini adalah listing program
dalam fungsi terimaAT.
while ((n = input.available()) > 0) {
n = input.read(bacaBuffer, bufferOffset, n); bufferOffset += n;
// Jika ada respons "\15" (Line Feed Carriage Return),
if ((bacaBuffer[bufferOffset - 1] == 10) && (bacaBuffer[bufferOffset - 2] == 13)) {
String buffer = new String(bacaBuffer, 0, bufferOffset - 2); terimaAT(buffer); bufferOffset = 0; } } st = new StringTokenizer(buffer, "\r\n"); while (st.hasMoreTokens()) { respons = st.nextToken(); try { if (respons.startsWith("RING")) { kirimAT("ATH0" + "\15", 100); } else if (respons.startsWith("+CMTI:")) { Pattern pattern = Pattern.compile(","); hasil = pattern.split(respons.trim()); Index = Integer.parseInt(hasil[1].trim()); kirimAT("AT+CMGR=" + Index + "\15", 1250); } else if (respons.startsWith("+CMGR:")) { PDU = 1; } else if (respons.startsWith("+CMGL")) { Pattern pattern = Pattern.compile(":"); hasil = pattern.split(respons.trim()); pattern = Pattern.compile(","); hasil = pattern.split(hasil[1].trim()); Index = Integer.parseInt(hasil[0].trim()); PDU = 1; } else if (PDU == 1) { prosesTerimaSms(Index, respons.trim()); PDU = 0; } else { }
Pada fungsi ini dilakukan parsingterhadap responsyang diperoleh
dari terminal. Data yang dilakukan parsing adalah berupa String.
Pada baris ” if (respons.startsWith("RING"))” disini akan dicek
apakah responsdari terminal berupa panggilan telepon atau bukan,
dan apabila berupa panggilan telepon maka akan dilakukan
pemutusan panggilan dengan perintah “kirimAT("ATH0" + "\15",
100);” . Pada baris “else if (respons.startsWith("+CMTI:"))” maka
akan dilakukan pembacaan dengan AT+CMGR
“kirimAT("AT+CMGR=" + Index + "\15", 1250);”, dan apabila
respons yang diterima memenuhi “else if
(respons.startsWith("+CMGR:"))” atau “else if
(respons.startsWith("+CMGL"))” maka selanjutnya akan
memanggil fungsi “prosesTerimaSms()”
Pada fungsi ini akan dilakukan penyimpanan data sms yang masuk
ke dalam tabel ”inbox_pelanggan” agar bisa diproses lebih lanjut.
Disini juga dilakukan penghapusan sms pada kartu SIM sehingga
kartu SIM tidak dipenuhi oleh SMS karena keterbatasan kapasitas
kartu SIM dalam menyimpan SMS.
dataPesan DP = new dataPesan(koneksi); try {
PduTerimaSms(Pdu); } catch (Exception e) { }
if (dapatNotlp.endsWith("F")) {
dapatNotlp = dapatNotlp.substring(0, dapatNotlp.length() - 1); }
kirimAT("AT+CMGD=" + Index + "\15", 1250);
Dalam keadaan ”ON” server dapat mendeteksi sms yang masuk
ataupun mengirim sms. Pada menu konfigurasi terdapat tombol
”STOP” yaitu tombol untuk mematikan server. Berikut merupakan
listinguntuk mematikan server.
Dalam listing diatas terdapat perintah untuk menutup koneksi dengan
database ” koneksi.close();”, juga terdapat perintah untuk
menghentikan thread-thread yang telah dijalankan pada saat penjual
menekan tombol ”START”.
3. Kelola data status pengisian pulsa
Setelah menghidupkan server maka menu status transaksi
pengisian pulsa yang dilakukan pelanggan akan muncul. Dalam menu
ini terdapat pilihan tampilan yaitu tampilkan semua pesan baik pesan
dengan status pengisian pulsa berhasil ataupun pengisian gagal, pesan
try {
if (!koneksi.isClosed()) { koneksi.close(); }
} catch (SQLException ex) { } port.close(); try { threadTerimaSMS.stop(); cekStatusPengirimanPulsa.stop(); kirimSmsPelanggan.stop(); kirimSmsPenyedia.stop(); } catch (Exception e) { } try { Thread.currentThread().sleep(500); } catch (Exception ex) {
}
dengan status pengisian berhasil saja dan pesan dengan status
pengisian gagal saja.
Gambar 66 menu status pengisian pulsa
Selain untuk melihat semua pesan transaksi terdapat juga tombol
untuk membatalkan transaksi yaitu apabila terdapat kesalahan
sistem dalam menentukan status pengisian pulsa. Misalkan
pelanggan A melakukan transaksi dan transaksi yang dia lakukan
gagal tetapi status dalam sistem transaksi pelanggan A tersebut
berhasil maka dapat dilakukan pembatalan transaksi dengan
menekan tombol ”BATALKAN TRANSAKSI” dengan terlebih
dahulu memilih pesan status pengisian yang bermasalah tersebut.
Terdapat juga fasilitas untuk menghapus pesan secara satu persatu
ataupun menghapus semua pesan sekaligus. Penghapusan pesan
dilakukan apabila pesan tersebut transaksi yang sudah lama
dilakukan dan terebih dahulu dibuatkan laporan transaksi.
Proses pengisian pulsa adalah sebagai berikut
Pesan yang masuk akan disimpan dalam tabel inbox_pelanggan
dengan status sms ”unread” dan akan dilakukan proses selanjutnya
apabila pesan tersebut berstatus sms ”unread” dan akan status akan
berubah menjadi ”read” apabila pesan sudah diproses pada fungsi
prosesInboxPelanggan().
Apabila diketemukan pesan dengan status “unread” maka pesan
tersebut akan diproses dengan memanggil fungsi
prosesInboxPelanggan() dan akan dicek data pesan apakah dari
pengirim yang berhak dan sesuai dengan format penulisan yang
ditentukan.
Apabila sesuai format dan dari pengirim yang benar pesan
ditampung dalam tabel ”pesan_transaksi” untuk selanjutnya
try {String sql_newSms = "select kode_inbox_pelanggan, no_telepon_pelanggan, isi_pesan from inbox_pelanggan where status_sms='unread'";
Statement stmtUnread = koneksi.createStatement();
ResultSet rsUnread = stmtUnread.executeQuery(sql_newSms);
while (rsUnread.next()) {
System.out.println("ketemu pesan yang unread"); dataId = rsUnread.getString("kode_inbox_pelanggan"); dataNoTelp = rsUnread.getString("no_telepon_pelanggan"); dataPesan = rsUnread.getString("isi_pesan");
prosesInboxPelanggan(dataId, dataNoTelp, dataPesan); }
dikirim ke penyedia pengisian pulsa, dalam sistem ini sebagai
penyedia adalah SEVEN CELL dan menunggu sms konfirmasi
status pengiriman pulsa dari SEVEN CELL.
Setelah mendapat sms konfirmasi status pulsa dari penyedia
pengisian pulsa (SEVEN CELL) maka dilakukan pengecekan
status pengisian pulsa dari penyedia terhadap permintaan dari
pelanggan, apabila status pengisian dari penyedia dan permintaaan
dari pelanggan sesuai maka dilakukan konfirmasi kepada
pelanggan sesuai dengan status dari penyedia pengisian pulsa
(SEVEN CELL). Berikut ini merupakan listing untuk mengirim
sms konfirmasi kepada pelanggan.
Pertama kali pesan dimasukan ke dalam fungsi PDUKirimSms()
sehingga didapat format PDU untuk dikirimkan melalui sms,
pengiriman ini dengan memanggil perintah “kirimAT("AT+CMGS="
+ (pesanPDUKirim.length() / 2) + "\15", 500);” diikuti “kirimAT("00"
+ pesanPDUKirim, 2500);” dan yang terakhir “kirimAT("\032",
100);”.
try {
String pesanPDUKirim = PDUKirimSms(notlp.trim(), pesan.trim()); kirimAT("AT+CMGS=" + (pesanPDUKirim.length() / 2) + "\15", 500); kirimAT("00" + pesanPDUKirim, 2500);
kirimAT("\032", 100);
Thread.currentThread().sleep(2000); } catch (InterruptedException ex) {
Logger.getLogger(TampilanUtama.class.getName()).log(Level.SEVERE, null, ex); }