BAB II TINJAUAN PUSTAKA 2.1 Short Message Service (SMS) SMS adalah layanan untuk mengirim dan menerima pesan tertulis (teks) dari maupun kepada perangkat bergerak (mobile device). Pesan teks yang dimaksud tersusun dari huruf, angka atau karakter alfanumerik. Pesan teks dikemas dalam satu paket / frame yang berkapasitas maksimal 160 byte yang dapat direpresentasikan dalam 160 karakter huruf latin atau 70 karakter alfabet non-latin seperti alfabet Arab atau Cina. SMS adalah data tipe asynchoronous message yang pengiriman datanya dilakukan dengan mekanisme protokol store and forward. Hal ini berarti bahwa pengirim dan penerima SMS tidak harus berada dalam status terhubung (connected / online) satu sama lain ketika akan saling bertukar pesan SMS. Pengiriman pesan SMS secara store and forward berarti bahwa pengirim menuliskan pesan dan nomor telepon tujuan kemudian mengirimkannya (store) ke server SMS (SMS-Center) yang kemudian bertanggung jawab untuk mengirimkan pesan tersebut (forward) ke nomor telepon tujuan. Keuntungan mekanisme store and forward pada SMS adalah penerima tidak perlu dalam status online ketika ada pengirim yang bermaksud mengirimkan pesan kepadanya karena pesan akan dikirim oleh pengirim ke SMSC yang kemudian dapat menunggu untuk meneruskan pesan tersebut ke penerima ketika ia siap dan dalam status online di lain waktu. Ketika pesan SMS telah terkirim dan diterima oleh SMSC, pengirim akan menerima pesan singkat (konfirmasi) bahwa pesan telah terkirim (message sent). Hal-hal inilah yang menjadi kelebihan SMS dan populer sebagai layanan praktis dari sistem telekomunikasi bergerak. 3 Gambar 2.1 Mekanisme store and forward pada pengiriman pesan SMS Keterbatasan SMS adalah pada ukuran pesan yang dapat dikirimkan yaitu maksimal 160 byte (Gupta, 2000). SMS dikirimkan menggunakan signalling frame pada kanal frekuensi atau time slot frame GSM yang biasanya digunakan untuk mengirimkan pesan untuk kontrol dan sinyal setup panggilan telepon, seperti pesan singkat tentang kesibukan jaringan atau pesan CLI (Caller Line indentification). 2.2 Sistem Kerja SMS Sistem kerja SMS didasari oleh konsep perintah AT Command dan konsep mode PDU (Protocol Data Units). 2.2.1 AT Command AT Command 2x berperan di balik tampilan menu messages sebuah ponsel yang bertugas mengirim / menerima data ke / dari SMS-Centre. Salah satu software yang dapat digunakan untuk menguji AT Command ini adalah Windows HyperTerminal. HyperTerminal biasanya telah tersedia bersama Windows Installer. Salah satu hal yang perlu diperhatikan dalam pengujian ini adalah nilai properties yang harus diisi yang bergantung pada jenis / alat komunikasi yang kita gunakan, misalnya ukuran bit per second atau baud rate dari SMS device yang dipergunakan. AT Command sebenarnya hampir sama dengan perintah “>” (prompt) pada DOS. Perintah-perintah yang dimasukkan ke port dimulai dengan kata AT kemudian diikuti oleh karakter lainnya yang memiliki fungsi-fungsi unik. Misalnya ATE1 yang digunakan untuk menanyakan status port. Jika sudah tidak dipakai lagi maka disarankan untuk menutup connection ini agar port / modem tersebut bisa digunakan untuk keperluan lainnya. Beberapa AT Command yang berkomunikasi dengan SMS-Centre adalah : 4 penting yang digunakan untuk AT+CMGS untuk mengirim SMS AT+CMGL untuk memeriksa SMS AT+CMGD untuk menghapus SMS AT Command untuk SMS biasanya diikuti oleh data I / O yang diwakili oleh unitunit PDU. 2.2.2 PDU sebagai bahasa SMS dan bagian-bagiannya Pada prinsipnya terdapat dua mode untuk mengirim dan menerima SMS, yaitu mode text dan mode PDU (Protocol Data Unit). Akan tetapi sistem mode text tidak didukung oleh semua operator GSM maupun terminal yang ada. Pada terminal, kita dapat mengeceknya dengan menggunakan perintah “AT+CMGF=1”. Jika hasilnya error, dapat dipastikan bahwa terminal anda tidak mendukung mode text. 2.2.2.1 Text mode Mode ini merupakan cara termudah untuk mengirim pesan. Pada mode text, pesan yang kita kirim tidak dilakukan konversi. Teks yang dikirim tetap dalam bentuk aslinya dengan panjang mencapai 160 (7 bit default alphabet) atau 140 (8 bit) karakter. Kelemahannya, kita tidak dapat menyisipkan gambar dan nada dering ke dalam pesan yang akan dikirim serta terbatasnya tipe enkoding. 2.2.2.2 Protocol Data Unit (PDU) mode PDU mode adalah format message dalam heksadesimal octet dan semidecimal octet dengan panjang mencapai 160 (7 bit default alphabet) atau 140 (8 bit) karakter. Kelebihan menggunakan PDU mode adalah dapat melakukan enkoding sendiri yang tentunya harus didukung oleh hardware dan operator GSM, melakukan kompresi data, menambahkan nada dering dan gambar pada pesan yang akan dikirimkan. Kita dapat mengeceknya dengan menggunakan perintah “AT+CSCS”. Kita dapat menambahkan header ke dalam pesan yang akan dikirim seperti timestamp, nomor SMSC dan meta-informasi lainnya. Data yang mengalir ke / dari SMS-Centre harus berbentuk PDU (Protocol Data Unit). PDU berisi bilangan-bilangan heksadesimal yang mencerminkan 5 bahasa I / O. PDU terdiri atas beberapa header. Header untuk kirim SMS ke SMSCentre berbeda dengan header SMS yang diterima dari SMS-Centre. PDU untuk kirim SMS ke SMS-Centre PDU untuk mengirim SMS terdiri atas delapan header, yaitu : 1. Nomor SMS-Center Header pertama ini terbagi atas tiga subheader, yaitu : a. Jumlah pasangan heksadesimal SMS-Centre dalam bilangan heksa. b. National / International code. Untuk nasional, kode subheader-nya 81 Untuk internasional, kode subheader-nya 91 c. No SMS-Centre dalam pasangan yang dibalik-balik. Jika tertinggal satu angka heksa yang tidak memiliki pasangan maka angka tersebut dipasangkan dengan huruf ‘F’ di depannya. Misalkan No SMS-Centre untuk telkomsel adalah 0811000000 untuk kode nasional atau 62811000000 untuk kode internasional, bisa diubah menjadi kode PDU 06818011000000 atau 07912618010000F0. Langkah-langkahnya adalah sebagai berikut : Cara I SMS-Centre : 0811000000 • 06 ada 6 pasang • 81 1 pasang Total = 6 pasang • 80-11-00-00-00 5 pasang Digabung menjadi kode PDU : 06818011000000 Cara II SMS-Centre : 62811000000 • 07 ada 7 pasang • 91 1 pasang • 26-18-01-00-00-F0 6 pasang Total = 7 pasang Digabung menjadi kode PDU : 07912618010000F0. Masing-masing nomor SMSC untuk masing-masing operator GSM di Indonesia tercantum seperti tabel di bawah. 6 Tabel 2.1 Nomor SMSC operator-operator GSM di Indonesia Kode Nasional Kode Internasional No Operator Seluler No SMSC Kode PDU No SMSC Kode PDU 1 Telkomsel 0811000000 06818011000000 62811000000 07912618010000F0 2 Satelindo 0816125 3 Excelcom 0818445009 06818081440590 62818445009 07912618485400F9 4 Indosat - M3 0855000000 06818055000000 62855000000 07912658050000F0 0581806121F5 62816125 059126181652 2. Tipe SMS Untuk mengirim SMS (SEND) maka tipe SMS-nya adalah 1. Jadi bilangan heksanya adalah 01. 3. Nomor Referensi SMS Nomor referensi ini diberikan nilai default 0 (heksadesimal = 00). 4. Nomor Ponsel Penerima Aturan penulisan header PDU untuk nomor ponsel penerima sama halnya dengan aturan penulisan header PDU SMS-Centre. Header ini juga terbagi atas tiga bagian yaitu : a. Jumlah bilangan desimal nomor ponsel yang dituju dalam bilangan heksa. b. Kode Nasional / Internasional. Subheader untuk kode nasional adalah 81 Subheader untuk kode internasional adalah 91 c. Nomor ponsel yang dituju dalam dalam pasangan bilangan heksa yang dibalik-balik. Jika tertinggal satu angka heksa yang tidak mendapat pasangan maka angka tersebut dipasangkan dengan huruf ‘F’ di depannya. Misalkan bahwa nomor ponsel yang dituju adalah 081338720083 maka kode PDU-nya dapat ditulis dengan 2 cara yaitu : Cara I No Ponsel yang dituju : 081 338 72 0083 • 0C ada 12 angka • 81 • 80-31-83-27-00-38 Digabung menjadi kode PDU : 0C81803183270038 7 Cara II No Ponsel yang dituju : 6281 338 72 0083 • 0D ada 13 angka • 91 • 26-18-33-78-02-80-F3 Digabung menjadi kode PDU : 0D91261833780280F3 5. Bentuk SMS Bentuk-bentuk SMS biasanya dibedakan menjadi tiga tipe yaitu : 0 00 dikirim sebagai SMS 1 01 dikirim sebagai telex 2 02 dikirim sebagai fax Jadi untuk mengirimkan data dalam bentuk SMS, digunakan kode PDU 00. 6. Skema Encoding Data I/O Skema encoding SMS yang ada sekarang ini menggunakan 2 bentuk skema encoding yaitu : a. Skema 7 bit ditandai dengan angka 0 00 (bilangan heksadesimal) b. Skema 8 bit ditandai dengan angka yang lebih besar dari 0 kemudian diubah menjadi angka heksadesimal yang sesuai. Kebanyakan ponsel / SMS Gateway yang ada di pasaran sekarang ini menggunakan skema 7 bit sehingga kita harus menggunakan kode 00. 7. Jangka waktu sebelum SMS habis waktunya (expired) Jika bagian ini di-skip maka kita tidak akan membatasi waktu berlakunya SMS. Sedangkan jika kita isi dengan suatu bilangan integer yang kemudian diubah ke pasangan heksadesimal tertentu maka bilangan yang kita berikan tersebut akan mewakili jumlah waktu validitas SMS tersebut. Rumus yang digunakan untuk menghitung jangka waktu validitas SMS adalah sebagai berikut : 8 Tabel 2.2 Jangka waktu validitas SMS Integer (INT) 0 – 143 Jangka waktu validitas SMS (INT +1) x 5 menit (berarti : 5 menit s/d 12 jam) 144 – 167 12 jam + ((INT -143) x 30 menit) 168 – 196 (INT – 166) x 1 hari 197 – 255 (INT – 192) x 1 minggu Supaya SMS yang kita kirim pasti bisa diterima di ponsel yang dituju maka sebaiknya kita tidak memberikan batasan waktu validitasnya. 8. Isi SMS Header ini terdiri dari 2 subheader, yaitu : a. Panjang isi (jumlah huruf) Misalnya untuk kata “kirim sms” ada 9 huruf 09 b. Isi yang berupa pasangan bilangan Heksadesimal Jika kita menggunakan ponsel / SMS Gateway berskema encoding 7 bit maka ketika kita mengetikkan suatu huruf dari keypadnya berarti kita telah membuat 7 angka 1 / 0 secara berurutan. Skema 7 bit tersebut diperlihatkan oleh tabel berikut ini. 9 Tabel 2.3 Skema encoding 7 bit b7 0 0 0 0 1 1 1 1 b6 0 0 1 1 0 0 1 1 b5 0 1 0 1 0 1 0 1 0 1 2 3 4 5 6 7 b4 b3 b2 b1 0 0 0 0 0 @ Δ SP 0 - P .. P 0 0 0 1 1 £ ! 1 A Q A Q 0 0 1 0 2 $ Φ “ 2 B R B R 0 0 1 1 3 ¥ Γ # 3 C S C S 0 1 0 0 4 è Λ 4 D T D T 0 1 0 1 5 é Ω % 5 E U E U 0 1 1 0 6 ù Π & 6 F V F V 0 1 1 1 7 ì Ψ ‘ 7 G W G W 1 0 0 0 8 ò Σ ( 8 H X H X 1 0 0 1 9 Ç Θ ) 9 I Y i Y 1 0 1 0 10 LF Ξ * : J Z J Z 1 0 1 1 11 Ø + ; K Ä K Ä 1 1 0 0 12 ø , < L Ö L Ö 1 1 0 1 13 CR - = M M Ñ 1 1 1 0 14 Å ß . > N Ü N Ü 1 1 1 1 15 å É / ? § O À O Ada dua langkah yang harus dilakukan untuk mengkonversikan isi SMS ke kode PDU, yaitu : Langkah Pertama adalah mengubahnya menjadi kode 7 bit. Langkah Kedua adalah mengubah kode 7 bit menjadi 8 bit yang diwakili oleh pasangan heksadesimal. Pesan “kirim sms” dikodekan menjadi 7 bit default alphabet (septet) sehingga harus di-enkode menjadi 8 bit (octet) untuk mendapatkan deretan kode PDUnya. Tabel di bawah ini menunjukkan cara pengkodean 7 bit menjadi 8 bit. 10 Tabel 2.4 Pengkodean 7 bit (septet) menjadi 8 bit (octet) Karakter Desimal (ASCII) Septet (7 bit) Octet(8 bit) Hexa k 107 1101011 1 1101011 EB i 105 110100 1 10 110100 B4 r 114 11100 10 001 11100 3C i 105 1101 001 1101 1101 DD m 109 110 1101 00000 110 <spasi> 32 01 00000 110011 01 CD s 115 1 110011 1101101 1 DB m 109 1101101 0 1110011 s 115 1110011 06 73 Dengan demikian hasil konversi kata “kirim sms” menjadi bilangan heksadesimal (kode PDU) adalah EBB43CDD06CDDB73. Setelah kita mendapatkan masing-masing header maupun subheader untuk mengirimkan SMS maka langkah selanjutnya adalah menggabungkan menjadi sebuah PDU yang lengkap. Misalkan untuk mengirimkan kata “kirim sms” ke ponsel dengan nomor 081338720083 melalui SMS-Centre Telkomsel tanpa membatasi jangka waktu validitas SMS maka PDU lengkapnya adalah: 0681801100000001000C81803183270038000009EBB43CDD06CDDB73 2.3 Mengirim dan memeriksa SMS menggunakan Hyperterminal Beberapa AT Command yang penting untuk SMS adalah sebagai berikut : AT+CMGS AT+CMGS digunakan untuk mengirim SMS. Syntax penulisannya adalah AT+CMGS = n. n merupakan jumlah pasangan heksa PDU SMS setelah nomor SMSC (maksimal 140 untuk sekali kirim) . Contoh: Untuk mengirimkan kata “hello” ke ponsel dengan nomor 6281338720083 melalui SMSC Telkomsel tanpa membatasi jangka waktu validitas SMS, maka : SMS-Centre : 07912618010000F0 11 PDU berikutnya : 01000D91261833780280F3000005E8329BFD06 (ada 19 pasangan heksa) PDU lengkapnya : 07912618010000F001000D91261833780280F3000005E8329BFD06 Jumlah pasangan heksa di atas adalah 19 sehingga nilai n = 19. Ini berarti AT Command-nya menjadi AT+CMGS = 19. Akhiri dengan “ENTER” setelah itu akan muncul respons sebuah prompt > seperti terlihat pada gambar di bawah ini : Gambar 2.2 AT+CMGS Setelah tanda prompt > isikanlah PDU yang sudah kita buat diatas lalu akhiri dengan CTRL+Z. Jika SMS sukses terkirim akan muncul pesan OK. Sebaliknya jika komunikasi gagal, akan muncul pesan +CMS ERROR. 12 Gambar 2.3 Melakukan input dan sent PDU AT+CMGL AT+CMGL mempunyai syntax penulisan AT+CMGL = n. AT+CMGL digunakan untuk memeriksa SMS antara lain : a. n = 0 untuk SMS baru di Inbox b. n = 1 untuk SMS lama di Inbox c. n = 2 untuk SMS unsent di Outbox d. n = 3 untuk SMS sent di Outbox e. n = 4 untuk semua SMS Contoh : Untuk memeriksa semua SMS maka kita menggunakan AT+CMGL = 4 kemudian akhiri dengan “ENTER”. 13 Gambar 2.4 Memeriksa SMS dengan AT+CMGL Dari gambar output diatas maka dapat diketahui ada 4 SMS yang ada di SIMCard, yaitu : 2.4 sebuah SMS Unsent di Outbox (n = 2) 3 buah SMS lama di Inbox (n = 1) Arsitektur Jaringan GSM Gambaran Umum arsitektur dari sebuah jaringan GSM dapat ditunjukan pada gambar berikut; Gambar 2.5 Arsitektur Jaringan GSM 14 Secara prinsip GSM dapat dibagi menjadi tiga subsystem antara lain; Mobile Station (MS) atau ponsel Base Station Sub-system (BSS), terdiri dari BSC dan beberapa BTS Network and Switching Subsystem (NSS), terdiri dari MSC dan beberapa register seperti (VLR,HLR,EIR,etc) 2.4.1 Mobile Station (MS) Mobile Station (MS) merupakan perangkat yang dapat berkomunikasi dengan menggunakan jaringan GSM. Telepon Selular dan PCMCIA plug-in cards. Meskipun MS bukan merupakan bagian dari wired network, MS mempunyai peran yang penting dalam fungsionalitas jaringan. MS membantu jaringan dalam mengukur kualitas sinyal radio untuk menentukan handover. 2.4.2 Base Station Subsystem (BSS) BSS terdiri dari BTS (Base Transceiver Station) dan BSC (Base Station Controller). BTS menyediakan dan mengelola akses radio ke Mobile Station dan ke system secara keseluruhan. Didalam BTS biasanya kita akan menemukan TRX (Radio Transmitter/Receiver ), perangkat untuk kontrol dan proses “signalling” dan tentu saja antena. BSC bertugas untuk mengalokasikan channel selama proses call berlangsung dan juga memonitor kualitas dari proses call tersebut seperti kekuatan signalling dari Mobile Station dan BTS serta mengelola proses “Handover” (jika MS berpindah posisi dari satu “cell” ke “cell” lain. Gambar 2.6 : Arsitektur logical structure pada BSS. 15 BSC merupakan unit kontrol dari BSS, dimana satu BSC dapat terhubung dengan beberapa BTS. BSC menangani alokasi dari kanal radio, frequency hopping, handover dari BTS ke BTS (kecuali pada inter-MSC-handover di mana pengontrolan berada pada tangung jawab MSC). Fungsi penting BSC adalah sebagai konsentrator dimana berbagai koneksi berkecepatan rendah yang terhubung ke BTS akan berkurang sampai sejumlah kecil koneksi yang menuju MSC. BSC menyediakan informasi yang dibutuhkan untuk Network Managemen tSubsystems (NMS). Database untuk semua tempat, termasuk informasi seperti frekuensi pembawa, daftar frekuensi hopping, level pengurangan daya, penerimaan sinyal untuk perhitungan batas sel, semuanya disimpan di BSC. Data ini diperoleh langsung dari bagian perencanaan radio yang mengikutsertakan pemodelan dari propagasi sinyal begitupula dengan proyeksi trafik. Dalam BTS terdapat radio penerima dan pengirim dalam satu sel jaringan GSM yang menangani protokol hubungan radio dengan telepon pelanggan. Daerah perkotaan yang besar sangat membutuhkan sejumlah besar BTS, dengan begitu kebutuhan untuk BTS adalah keharusan, mudah dipindahkan dan biayanya yang seminimum mungkin. BTS yang jangkauan luasnya lebih besar dari picocell memiliki beberapa pengirim dan penerima (TRX), yang melayani beberapa frekuensi yang berbeda dan sektor sel yang berbeda. BTS pada umumnya memiliki 1 sampai 12 TRX dalam 1, 2, atau 3 sektor walaupun jumlah ini berbeda-beda. 2.5 Fastrack Supreme 20 FASTRACK yang digunakan dalam pembuatan aplikasi ini adalah FASTRACK Supreme 20, di bawah ini adalah gambaran/deskripsi umum dari FASTRACK Supreme 20: 16 Gambar 2.7 Deskripsi Umum FASTRACK Supreme 20 Seperti yang terlihat dari Gambar 2.7 diatas Gambar pertama menunjukkan konektor DB-15 (Sub HD) yang berfungsi untuk menerima dan mengirim data kepada PC. Micro-Fit konektor berfungsi untuk memberikan supply tegangan pada FASTRACK. Pada gambar kedua terdapat dua bagian penting yaitu konektor SMA yang berfungsi sebagai interface dengan antena dan konektor SIM yang berfungsi sebagai tempat penyimpan kartu SIM. Pada gambar ke tiga terdapat konektor IES yang dapat digunakan untuk menambahkan fitur pada FASTRACK antara lain GPS, USB,I/O. Konektor ini terdapat di bagian belakang plat besi yang dapat dibuka bila dibutuhkan. Masing-masing konektor di atas akan dijelaskan lebih lanjut pada sub-bagian di bawah ini. 2.5.1 Konektor Antena Antena konektor yang digunakan memiliki tipe SMA untuk koneksi RF 50Ώ. Dibawah ini adalah gambar konektor antena dari FASTRACK. 17 Gambar 2.8 Gambar Konektor Antena pada FASTRACK Konektor antena ini sangat penting dalam penggunaan FASTRACK, sebelum menghidupkan FASTRACK konektor harus terlebih dahulu disambungkan, bila tidak dilakukan maka kemungkinan besar FASTRACK akan rusak. Antena yang di gunakan harus disesuaikan dengan kebutuhan pemakaian. 2.5.2 Konektor HD-15pin Fungsi dari konektor ini adalah: Koneksi serial RS232 Koneksi Audio Koneksi sinyal BOOT dan RESET Gambar 2.9 Konektor HD 15-pin Pin 3 pada konektor ini adalah pin BOOT dan memiliki peran penting untuk melakukan re-install Firmware pada FASTRACK. Pin 14 adalah RESET, yang memiliki fungsi untuk melakukan reset secara hardware pada FASTRACK atau dapat disebut Hard RESET. Untuk melakukan Hard RESET pin ini harus dihubungkan pada GND (Ground) atau diberi sinyal 18 LOW. Selain itu reset juga dapat di lakukan dengan AT command melalui HyperTerminal dengan mengetikkan AT+CFUN=1. 2.5.3 Konektor IES Konektor IES adalah konektor board-to-board 50 pin yang digunakan untuk menambahkan fitur pada FASTRACK seperti GPS/USB/IO expander. Gambar 2.10 Konektor IES Selain itu FASTRACK SUPREME 20 memiliki fitur tambahan Serial Port Auto Shut Down yang berfungsi untuk menghemat konsumsi daya saat tidak ada komunikasi data antara FASTRACK dengan DTE (Data Terminal Equipment) yang dalam hal ini adalah komputer PC kita. 2.6 Pengaturan Komunikasi FASTRACK Supreme 20 Dengan Komputer Pengaturan komunikasi ini sangat penting agar data yang dikirimkan oleh DTE yaitu komputer kepada FASTRACK dan sebaliknya dapat diterima dengan baik. Beberapa tahap penting yang harus dilakukan dalam pengaturan ini adalah: Hubungkan RS232 antara FASTRACK dengan port COM pada komputer. Untuk menentukan pada port COM berapa komunikasi dapat dilakukan adalah lewat: Control Panel System Pilih tab Hardware klik Device Manager Maka akan tampil menu seperti di bawah ini: 19 Gambar 2.11 Menu Tampilan Pada Device Manager Pada pilihan PORT (COM & LPT) maka akan tampil keterangan port COM mana yang sedang digunakan. Jalankan HyperTerminal lewat: Start All Program Accessories Communication HyperTerminal. Gambar 2.12 Tampilan Menu Awal pada HyperTerminal Setelah masuk pada menu isikan nama yang ingin di berikan lalu pilih OK. Maka akan muncul menu baru pilih pada bagian “Connect Using:” sesuai koneksi port yang sedang dijalankan. 20 Gambar 2.13 Tampilan Menu HyperTerminal Maka akan muncul menu baru. Pada menu ini ada beberapa hal yang perlu diperhatikan yaitu: Bit per second : 115.200 bps Data bit: 8 Parity: None Stop Bit: 1 Flow Control: Hardware Setelah setting ini dilakukan pilih OK maka akan tampil halaman putih. Di halaman inilah kita akan mengetikkan perintah-perintah AT command . Untuk melakukan test apakah port COM sudah siap berkomunikasi dengan koneksi Serial dengan FASTRACK dapat dilakukan dengan mengetikkan perintah-perintah dibawah ini: o AT lalu Enter, maka Hyperterminal akan merespon dengan OK yang berarti port komunikasi sudah siap digunakan o AT+CPIN? Untuk melakukan test apakah pin SIM card sudah siap dimasukkan. Bila sudah maka akan terlihat respon READY 21 +CPIN: 2.7 Program Pendukung Aplikasi Polling SMS 2.7.1 Java Berbicara mengenai Java berarti ada dua bagian yang menjadi topik pembicaraan, yakni Java sebagai bahasa pemrograman dan Java sebagai platform. Sebagai bahasa pemrograman, Java dikenal sebagai bahasa pemrograman tingkat tinggi dengan fitur-fitur utama antara lain : Simple, Object Oriented, Robust & Secure, Architectre Neutral & Portable serta High Performance. Sebagai sebuah platform, Java terdiri atas dua bagian utama, yakni : Java Virtual Machine (JVM) dan Java Application Programming Interface (Java API) (Wicaksono, 2002). Dalam bahasa pemrograman Java dikenal dua istilah yang sangat penting dan perlu dipahami secara mendalam yaitu kelas (class) dan objek (object). class merupakan blueprint atau template yang menggambarkan data (variabel) dan method (fungsi-fungsi) dari object yang bersangkutan. Jadi class merupakan prototipe yang mendifinisikan variabel-variabel dan method-method secara umum. Sedangkan object merupakan instansiasi dari suatu class tertentu. Sebuah class pada prinsipnya merupakan deskripsi dari bagaimana sebuah objek dibuat. Untuk setiap objek, terdapat sebuah class yang menentukan bagaimana objek tersebut dibuat, variabel apa yang akan dimuat dan pesan apa yang akan ditanggapi. Sebuah objek merupakan kombinasi dari kode (fungsi) dan data (variabel) yang digabung menjadi satu entitas. Fungsi di dalam objek disebut method dan data di dalamnya disebut sebagai variabel. Pemanggilan suatu method di objek dapat diartikan sebagai pengiriman pesan ke objek. Java adalah sebuah bahasa pemrograman berorientasi object (Object Oriented Programming) yang mendukung konsep encapsulation, inheritance dan polymorphism. Encapsulation merupakan suatu mekanisme dalam bahasa pemrograman berorientasi objek untuk menyembunyikan data, struktur internal dan detail implementasi dari beberapa elemen. Seluruh komunikasi ke dalam objek akan dilakukan melalui public interface-nya (method yang dideklarasikan public). Inheritance merupakan suatu ciri dari bahasa pemrograman berorientasi objek dimana suatu class merupakan implementasi khusus dari suatu base class (kelas induk), atribut-atribut dan method-method dari dari base class-nya akan secara langsung dimiliki oleh sub class-nya. Polymorphism merupakan suatu konsep 22 bahwa dua atau lebih class dari suatu objek bisa memberikan respon yang berbeda untuk message yang sama. Sebagai bahasa pemrograman java cukuplah unik. Pada umumnya sebuah bahasa pemrograman dikelompokkan ke dalam bahasa yang compiled atau interpreted. Tetapi java menganut keduanya. Pada proses kompilasi java akan diubah menjadi bahasa tingkat menengah (intermediate language) yang disebut dengan bytecodes. Kemudian bahasa tingkat menengah yang dihasilkan dari proses kompilasi ini akan oleh JVM (Java Virtual Machine) akan dijalankan pada platform yang digunakan. Editor / IDE . Java File Java Compiler javac.exe . class File (Byte Codes) JavaVirtual Machine (Interpreter) java.exe Gambar 2.14 Proses kompilasi Java Sebagai sebuah platform, java memiliki motto yang sangat terkenal yaitu “write once run anywhere”. Jika kita mengembangkan aplikasi dengan Java maka kita bisa menjalankan aplikasi kita di komputer dengan sistem operasi yang berbeda-beda tanpa perlu melakukan perubahan pada source code aplikasi kita. Sebagai kumpulan library atau API, Java memiliki cukup banyak library yang siap digunakan untuk membangun aplikasi. Kita sebagai developer tidak akan terlalu direpotkan menciptakan library baru untuk mengembangkan aplikasi dengan Java. Library-library Java yang sudah ada sekarang ini adalah : Java Foundation Classes (JFC), Java 2D API, Java Database Connectivity (JDBC), Java Cryptography Extension (JCE), Java Speech API (JSAPI), Java 3D dan JavaServer Pages (JSP). Pada saat sekarang ini Java dibagi menjadi 3 platform yaitu Standar Edition, Enterprise Edition, dan Micro Edition. Pada dasarnya ketiga edisi ini memiliki kesamaan dari segi syntax dan arsitektur, hanya dari namanya sudah 23 terlihat bahwa masing-masing edisi digunakan untuk mengembangkan aplikasi di platform yang berbeda. Java 2 Standard Edition (J2SE) Merupakan versi standar dari Java 2 SDK (Standard Develompent Kit) yang berisikan tools untuk melakukan kompilasi dan menjalankan aplikasi Java dan terdiri dari API (Application Programming Interface) yang akan digunakan oleh para developer untuk mengembangkan aplikasi Java seperti applets ataupun aplikasi-aplikasi berbasis dekstop seperti GUI (Graphical User Interface). Java 2 Enterprise Edition (J2EE) Versi enterprise ini memudahkan untuk mengembangkan aplikasi-aplikasi untuk kelas enterprise karena java telah menyediakan komponen-komponen standar untuk mengembangkan aplikasi multitier. Dengan disediakannya komponen-komponen ini pengembangan aplikasi dapat dilakukan dengan lebih mudah, lebih cepat dan lebih terfokus ke arah implementasi bisnis daripada ke implementasi infrastruktur. Adapun komponen-komponen yang disediakan adalah Enterprise Java Bean (EJB), Servlet, JavaServer Pages, JDBC dan lain-lain. Java 2 Micro Edition (J2ME) Versi ini lebih digunakan ke arah awal dari lahirnya Java yaitu untuk mengembangkan aplikasi-aplikasi pada handheld device seperti Handphone, Pocket PC, PDA. Java micro edition bisa dikatakan sebagai versi Java yang di-optimezed sehingga bisa digunakan untuk mengontrol peralatan-peralatan kecil baik kecil dari segi fisik maupun kecil dari memori yang dimiliki. 2.7.2 2.7.2.1 Sebagian Fitur dari Java Java Virtual Mechine (JVM) JVM adalah sebuah mesin imajiner (maya) yang bekerja dengan menyerupai aplikasi pada sebuah mesin nyata. JVM menyediakan spesifikasi hardware dan platform dimana kompilasi kode Java terjadi. Spesifikasi inilah yang membuat aplikasi berbasis Java menjadi bebas dari platform manapun karena proses kompilasi diselesaikan oleh JVM. 24 Aplikasi program Java diciptakan dengan file teks berekstensi .java. Program ini dikompilasi menghasilkan satu berkas bytecode berekstensi .class atau lebih. Bytecode adalah serangkaian instruksi serupa instruksi kode mesin. Perbedaannya adalah kode mesin harus dijalankan pada sistem komputer dimana kompilasi ditujukan, sementara bytecode berjalan pada java interpreter yang tersedia di semua platform sistem komputer dan sistem operasi. 2.7.2.2 Code Security Code Security terimplementasi pada Java melalui penggunaan Java Runtime Environment (JRE). Java menggunakan model pengamanan 3 lapis untuk melindungi sistem dari untrusted Java Code. 1. Pertama, class-loader menangani pemuatan kelas Java ke runtime interpreter. Proses ini menyediakan pengamanan dengan memisahkan kelas – kelas yang berasal dari local disk dengan kelas – kelas yang diambil dari jaringan. Hal ini membatasi aplikasi Trojan karena kelas – kelas yang berasal dari local disk yang dimuat terlebih dahulu. 2. Kedua, bytecode verifier membaca bytecode sebelum dijalankan dan menjamin bytecode memenuhi aturan – aturan dasar bahasa Java. 3. Ketiga, manajemen keamanan menangani keamanan tingkat aplikasi dengan mengendalikan apakah program berhak mengakses sumber daya seperti sistem file, port jaringan, proses eksternal dan sistem windowing. Setelah seluruh proses tersebut selesai dijalankan, barulah kode program di eksekusi. Java juga menyediakan beragam teknik pengamanan lain : 1. Bahasa dirancang untuk mempersulit eksekusi kode perusak. Peniadaan pointer merupakan langkah besar pengamanan. Java tidak mengenal operasi pointer. Di tangan pemrogram handal, operasi pointer merupakan hal yang luar biasa untuk optimasi dan pembuatan program yang efisien serta mengagumkan. Namun mode ini dapat menjadi petaka di hadapan pemrogram jahat. Pointer merupakan sarana luar biasa untuk pengaksesan tak diotorisasi. Dengan peniadaan operasi pointer, Java dapat menjadi bahasa yang lebih aman. 25 2. Java memiliki beberapa pengaman terhadap applet. Untuk mencegah program bertindak mengganggu media penyimpanan, maka applet tidak diperbolehkan melakukan open, read ataupun write terhadap berkas secara sembarangan. Karena Java applet dapat membuka jendela browser yang baru, maka jendela mempunyai logo Java dan teks identifikasi terhadap jendela yang dibuka. Hal ini mencegah jendela pop-up menipu sebagai permintaan keterangan username dan password. 2.7.3 Pengenalan JDBC Java Database Connectivity (JDBC) merupakan Application Programming Interface (API), dalam paket java.sql.*, yang memungkinkan untuk mengakses segala database menggunakan Java. Dari JDBC ini kemudian muncul konsep konsep yang berdiri di atas JDBC, Akses database dengan Java dan JDBC Pada dasarnya, untuk mengakses database dengan Java JDBC, diperlukan langkah langkah berikut : Load Database Driver Buat koneksi Lakukan pemrosesan query Tutup koneksi Berdasarkan langkah di atas maka kita memerlukan Database Driver dari masing masing vendor database (misalnya untuk MySQL bisa diunduh dari http://mysql.com ) . 2.8 MySql Sebagai Database MySql adalah sebuah Relational Database Management System (RDBMS) yang berfungsi sebagai database server yang memiliki beberapa keistimewaan yaitu : Portability, Open Source, Multiuser, Performance Tuning yang tinggi, Column Types yang komplek, Command & Function yang mendukung perintah SELECT dan WHERE secara penuh dalam query, Security, Scalability, Connectivity, Interface serta struktur tabel yang lebih fleksibel. Kehandalan suatu sistem database (DBMS) dapat diketahui dari cara kerja optimizer-nya dalam melakukan proses perintah-perintah SQL yang dibuat oleh 26 user maupun program-program aplikasinya. MySql dapat dikatakan lebih unggul dibandingkan dengan database server lainnya dalam query data. Hal ini terbukti untuk query yang dilakukan oleh single user, kecepatan query MySql bisa sepuluh kali lebih cepat dari PostgreSQL dan lima kali lebih cepat jika dibandingkan Interbase. 27 3.4 Perancangan dan Pembuatan Aplikasi Layanan Polling SMS Pada tahap perancangan aplikasi ini, akan dijelaskan mengenai struktur tabel serta beberapa algoritma program yang digambarkan dalam bentuk flowchart program. 3.4.1 Skema database Aplikasi ini menggunakan 5 buah tabel yang digunakan, yaitu: a. Tabel SMS Masuk Membuat tabel SMS Masuk pada jendela polling maka langkah selanjutnya adalah memasukan beberapa perintah SQL ke dalam layar SQL pada NetBean dengan : table ( klik kanan) execute command memasukkan command SQL sebagai berikut : CREATE TABLE SMS_MASUK (id_masuk int(11) NOT NULL auto_increment, no_telepon_masuk varchar(100) NOT NULL default '', tanggal_masuk varchar(100) NOT NULL default '', jam_masuk varchar(100) NOT NULL default '', isi_pesan_masuk varchar(160) NOT NULL default '', status_masuk varchar(100) NOT NULL default '', PRIMARY KEY (id_masuk)) ENGINE=MyISAM DEFAULT CHARSET=latin1; perintah tersebut adalah untuk membuat tabel data_sms_masuk dengan format sebagai berikut; Tabel 3.1 SMS Masuk No.Telp. Masuk Tanggal Jam Masuk Masuk Isi Pesan Masuk Status Masuk Dimana primary key adalah Id_masuk, semua format kolom berupa varchar. 31 Gambar 3.1 Tabel SMS Masuk pada Data Base b. Tabel Data Base Polling Membuka MySQL Command Line Client , untuk membuat database yang akan digunakan dalam aplikasi ini, dengan nama polling seperti yang terlihat pada Gambar dibawah ini: Gambar 3.2 Membuat data base polling pada MySQL 32 MySQL Command Client ini hanya digunakan untuk membuat nama database, untuk selanjutnya manambah tabel ke dalam database ini, menggunakan NetBean IDE 6.0, Adapun langkah – langkahnya adalah sebagai berikut: Gambar 3.3 Data Base Polling SERVICE Database (klik kanan) new connection New Database Connection seperti yang terlihat pada gambar diatas. c. Tabel Data Pertanyaan Polling Untuk membuat dan menambah tabel data pertanyaan polling pada data base polling ini , maka langkah selanjutnya adalah memasukan beberapa perintah SQL ke dalam layar SQL pada NetBean dengan ; table ( klik kanan) execute command memasukkan command SQL sebagai berikut : CREATE TABLE data_pertanyaan_polling (kode_pertanyaan varchar(100) NOT NULL default '', isi_pertanyaan varchar(100) NOT NULL default '', pilihan_a varchar(100) NOT NULL default '',pilihan_b varchar(100) NOT NULL default'', pilihan_c varchar(100) NOT NULL 33 default'', PRIMARY KEY (kode_pertanyaan)) ENGINE=MyISAM DEFAULT CHARSET=latin1; Gambar 3.4 Tabel Data Pertanyaan Polling perintah tersebut adalah untuk membuat tabel data_pertanyaan_polling dengan format sebagai berikut; Tabel 3.2 Data Pertanyaan Polling Kode Dimana Isi Pertanyaan Pilihan A primary key adalah kode_pertanyaan, Pilihan B Pilihan C semua format kolom berupa varchar. d. Tabel Data Hasil Polling Untuk membuat dan menambah tabel hasil polling pada data base polling ini , maka langkah selanjutnya adalah memasukan beberapa perintah SQL ke dalam layar SQL pada NetBean dengan ; 34 Gambar 3.5 Tabel Data Hasil Polling table ( klik kanan) execute command memasukkan command SQL sebagai berikut : CREATE TABLE data_hasil_polling (no_urut int(11) NOT NULL auto_increment,kode_pertanyaan varchar(100) NOT NULL default '', pilihan varchar(100) NOT NULL default varchar(100) NOT NULL default'', '',no_telepon_pengirim PRIMARY KEY (no_urut)) ENGINE=MyISAM DEFAULT CHARSET=latin1; perintah tersebut adalah untuk membuat tabel data_hasil_polling dengan format sebagai berikut; Tabel 3.3 Data Hasil Polling Kode Pilihan No. Telp Pengirim Dimana primary key adalah no_urut, semua format kolom berupa varchar. 35 e. Tabel SMS Keluar Membuat tabel SMS keluar pada jendela polling maka langkah selanjutnya adalah memasukan beberapa perintah SQL ke dalam layar SQL pada NetBean dengan : table ( klik kanan) execute command memasukkan command SQL sebagai berikut : CREATE TABLE SMS_KELUAR (id_keluar int(11) NOT NULL auto_increment, no_telepon_keluar varchar(100) NOT NULL default '', tanggal_keluar varchar(100) NOT NULL default '', jam_keluar varchar(100) NOT NULL default '', isi_pesan_keluar varchar(160) NOT NULL default '', status_keluar varchar(100) NOT NULL default '', PRIMARY KEY (id_keluar)) ENGINE=MyISAM DEFAULT CHARSET=latin1; perintah tersebut adalah untuk membuat tabel data_sms_keluar dengan format sebagai berikut; Tabel 3.4 SMS Keluar No.Telp. Keluar Tanggal Jam Keluar Keluar Isi Pesan Keluar Status Keluar Dimana primary key adalah Id_keluar, semua format kolom berupa varchar. 36 Gambar 3.6 Tabel SMS Keluar 3.4.2 Flowchart program Algoritma program dalam aplikasi ini akan dijelaskan dalam bentuk flowchart. Beberapa flowchart dari fungsi-fugsi penting yang digunakan adalah sebagai berikut : 3.4.2.1 Flowchart program untuk Proses Pendukung Aplikasi Polling SMS Flowchart program pada aplikasi Polling SMS terdiri dari berbagai proses didalamnya yang mendukung aplikasi ini, tapi dalam hal ini ada beberapa proses yang diambil pada aplikasi ini dengan fungsi-fungsi tertentu. Beberapa proses tersebut yang dijelaskan dalam bentuk flowchart adalah sebagai berikut: 1. Flowchart private void koneksiDatabase() 37 START boolean driver = false Class.forName(this.driverJDBC) tulis_proses("Mencoba Loading Driver JDBC") tulis_proses(this.driverJDBC) driver = true Exception try catch (ClassNotFoundException not) SKIP BODY SmitDev.SmsServer.Server.proses_Gagal("Sms Server Error", "Tidak Menemukan Driver -- " + this.driverJDBC +"\n" + not.getMessage()) tulis_proses("Tidak Menemukan Driver -- " + this.driverJDBC + "\n"+not.getMessage()) driver == true tulis_proses("Loading Driver JDBC Sukses") tulis_proses("Mencoba melakukan sambungan dengan Database Server") tulis_proses(url) koneksi = java.sql.DriverManager.getConnection(url, user, password) tulis_proses("Koneksi Database Server Sukses") koneksiPerangkat() Exception try SKIP BODY catch (java.sql.SQLException sqln) SmitDev.SmsServer.Server.proses_Gagal("Sms Server Error", "Gagal Koneksi Database -- " + sqln.getMessage()) tulis_proses("Gagal Koneksi Database -- " + sqln.getMessage()) END 38 2. Flowchart untuk koneksi perangkat (private void koneksiPerangkat()) START SmitDev.SmsServer.Server.koneksiTerminal (nilaiSerialPort, nilaiBitPerSecond, nilaiDataBits, nilaiParity, nilaiStopBit, nilaiFlowControl) Exception try SKIP BODY catch (java.util.TooManyListenersException tmle) System.out.print(tmle.getMessage()) SmitDev.SmsServer.Server.kirimAT("ATE1" + "\15", 1000) SmitDev.SmsServer.Server.kirimAT("AT+CNMI=1,1,2,2,1" + "\15", 1250) SmitDev.SmsServer.Server.kirimAT("AT+CGMI" + "\15", 1000) SmitDev.SmsServer.Server.kirimAT("AT+CGMM" + "\15", 1000) SmitDev.SmsServer.Server.kirimAT("AT+CGSN" + "\15", 1000) SmitDev.SmsServer.Server.kirimAT("AT+COPS?" + "\15", 1000) SmitDev.SmsServer.Server.kirimAT("ATH0" + "\15", 500) END 39 3. Flowchart public void inputDataTabelSmsMasuk(String notlp, String pesan) START String notlp String pesan getWaktu() String tanggalHari = tanggal + "-" + bulan + "-" + tahun String jamHari = jam + ":" + menit + ":" + detik java.sql.PreparedStatement pStatement = koneksi.prepareStatement("Insert Into SMS_KELUAR(NO_TELEPON_KELUAR,ISI_PESAN_KELUAR,STATUS_KELUAR,TANGGAL_KELUAR, JAM_KELUAR) Values (?,?,?,?,?)") Exception e try SKIP BODY pStatement.setString(1, notlp) pStatement.setString(2, pesan) pStatement.setString(3, "WAIT") pStatement.setString(4, tanggalHari) pStatement.setString(5, jamHari) pStatement.executeUpdate() statusInputSmsKeluar = true Exception ei Catch(Exception e) try catch (Exception ei) SKIP BODY pStatement.close() END 40 4. Flowchart private void terimaResponAT(String buffer) START String buffer String tanggal_sms = "" String jam_sms = "" String tlp_sms = "" String isi_sms = "" java.util.StringTokenizer st = new java.util.StringTokenizer(buffer, "\r\n") st.hasMoreTokens() false true merek false seri true false imei respons.starts With ("+COPS:") nilaiIMEI = respons imei = false false respons.starts With ("AT+CGSN") true true seri = true imei = true 41 respons.starts With ("ATH0") true java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(",") String[] hasil = pattern.split(respons.trim()) nilaiOperator = hasil[2].trim() false false true true true respons.starts With ("AT+CGMM") false nilaiSeri = respons seri = false respons.starts With ("AT+CGMI") merek = true C true nilaiMerek = respons merek = false false respons = st.nextToken() tulis_proses(respons) false Sedang terhubung respons.starts With ("+CMGR:") true bacaSMS = true bacaSMS A B respons.starts With("+CMTI:") false true java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(":") String[] hasil = pattern.split(respons.trim()) pattern = java.util.regex.Pattern.compile(",") hasil = pattern.split(hasil[1].trim()) Index = Integer.parseInt(hasil[1].trim()) SmitDev.SmsServer.Server.kirimAT("AT+CPMS=" + hasil[0].trim() + "\15", 1250) SmitDev.SmsServer.Server.kirimAT("AT+CMGR=" + Index + "\15", 1250) false (respons.starts With("+CMGS:") true tulis_proses("Pesan Berhasil Dikirim") new prosesDatabaseSmsServer(koneksi).updateStatusData(id_Sms_Kirim, “SEND") this.thKirim.resume() respons.startsWith ("+CMS ERROR:") true tulis_proses("Pesan GAGAL Dikirim") new prosesDatabaseSmsServer(koneksi).updateStatusData(id_Sms_Kirim, "NO") this.thKirim.resume() st.hasMoreTokens() false END 42 true C A SmitDev.SmsServer.Server.terimaSMS(respons.trim() id_sms = String.valueOf(Index) tlp_sms = SmitDev.SmsServer.Server.noTlpPengirim isi_sms = SmitDev.SmsServer.Server.isiPesanTerima new prosesDatabaseSmsServer(koneksi).inputDataTabelSmsMasuk(tlp_sms, isi_sms) SmitDev.SmsServer.Server.kirimAT("AT+CMGD=" + id_sms + "\15", 1250) bacaSMS = false Exception e try true SKIP BODY catch (Exception e) e.getMessage() B 5. Flowchart public void tulis_proses(String data) START String data getWaktu() String waktu = jam + ":" + menit + ":" + detik String ddmmyy = tanggal + bulan + tahun data = "\"" + waktu + "\", \"" + data + "\"\015" byte b[] = data.getBytes() java.io.File outputx = new java.io.File(ddmmyy + ".SmitDevSmsServer") java.io.RandomAccessFile random = new java.io.RandomAccessFile(outputx, "rw") random.seek(outputx.length()) random.write(b) random.close() IOException ex try SKIP BODY catch (java.io.IOException ex) System.out.println(ex) END 43 6. Flowchart private void tampilTabelSmsMasuk() START int row = tabSMSMasuk.getRowCount() int i = 0 false i < row true tabSMSMasuk.removeRow(0) i++ getWaktu() String tanggal_hari_ini = tanggal+"-"+bulan+"-"+tahun; String sql = "SELECT COUNT(id_MASUK) as jml FROM SMS_MASUK WHERE tanggal_MASUK = '"+tanggal_hari_ini+"'" String sql2 = "SELECT * FROM SMS_MASUK WHERE tanggal_MASUK = '"+tanggal_hari_ini+"' ORDER BY TANGGAL_MASUK DESC , JAM_MASUK DESC" String sql3 ="SELECT COUNT(id_MASUK) as jml2 FROM SMS_MASUK WHERE status_MASUK = 'WAIT' AND TANGGAL_MASUK = '"+tanggal_hari_ini+"'" String jml_all = "" String jml_antri = "" java.sql.Statement stat = koneksi.createStatement() java.sql.Statement statu = koneksi.createStatement() Exception try C java.sql.ResultSet rSet = stat.executeQuery(sql) A 44 A java.sql.ResultSet rSet = stat.executeQuery(sql) Exception try D (rSet.next()) jml_all = rSet.getString("jml") this.labelJumlahMasuk.setText(jml_all) (rSet.next()) false true java.sql.ResultSet rSt = stat.executeQuery(sql2) rSt.next() false true String no = rSt.getString("NO_TELEPON_MASUK") String psn = rSt.getString("ISI_PESAN_MASUK") String sts = rSt.getString("STATUS_MASUK") String time = rSt.getString("JAM_MASUK") String tg = rSt.getString("TANGGAL_MASUK") String nama = "" String sqlKontak = "SELECT * FROM data_buku_telepon WHERE nomor_telepon = '"+no+"'" java.sql.ResultSet rStN = statu.executeQuery(sqlKontak) false rStN.next() true nama = rStN.getString("NAMA_KONTAK") Object[] data = {no, nama, tg, time, psn, sts} tabSMSMasuk.addRow(data); int adi = this.tabelSmsMasukHariIni.getRowCount() rSt.next() true B 45 false B java.sql.ResultSet rSet2 = stat.executeQuery(sql3) rSet2.next() jml_antri = rSet2.getString("jml2") this.labelAntriProses.setText(jml_antri) this.labelSuksesProses.setText (String.valueOf(Integer.parseInt(jml_all) Integer.parseInt(jml_antri))) rSet2.next() D C tulis_proses(e.getMessage()) System.out.println(e.getMessage() + " tampil_kirim") END 46 7. Proses Pemeriksaan Perubahan dan Status Data SMS Masuk START getWaktu() String tanggal_hari_ini = tanggal+""+bulan+"-"+tahun Exception koneksi.isClosed() try A catch (Exception ex1) END 47 B C D A String sqljml = "SELECT COUNT(id_masuk) as jmlnya FROM SMS_MASUK WHERE tanggal_masuk = '"+tanggal_hari_ini+"'" java.sql.PreparedStatement pStatement = koneksi.prepareStatement(sqljml) java.sql.ResultSet rs = pStatement.executeQuery() Exception catch (java.sql.SQLException ex) try rs.next() String jm2 = rs.getString("jmlnya") (jm2.equalsIgnoreCase (this.labelJumlahMasu k.getText())) true tampilTabelSmsMasuk() rs.next() rs.close() tulis_proses(ex.getMessage()) END (Flowchart periksa data bagian A.) 48 B String sqljml = "SELECT COUNT(id_masuk) as jmlnya FROM SMS_MASUK WHERE status_masuk = 'ok' AND tanggal_masuk = '"+tanggal_hari_ini+"'"; java.sql.PreparedStatement pStatement = koneksi.prepareStatement(sqljml); java.sql.ResultSet rs = pStatement.executeQuery(); Exception try rs.next() String jm2 = rs.getString("jmlnya") catch (java.sql.SQLException ex) jm2.equalsIgnoreCase (this.labelSuksesPros es.getText()) tampilTabelSmsMasuk() rs.next() rs.close() tulis_proses(ex.getMessage()) END (Flowchart periksa data bagian B) 49 C String sql ="Select * From SMS_MASUK Where STATUS_MASUK = 'WAIT'" java.sql.PreparedStatement pStatement = koneksi.prepareStatement(sql) Exception try java.sql.ResultSet rSet = pStatement.executeQuery() try Exception rSet.next() String dataId = rSet.getString("ID_MASUK") String dataNotlp = rSet.getString("NO_TELEPON_MASUK") String dataPesan = rSet.getString("ISI_PESAN_MASUK") new prosesDatabaseSmsServer(koneksi).prosesTabelMasuk(dataId, dataNotlp, dataPesan) rSet.next() pStatement.close() catch (Exception e) rSet.close() END (Flowchart periksa data bagian C) 50 catch (Exception ie) D String sql ="Select * From SMS_MASUK Where STATUS_MASUK = 'WAIT'" java.sql.PreparedStatement pStatement = koneksi.prepareStatement(sql) try Exception java.sql.ResultSet rSet = pStatement.executeQuery() Exception try rSet.next() catch (Exception ie) String dataId = rSet.getString("ID_MASUK") String dataNotlp = rSet.getString("NO_TELEPON_MASUK") String dataPesan = rSet.getString("ISI_PESAN_MASUK") new prosesDatabaseSmsServer(koneksi).prosesTabelMasuk(dataId, dataNotlp, dataPesan) pStatement.close() rSet.close() END Flowcart periksa data bagian D 51 catch (Exception e) 8. Flowchart private void jBSimpanDataActionPerformed Start String kode = dataKodePertanyaan.getText(); String pertanyaan = dataIsiPertanyaanPolling.getText(); String pilih_a = dataPilihan_A.getText(); String pilih_b = dataPilihan_B.getText(); String pilih_c = dataPilihan_C.getText(); String sql = "INSERT INTO data_Pertanyaan_Polling(kode_Pertanyaan, isi_Pertanyaan, pilihan_a, pilihan_b, pilihan_c) VALUES(?,?,?,?,?)"; (kode.length()==0 || pertanyaan.length()==0 || pilih_a.length()==0 || pilih_b.length()==0 || pilih_c.length()==0) SmitDev.SmsServer.Server.proses_Gagal("Proses Simpan Data Gagal !!", "Terdapat Data yang Belum Dimasukkan"); try java.sql.PreparedStatement stat = koneksi.prepareStatement(sql); catch (java.sql.SQLException s) try catch (Exception se) stat.setString(1, kode); stat.setString(2, pertanyaan); stat.setString(3, pilih_a); stat.setString(4, pilih_b); stat.setString(5, pilih_c); stat.executeUpdate(); tampilTabelDataPertanyaan(); new jendelaTabelInputPertanyaan(koneksi).setEnabled(true); SmitDev.SmsServer.Server.proses_Gagal("Gagal Menyimpan Data Pertanyaan", s.getMessage()); SmitDev.SmsServer.Server.proses_Gagal("Gagal Menyimpan Data Pertanyaan", se.getMessage()); javax.swing.JOptionPane.showMessageDialog(null, " Data Pertanyaan Berhasil Disimpan!!"); End 52 9. Flowchart private void jBUpdateDataActionPerformed Start String kode = dataKodePertanyaan.getText(); String pertanyaan = dataIsiPertanyaanPolling.getText(); String pilih_a = dataPilihan_A.getText(); String pilih_b = dataPilihan_B.getText(); String pilih_c = dataPilihan_C.getText(); boolean hapus = this.cekHapusHasilPolling.isSelected(); (pertanyaan.length()==0 || pilih_a.length()==0 || pilih_b.length()==0 || pilih_c.length()==0) String sql = "UPDATE data_Pertanyaan_polling SET isi_Pertanyaan = ?, pilihan_a = ?, pilihan_b = ?, pilihan_c = ? WHERE kode_Pertanyaan = ?"; java.sql.PreparedStatement stat = koneksi.prepareStatement(sql); try Z stat.setString(1, pertanyaan); stat.setString(2, pilih_a); stat.setString(3, pilih_b); stat.setString(4, pilih_c); stat.setString(5, kode); stat.executeUpdate(); tampilTabelDataPertanyaan(); (hapus) int hapus2 = javax.swing.JOptionPane.showConfirmDialog(null, "Pertanyaan dengan kode : "+kode+" Telah dirubah"+ "\nAnda Ingin Menghapus Semua Hasil Polling dari Kode Pertanyaan Tersebut ???", "Konfirmasi Hapus Data", javax.swing.JOptionPane.YES_NO_OPTION); A (hapus2 == 0) String sql2 = "DELETE FROM data_hasil_polling WHERE kode_pertanyaan = ?"; java.sql.PreparedStatement stat2 = koneksi.prepareStatement(sql2); try B S 53 C B C S (java.sql.SQLException s) catch (Exception se) stat2.setString(1, kode); stat2.executeUpdate(); SmitDev.SmsServer.Server.proses_ Gagal("Gagal Menghapus Data", s.getMessage()); SmitDev.SmsServer.Server.proses_Gagal("Gagal Menghapus Data", se.getMessage()); A new jendelaTabelInputPertanyaan(koneksi).setEnabled(true); catch (Exception se) catch (java.sql.SQLException s) Z SmitDev.SmsServer.Server.proses_Gagal(" Gagal Merubah Data Pertanyaan", s.getMessage()); SmitDev.SmsServer.Server.proses_Gagal(" Gagal Merubah Data Pertanyaan", se.getMessage()); End 54 10. Flowchart private void cariHasilPolling Start String hasilAll = "0"; String hasil_A = "0"; String hasil_B = "0"; String hasil_C = "0"; double persen_A = 0; double persen_B = 0; double persen_C = 0; int valuePersen_A = 0; int valuePersen_B = 0; int valuePersen_C = 0; try String sqlAll = "SELECT COUNT(kode_pertanyaan) as jmlSMS FROM data_hasil_polling WHERE kode_pertanyaan = '"+kode+"'"; java.sql.Statement statAll = koneksi.createStatement(); java.sql.ResultSet rSetAll = statAll.executeQuery(sqlAll); (rSetAll.next()) hasilAll = rSetAll.getString("jmlSMS"); String sqlAll = "SELECT COUNT(kode_pertanyaan) as jmlSMS FROM data_hasil_polling WHERE kode_pertanyaan = '"+kode+"'"; java.sql.Statement statAll = koneksi.createStatement(); java.sql.ResultSet rSetAll = statAll.executeQuery(sqlAll); String sqlPilihA = "SELECT COUNT(pilihan) as jmlPilihanA FROM data_hasil_polling WHERE kode_pertanyaan = '"+kode+"' AND pilihan = 'A'"; java.sql.Statement statA = koneksi.createStatement(); java.sql.ResultSet rSetA = statA.executeQuery(sqlPilihA); (rSetA.next()) hasil_A = rSetA.getString("jmlPilihanA"); String sqlPilihB = "SELECT COUNT(pilihan) as jmlPilihanB FROM data_hasil_polling WHERE kode_pertanyaan = '"+kode+"' AND pilihan = 'B'"; java.sql.Statement statB = koneksi.createStatement(); java.sql.ResultSet rSetB = statB.executeQuery(sqlPilihB); (rSetB.next() S 55 Z S hasil_B = rSetB.getString("jmlPilihanB"); String sqlPilihC = "SELECT COUNT(pilihan) as jmlPilihanC FROM data_hasil_polling WHERE kode_pertanyaan = '"+kode+"' AND pilihan = 'C'"; java.sql.Statement statC = koneksi.createStatement(); java.sql.ResultSet rSetC = statC.executeQuery(sqlPilihC); (rSetC.next()) hasil_C = rSetC.getString("jmlPilihanC"); (!hasil_A.equalsIgnoreCase("0")) (!hasil_B.equalsIgnoreCase("0")) (!hasil_C.equalsIgnoreCase("0")) persen_A = 100/ (Double.parseDouble(hasilAll)/ Double.parseDouble(hasil_A)); java.util.StringTokenizer token = new java.util.StringTokenizer(String.valueOf( persen_A), "."); valuePersen_A = Integer.parseInt(token.nextToken()); persen_B = 100/ (Double.parseDouble(hasilAll)/ Double.parseDouble(hasil_B)); java.util.StringTokenizer token = new java.util.StringTokenizer(String.valueOf( persen_B), "."); valuePersen_B = Integer.parseInt(token.nextToken()); persen_C = 100/ (Double.parseDouble(hasilAll)/ Double.parseDouble(hasil_C)); java.util.StringTokenizer token = new java.util.StringTokenizer(String.valueOf( persen_C), "."); valuePersen_C = Integer.parseInt(token.nextToken()); this.persenPilihanA.setText("("+persen_A+"%)"); this.persenPilihanB.setText("("+persen_B+"%)"); this.persenPilihanC.setText("("+persen_C+"%)"); this.barPilihanA.setValue(valuePersen_A); this.barPilihanB.setValue(valuePersen_B); this.barPilihanC.setValue(valuePersen_C); this.jumlahSMS.setText(hasilAll); this.jumlahPilihanA.setText(hasil_A); this.jumlahPilihanB.setText(hasil_B); this.jumlahPilihanC.setText(hasil_C); Z catch(java.sql.SQLException e) System.out.println(e.getMessage()); End 56 11. public prosesSmsPolling(java.sql.Connection koneksi, String notlp, String kode2, String kode3) Start String sql = "INSERT INTO data_hasil_Polling(kode_Pertanyaan, pilihan, no_telepon_pengirim) VALUES(?,?,?)"; java.sql.PreparedStatement stat = koneksi.prepareStatement(sql); catch (Exception se) try stat.setString(1, kode2); stat.setString(2, kode3); stat.setString(3, notlp); stat.executeUpdate(); try catch (java.sql.SQLException s) System.out.println(s.getMessage()); System.out.println(se.getMessage()); End 57 12. public void prosesTabelMasuk(String id, String notlp, String pesan) Start String kode_1_salah = null; String kode_1_format = null; String pesanSalahKode_1 = null; String[] hasil; updateStatusData(id, "OK"); java.util.StringTokenizer st = new java.util.StringTokenizer(pesan); int i = 0; String awal = ""; StringBuffer kode = new StringBuffer(200); String kode1 = ""; String kode2 = ""; (st.hasMoreTokens()) YES awal = st.nextToken(); i = i + 1; (i == 1) NO java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(" "); hasil = pattern.split(pesan.trim()); YES kode1 = awal.toUpperCase(); kode2 = "null"; kode.append("null"); (i == 3) NO YES kode1 = hasil[0].trim().toString().toUpperCase(); kode2 = hasil[1].trim().toString().toUpperCase(); for (int b = 2; b < i; b++) { String kod = hasil[b].toString().toUpperCase(); kode.append(kod); kode1 = hasil[0].trim().toString().toUpperCase(); kode2 = hasil[1].trim().toString().toUpperCase(); String kod = hasil[2].toString().toUpperCase(); kode.append(kod); String kode3 = kode.toString(); kode3 = kode3.replaceAll(" ", ""); System.out.println(notlp+" "+kode1+" "+kode2+" "+kode3); NO (kode1.equalsIgnoreCase("POLLING")) kode_1_salah = "Kode1 yang Anda Masukkan Salah" + "\nkode : " + kode1 + "\nTidak terdaftar"; kode_1_format = "\nTerima Kasih\nSmitDev SMS Server"; pesanSalahKode_1 = kode_1_salah + kode_1_format; YES new prosesSmsPolling(koneksi, notlp, kode2, kode3); End 58 3.4.2.2 Proses-proses yang Dilakukan pada Aplikasi sesuai dengan Flowchart Program Proses dari alur algoritma flowchart diatas dapat dijelaskan dengan prosesproses yang dilakukan pada aplikasi ini seperti dibawah ini: 1. Koneksi dengan Database Pada saat tampilan GUI dari jendela utama SMS terbuka, belum terjadi koneksi antara SMS Server dengan perangkat dan database. Untuk itu pada jendela utama SMS sengaja diberi fasilitas submenu Koneksi Terminal. Pada proses penyambungan terminal, terdapat dua penyambungan yang dilakukan oleh SMS Server, yaitu penyambungan dengan database dan perangkat. Alur dari proses koneksi terminal adalah pertama-tama SMS Server mencoba untuk melakukan penyambungan dengan database itu berhasil, maka proses selanjutnya adalah memanggil metode untuk melakukan penyambungan dengan perangkat. Proses yang dilakukan pada metode ini adalah sebagai berikut: a. Memanggil driver dari MySQL Database Server. b. Apabila proses pemanggilan driver berhasil, maka dilanjutkan dengan proses koneksi dengan database. Parameter nilai URL, pengguna, dan password yang digunakan adalah nilai-nilai yang diperoleh dari jendela Pengaturan Terminal. c. Apabila proses koneksi dengan database berhasil dilakukan, maka proses selanjutnya adalah memanggil metode koneksiPerangkat() yang berfungsi untuk melakukan penyambungan dengan perangkat. 2. Proses Koneksi dengan Perangkat Setelah proses penyambungan database berhasil dilakukan, maka proses koneksi selanjutnya adalah dengan perangkat. Proses koneksi antara perangkat dengan terminal dilakukan oleh metode koneksiTerminal yang terdapat pada paket SmitDev SMS Server (kelas SmitDev.SmServer.Server). Adapun proses yang dilakukan pada metode ini adalah sebagai berikut: a. ATE1, untuk mengatur ECHO sehingga perintah AT yang dikirim atau yang diterima dapat ditampilkan. 59 b. AT+CNMI=1,1,2,2,1, untuk mendeteksi pesan SMS baru yang diterima atau masuk. c. AT+CGMI, untuk meminta nilai merek dari perangkat yang digunakan d. AT+CGMM, untuk meminta nilai seri atau tipe dari perangkat yang digunakan. e. AT+CGSN, untuk meminta IMEI dari perangkat yang digunakan. f. AT+COPS?, untuk meminta provider dari SIM Card yang digunakan. g. ATH0, untuk mencoba kembali status koneksi perangkat dengan terminal. 3. Proses Input Data Tabel SMS masuk Dalam proses penyimpanan SMS masuk ke tabel sms_masuk yang terdapat pada basis data, untuk itu dibutuhkan suatu metode dalam proses tersebut. Proses yang dilakukan pada metode ini adalah sebagai berikut: a. Mengambil nilai waktu sekarang dengan cara memanggil metode getWaktu(). b. Menyimpan data SMS baru yang masuk dengan nilai masukkan adalah nomor telepon pengirim dan isi pesan SMS masuk. Status data dari SMS baru yang masuk adalah WAIT. c. Data-data yang disimpan pada tabel sms_masuk adalah nomor telepon pengirim, tanggal SMS masuk, jam SMS masuk, isi pesan SMS masuk, dan status SMS masuk. 4. Proses Terima Respon AT dari Terminal Metode metode ini adalah menerima respons dari perintah AT yang dikirimkan ke terminal. Adapun proses yang dilakukan pada metode ini adalah sebagai berikut: a. Mengambil nilai input Stream dari variabel Serial Port b. Apabila terdapat nilai respons dari terminal, maka proses yang dilakukan adalah memisahkan respons – respons tersebut dengan parameter pemisah adalah Carriage Return(13) dan Line Feed (10). c. Selanjutnya meberikan nilai respon tersebut ke metode terima ResponAT untuk diproses lebih lanjut. 60 d. Akhirnya nilai bufferOffset kembali menjadi 0 untuk memungkinkan aplikasi SMS Server untuk kembali menerima respons dari terminal. Serta dilakukan juga suatu proses penanganan Respon AT yang Diterima dari Terminal. Metode ini dibuat untuk menindaklanjuti respon serial port yang telah diproses oleh metode serialEvent(). Metode ini akan melakukan proses – proses berdasarkan nilai respon yang diterima. Misalnya respon yang diterima dengan karakter +CNMI , ini menandakan bahwa ada pesan yang masuk sehingga harus dilakukan pembacaan kemudian dilakukan proses – proses selanjutnya. Adapun proses yang dilakukan pada metode ini adalah sebagai berikut; a. Memisahkan input buffer yang diterima menjadi beberapa bagian token, dengan parameter pemisah CRLF(”r\n”) b. Mengambil nilai token tersebut , kemudian berikan nilai token yang didapat ke variabel respons. Proses ini dilakukan secara terus – menerus sampai tidak ada lagi token yang terdapat pada buffer. c. Jika nilai respon yang didapat dari terminal diawali dengan karakter ”+CMTI ”, ini menandakan bahwa ada pesan baru yang masuk Unuk intu dilakukan pengambilan nilai indeks pesan memory tempat pesan tersimpan, dengan cara mengirim perintah ”AT+CPMS =” + memory Dan pembacaan pesan berdasarkan nilai index yang didapat dengan mengirimkan perintah ”AT+CMGR="+index. d. Jika respon terminal yang didapat diawali dengan karakter ” +CMGR” , ini merupakan hasil respon dari pengiriman perintah ”AT+CMGR=<index>” yang menandakan bahwa terminal telah melakukan pembacaan terhadap pesan yang masuk. Selanjutnya membrikan nilai bacaSMS menjadi true yang menunjukkan bahwa pesan yang dibaca siap untuk diproses lebih lanjut. e. Jika nilai bacaSMS = true lakukan perubahan pesan SMS dari format PDU menjadi format teks yaitu dengan cara memberikan nilai respons ke metode terimaSMS yang terdapat pada kelas SmitDev.SmsServer.Server, mengambil nilai nomor telepon pengirim, dan isi pesan dari SMS yang diterima. 61 f. Jika respon terminal yang didapat diawali dengan karakter ”ATH0”, ini menandakan bahwa SMS server telah berhasil terhubung dengan terminal dan siap menerima AT command yang dikirim oleh aplikasi. Untuk itu panggil metode sedang_Terhubung, untuk mengubah status SMS Server dari belum terhubung menjadi sedang terhubung. 5. Proses Aktivitas Sistem ke File Proses ini berfungsi untuk mencatat segala sesuatu yang dilakukan oleh SMS Server yang dianggap penting ke dalam sebuah file. Langkah ini dilakukan untuk mengetahui proses-proses yang dilakukan oleh SMS Server dan apabila terdapat kesalahan yang terjadi pada SMS Server, maka kesalahan tersebut dapat diketahui dan selanjutnya dapat ditindaklanjuti. Adapun proses yang dilakukan pada metode ini adalah: a. Mengambil nilai waktu yang digunakan sebagai nama file parameter data didalam file. b. Apabila file pada tanggal yang bersangkutan belum ada maka akan membuat file baru berdasarkan tanggal yang didapat. c. Selanjutnya menuliskan data ke dalam file yang diakhiri dengan menutup akses file. 6. Proses Menampilkan Data Tabel SMS masuk ke Jendela Utama SMS Server Data-data tabel SMS masuk yang ditampilkan pada jendela utama Polling SMS Server adalah hanya data-data SMS masuk pada hari yang bersangkutan atau pada hari ini. Dengan kata lain, data-data SMS masuk yang akan ditampilkan disaring berdasarkan tanggal dan diterimanya SMS tersebut sesuai dengan tanggal pada hari ini. Dengan demikian, tidak semua data SMS masuk ditampilkan pada jendela utama Polling SMS Server, tetapi hanya data-data SMS masuk yang diterima pada hari ini. Secara garis besar tiga buah proses yang dilakukan pada metode ini, yaitu proses menghapus daftar data-data yang ada pada tabel di jendela utama Polling SMS Server, proses menampilkan data tabel SMS masuk yang ada pada database ke jendela utama Polling SMS Server, dan proses untuk 62 menampilkan nilai-nilai traffic SMS masuk berupa banyaknya SMS yang diterima, antrian SMS untuk diproses, serta SMS yang sukses diproses. Adapun proses yang dilakukan pada metode iniadalah sebagai berikut: a. Mengambil banyaknya baris yang ada pada tabel. b. Melakukan pengulangan sebanyak nilai baris yang diperoleh dan menghapus baris tersebut. c. Memanggil metode getWaktu() untuk mengambil waktu sekarang. d. Mengambil nilai banyaknya data SMS masuk pada database yang masuk pada hari ini. Perintah SQL yang digunakan adalah “SELECT COUNT(id) as jml FROM SMS_MASUK WHERE tanggal = “”+tanggal_ hari_ ini+””. Nilai yang diperoleh selanjutnya ditampilkan ke traffic SMS masuk hari ini. e. Mengambil data-data SMS masuk yang ada pada database yang masuk pada hari ini. Data-data tersebut selanjutnya ditampilkan pada tabel SMS masuk hal ini di jendela utama SMS. Adapun nilai-nilai kolom yang diambil adalah nomor telepon pengirim, tanggal terima, jam terima, isi pesan yang diterima, dan status terima. 7. Proses Pemeriksaan Perubahan dan Status Data pesan Masuk Metode ini melakukan proses untuk memeriksa perubahan banyaknya data yang terdapat pada tabel SMS masuk di jendela SMS Server dengan tabel SMS masuk di database, memeriksa status_masuk data SMS masuk yang bernilai WAIT. Adapun urutan proses yang terjadi adalah: a. Membandingkan banyaknya data yang terdapat pada tabel di jendela SMS Server dengan data pada tabel SMS_MASUK di database, apabila terjadi perbedaan ini menandakan ada pesan baru yang masuk yang kemudian data – data tersebut ditampilkan ke tabel jendela SMS Server, dengan cara memanggil metode tampilTabelSmsMasuk(). b. Mengambil nilai data pesan masuk yang memiliki status_masuk adalah”WAIT”. Status ini berfungsi untuk mengindikasi ke SMS Server untuk memproses pesan masuk tersebut . 63 8. Proses Menyimpan Data Pertanyaan Baru Proses menyimpan data pertanyaan polling baru ke basis data dilakukan pada saat tombol Simpan Data ditekan. Proses ini akan menyimpan data berupa kode pertanyaan, pertanyaan polling, pilihan A, pilihan B, dan pilihan C yang didapat dari komponen kotak teks ke dalam tabel data_pertanyaan_polling yang ada di dalam basis data. Proses yang terjadi pada metode ini adalah sebagai berikut: a. Mengambil nilai kode pertanyaan, pertanyaan polling, pilihan A, pilihan B, dan pilihan C. b. Melakukan validasi terhadap nilai-nilai tersebut. Apabila salah satu komponen teks belum dimasukkan atau kosong, maka proses penyimpanan tidak akan dilanjutkan dan menampilkan kotak dialog yang berisi pesan “Proses Simpan Data Gagal!!!”, “Terdapat Data yang Belum Dimasukkan.” c. Sedangkan apabila semua data sudah dimasukkan atau diisi maka proses yang dilakukan adalah menyimpan nilai-nilai tersebut kedalam tabel data_pertanyaan_polling yang terdapat pada database. d. Apabila proses penyimpanan berhasil dilakukan, dilanjutkan dengan proses menampilkan data pertanyaan polling ke jendela input pertanyaan dan tampilan jendela input data berpindah ke tampilan daftar pertanyaan polling. 9. Proses Memperbarui Data pertanyaan Polling Proses memperbarui data pertanyaan polling di basis data dilakukan pada saat tombol Update Data ditekan. Proses ini akan mengubah atau memperbarui data pertanyaan polling berupa isi pertanyaan polling, pilihan A, pilihan B, dan pilihan C yang didapat dari komponen kotak teks berdasarkan kode pertanyaan. Proses yang terjadi pada metode ini adalah sebagai berikut: a. Mengambil nilai dari pertanyaan polling, pilihan A, pilihan B, dan pilihan C. b. Melakukan validasi terhadap nilai-nilai tersebut. Apabila salah satu komponen teks belum dimasukkan atau masih kosong maka proses 64 memperbarui data tidak akan dilanjutkan dan menampilkan kotak dialog yang berisikan pesan “Proses Rubah Data Gagal!!!”, “Terdapat Data yang belum Dimasukkan”. c. Sedangkan apabila semua data sudah dimasukkan atau diisi, maka proses yang dilakukan adalah memperbarui atau mengubah data pertanyaan polling dengan nilai-nilai tersebut ke dalam tabel data_pertanyaan_polling yang terdapat pada basis data berdasarkan kode pertanyaan. d. Pada tampilan memperbarui data pertanyaan polling, terdapat sebuah komponen checkbox yang aktif. Fungsi dari komponen tersebut adalah sebagai pilihan apakah data hasil polling dari kode pertanyaan yang akan diubah yang telah ada pada tabel data_hasil_polling akan dihapus atau tidak. e. Apabila komponen checkbox dipilih, maka proses update data akan dilanjutkan dengan proses penghapusan semua data hasil polling dari kode pertanyaan tersebut, yang terdapat pada tabel data_hasil_polling. f. Apabila proses update data berhasil dilakukan, maka selanjutnya adalah mengubah tampilan jendela ke daftar pertanyaan polling. 10. Proses Mencari Data Hasil polling dari Pertanyaan yang dipilih Fungsi dari proses ini adalah mencari dan mengambil hasil polling yang telah dikirimkan oleh responden yang masuk ke data hasil polling. Proses ini dilakukan apabila proses pencarian data pertanyaan berhasil dilakukan pada langkah sebelumnya. Proses yang dilakukan pada metode ini adalah: a. Mengambil nilai jumlah keseluruhan pesan polling SMS yang masuk berdasarkan nilai kode pertanyaan yang telah ditentukan. b. Mengambil nilai jawaban A, B, C dari kode pertanyaan tersebut. c. Hasil dari nilai-nilai tersebut ditampilkan ke jendela hasil polling dan dijadikan persentase untuk masing-masing jawaban tersebut. d. Nilai persentase tersebut kemudian diimplementasikan ke komponen ”JprogressBar” dari masing-masing pilihan jawaban. 65