Implementasi SMS Autoreply Gammu di Database Non MySQL (Studi Kasus MS. Access)

Sharing is caring!

Niat hati ingin membuat postingan di penghujung tahun 2010 (31/12/2010), akan tetapi Allah SWT belum mengizinkan yang akhirnya postingan ini baru bisa dibuat di awal tahun 2011 🙂 But.. it’s OK, mudah-mudahan artikel ini bisa bermanfaat bagi Anda yang ingin belajar mengembangkan SMS Gateway dengan Gammu.

Artikel kali ini tentang bagaimana cara mengimplementasikan SMS Auto Reply dengan Gammu di database selain MySQL. Dalam kasus ini, saya pilih database MS. Access sebagai master database untuk autoreply nya.

Mungkin sebelumnya Anda mengira bahwa Gammu hanya bisa cocok dengan database MySQL. Memang sebenarnya Gammu bisa langsung terintegrasi pada 3 jenis database engine, yaitu MySQL, Posgre SQL, dan SQL lite. Ketiganya bisa langsung terintegrasi dengan Gammu karena di dalam Gammunya sendiri sudah terdapat library. Lantas bagaimana dengan database engine yang lain, seperti MS. Access, Oracle, MS SQL (SQL Server) dll? Untuk database engine yang lain pada prinsipnya bisa, akan tetapi dengan sedikit trik atau tidak secara langsung. Penasaran dengan triknya? OK simak artikel ini baik-baik ya.

Dalam studi kasus ini, saya menggunakan database MS Access yang berisi data induk nilai mahasiswa untuk autoreply nya.

SMS autoreply Gammu - MS. Access

Tabel di MS. Access tersebut saya beri nama ‘nilai’ dengan 3 field yaitu: ‘kodemk’, ‘nim’ dan ‘nilai’. Untuk ‘kodemk’ dan ‘nim’ bertipe data ‘text’ dan ‘nilai’ bertipe data ‘number’.

Dengan data di atas, saya akan membuat aplikasi SMS autoreply dengan Gammu yang memungkinkan seseorang bisa mengecek nilai mahasiswa pada matakuliah tertentu dengan format perintah SMS: NILAI#KODEMK#NIM. Sebagai contoh misalkan ada seseorang mengirim SMS dengan perintah: NILAI#MK001#M01, maka secara otomatis akan mendapat balasan SMS berupa nilai dari mahasiswa bernim ‘M01’ pada matakuliah berkode ‘MK001′ yaitu ’90’.

Nah… bagaimana idenya untuk membuat sms auto reply tersebut? Idenya mudah sekali. Untuk mengimplementasikan konsep di atas, kita tetap menggunakan MySQL sebagai database untuk menerima dan mengirim SMS, mengingat Gammu hanya bisa terhubung langsung dengan 3 database seperti yang saya jelaskan di atas. Begitu SMS diterima oleh modem/hp, maka SMS akan masuk ke MySQL nya (di tabel INBOX nya Gammu). Selanjutnya SMS yang masuk ini kita baca dengan menggunakan program atau script untuk mendapatkan KODEMK dan NIM nya. KODEMK dan NIM ini nanti kita gunakan untuk mencari nilai di database MS. Access nya. Siapa yang melakukan pencarian nilai di MS. Accessnya? ya… tentu saja script atau program yang kita buat dong, siapa lagi? 🙂 Setelah nilai ketemu, selanjutnya nilai tersebut kita kirimkan dalam bentuk SMS melalui Gammu dengan cara menyisipkannya ke dalam tabel OUTBOX di database MySQL. Simpel bukan idenya?

Dari ide di atas, tampak bahwa di dalam script yang akan kita buat itu terdapat 2 koneksi ke database engine yang berbeda, yaitu ke MySQL dan ke MS. Access. Lantas… bisakah hal itu diterapkan? He… 3x ya jelas bisa dong. Untuk koneksi ke MS. Accessnya dari PHP bagaimana caranya? Anda bisa menggunakan ODBC sebagaimana yang pernah saya jelaskan di artikel Cara Koneksi PHP ke MS. Access.

OK, sekarang kita bisa buat scriptnya. Script pertama yang kita buat adalah script untuk membaca SMS yang masuk ke tabel INBOX nya Gammu di MySQL, selanjutnya melakukan proses parsing untuk mendapatkan KODEMK dan NIM. Setelah itu, melakukan proses pencarian nilai di MS. Access sesuai KODEMK dan NIM, lalu mengirimkan SMS balasan.

sms.php

<?php

// parameter koneksi ke database Gammu di MySQL
$mysqlHost = "...";
$mysqlUser = "...";
$mysqlPass = "...";
$mysqlDB   = "...";

// parameter koneksi ke MS. Access via ODBC
$odbcDataSource = "...";
$odbcUser = "...";
$odbcPass = "...";

// proses koneksi ke mysql
mysql_connect($mysqlHost, $mysqlUser, $mysqlPass);
mysql_select_db($mysqlDB);

// cari data SMS yang masuk ke INBOX MySQL
// yang berawalan NILAI#...
$queryMySQL = "SELECT * FROM inbox WHERE TextDecoded LIKE 'NILAI#%' AND Processed = 'false'";
$hasilMySQL = mysql_query($queryMySQL);
while ($dataMySQL = mysql_fetch_array($hasilMySQL))
{
  // baca ID sms
  $id = $dataMySQL&#91;'ID'&#93;;
  // baca nomor pengirim (akan digunakan untuk mengirim SMS balasan)
  $sender = $dataMySQL&#91;'SenderNumber'&#93;;
  // mengubah sms ke huruf kapital semua
  $sms = strtoupper($dataMySQL&#91;'TextDecoded'&#93;);
  // proses parsing untuk mendapatkan KODEMK dan NIM dari SMS
  $split = explode('#', $sms);
  $kodemk = $split&#91;1&#93;;
  $nim = $split&#91;2&#93;;

  // koneksi ke MS. Access via ODBC	
  $koneksiODBC = odbc_connect($odbcDataSource, $odbcUser , $odbcPass);	
  // query untuk mencari ada tidaknya data di tabel 'nilai' pada MS. Access berdasarkan KODEMK dan NIM
  $queryODBC = "SELECT count(*) AS jum FROM nilai WHERE nim = '$nim' AND kodemk = '$kodemk'";
  $hasilODBC = odbc_exec($koneksiODBC, $queryODBC);
  $dataODBC = odbc_fetch_array($hasilODBC);
 
  // jika hasil query ditemukan (hasil query > 0), maka cari nilainya dengan query  
  if ($dataODBC['jum'] > 0)
  {
     // query untuk mendapatkan nilai di MS. Access
     $queryODBC = "SELECT * FROM nilai WHERE nim = '$nim' AND kodemk = '$kodemk'";
     $hasilODBC = odbc_exec($koneksiODBC, $queryODBC);  
     $dataODBC = odbc_fetch_array($hasilODBC);
     $nilai = $dataODBC['nilai'];
     // bunyi balasan SMS jika nilai ditemukan
     $reply = "Nilai MK ".$kodemk." mahasiswa berNIM ".$nim." adalah ".$nilai;
  }
  // jika hasil query tidak ada, maka bunyi balasan SMS nya 'Data tidak ditemukan' 
  else $reply = "Data tidak ditemukan";
  
  // query untuk mengirim SMS balasan via Gammu
  $queryMySQL2 = "INSERT INTO outbox(DestinationNumber, TextDecoded, CreatorID)
                  VALUES ('$sender', '$reply', 'Gammu')";
  mysql_query($queryMySQL2);	

  // proses penandaan SMS di Inbox bahwa SMS sudah diproses berdasarkan ID SMS
  $queryMySQL3 = "UPDATE inbox SET Processed = 'true' WHERE ID = '$id'";
  mysql_query($queryMySQL3);  
 
}

Dari script di atas, perlu saya jelaskan mengapa SMS yang dibaca dari tabel INBOX perlu dibuat ke kapital semua menggunakan strtoupper(). Ya… hal ini untuk menjaga konsistensi data saja sewaktu proses. Di dalam database nilai mahasiswa pada MS. Access, KODEMK dan NIM saya buat huruf besar. Padahal, jika seseorang mengirim SMS seringnya besar kecilnya huruf itu tidak konsisten. Kadang huruf besar semua, kecil semua atau bahkan campuran. Proses kapitalisasi karakter ini perlu diberikan untuk mengurangi efek dari sifat Case Sensitivitas (pembedaan besar kecilnya huruf) pada sistem. Paham kan yang saya maksud? 🙂

Supaya script di atas berjalan secara otomatis, tanpa kita jalankan secara manual dengan merefresh script tersebut berulangkali di browser, kita bisa buat script untuk autorefreshnya dengan AJAX menggunakan script berikut ini

index.php

<html>
<head>
<title>SMS Server Running...</title>
<script type="text/javascript">
function ajax()
{
  if (window.XMLHttpRequest)
  {
     xmlhttp=new XMLHttpRequest();
  }
  else
  {
     xmlhttp =new ActiveXObject("Microsoft.XMLHTTP");
  }

  xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    }
  }

  xmlhttp.open("GET","sms.php");
  xmlhttp.send();
  setTimeout("ajax()", 5000);
}
</script>

</head>
<body onload="ajax()">
<h1>SMS Server Running...</h1>
</body>
</html>

Dengan demikian, Anda cukup menjalankan script index.php nya saja di browser dan biarkan script SMS servernya bekerja secara otomatis.

Script di atas telah saya coba dengan sukses menggunakan XAMPP terbaru dan dengan dukungan modem Wavecom. Untuk Gammu nya sendiri, Anda bisa download Easy Gammu Installer buatan saya.

Semoga artikel ini bisa bermanfaat untuk Anda pengunjung setia blog ini. Anda dapat bereksperimen untuk membuat SMS autoreply ini dengan mengintegrasikannya dengan database engine yang lain seperti Oracle, MS. SQL atau SQL Server, dll karena konsep maupun idenya sama persis dengan ide di atas. Oya, untuk MS. SQL atau SQL server Anda juga dapat menggunakan ODBC untuk mengkoneksikan ke PHP.

Selamat berekesperimen !! 🙂

Tinggalkan Komentar