Anda di halaman 1dari 21

Teknik Mengirim Long Text SMS Gammu dengan Query SQL

Pada artikel yang lalu, saya pernah menulis topik Teknik Dasar Mengirim SMS dengan Gammu. Dalam artikel
tersebut salah satunya adalah pembahasan tentang teknik mengirim SMS dengan panjang karakter lebih dari
160 karakter (long text SMS) yaitu dengan command gammu-smsd-inject. Nah.. pada artikel kali ini saya
akan menjelaskan cara mengirim long text SMS Gammu menggunakan query SQL.

Kelemahan mengirim long text SMS dengan command gammu-smsd-inject adalah lambatnya proses bila
diintegrasikan dengan script PHP. Dari hasil eksperiman sendiri, ceilee , untuk mengirim long text SMS
ke lebih dari 500 nomor dengan menggunakan command gammu-smsd-inject yang diintegrasikan dengan
script PHP butuh waktu lebih dari 30 detik. Bisa dibayangkan bila digunakan untuk mengirim ke ribuan nomor
sekaligus. Tentu running timenya lebih lama.

Sedangkan kelebihan mengirim long text SMS dengan query SQL adalah running time yang jauh lebih cepat
dibandingkan command gammu-smsd-inject. Namun.. di sisi lain, kekurangannya adalah agak rumitnya
membuat script untuk melakukan hal ini. Sedangkan kelebihan dari command gammu-smsd-inject adalah
perintahnya jauh lebih mudah dibandingkan via script query SQL. Akan tetapi mengingat kelebihannya yang
lebih efisien, saya kira kesulitan untuk membuat script pengiriman long text SMS dengan query tak perlu
dipermasalahkan, toh saya akan beberkan caranya di sini

So.. gimana teknik pengiriman long text SMS Gammu dengan query SQL? OK tekniknya adalah kita harus
split atau memecah-mecah dahulu text SMS yang akan kita kirimkan. Untuk setiap pecahan terdiri dari text
yang panjangnya 153 karakter. Jadi misal kita punya text SMS dengan panjang 400 karakter, maka sebelum
dikirim dengan Gammu, kita harus split textnya menjadi 3 bagian, yaitu pecahan pertama terdiri dari 153
karakter, pecahan kedua 153 karakter dan pecahan ketiga 94 karakter.

Mungkin Anda bertanya, gimana caranya memecah-mecah text atau string dengan panjang 153 karakter tsb?
Lho kan sudah pernah saya bahas caranya di artikelTeknik Memecah String Menjadi Substring Dengan
Jumlah Karakter Sama.

Setelah kita pecah text SMS asli ke dalam n pecahan dengan panjang maks 153 karakter, selanjutnya pecahan
bagian pertama kita masukkan ke dalam tabel OUTBOX, sedangkan pecahan yang lain dimasukkan ke tabel
OUTBOX_MULTIPART

Adapun query untuk memasukkan text pecahan pertama ke tabel OUTBOX adalah sbb:

view sourceprint?
1.INSERT INTO outbox (DestinationNumber, UDH, TextDecoded, MultiPart,
CreatorID)
2.VALUES ('NO TELP TUJUAN', 'KODE UDH', 'ISI TEXT PECAHAN KE-
1', 'true','Gammu')

Perhatikan, bahwa khusus untuk long text SMS, kita set nilai true pada field MultiPart, dan ada pula kode
UDH. Wah apaan tuh UDH? Nanti saya akan jelaskan.

Selanjutnya perintah query untuk memasukkan text pecahan ke tabel OUTBOX_MULTIPART adalah sbb:

view sourceprint?
1.INSERT INTO outbox_multipart(UDH, TextDecoded, ID, SequencePosition)
2.VALUES ('KODE UDH', 'ISI TEXT PECAHAN', 'NO ID', 'NO URUT PESAN')
Keterangan:

NO ID adalah nomor id dari pesan pecahan pertama yang telah disimpan ke tabel OUTBOX. Misal
pecahan pertama setelah dimasukkan ke tabel OUTBOX memiliki ID = 100, maka dalam query SQL
untuk memasukkan pecahan text ke tabel OUTBOX_MULTIPART juga harus menggunakan NO ID =
100.
NO URUT PESAN adalah nomor urutan pesan dari pesan utuhnya.

UDH adalah kode header untuk menunjukkan urutan pecahan text SMS. Kode UDH ini terdiri dari 12 digit
yang memiliki format sbb:

view sourceprint?
1.AAAAAAAA XX YY

dimana AAAAAAAA itu adalah kode random dalam format hexadesimal, XX itu menunjukkan jumlah pecahan
SMS, dan YY menunjukkan nomor urutan pecahan.

Salah satu kode random hexadesimal yang bisa digunakan adalah 050003A7, atau Anda juga bisa memilih
sendiri kode random yang lain.

Contoh UDH untuk sebuah pesan adalah sbb:

050003A7 10 02.

Pada kode di atas, nilai 10 menunjukkan bahwa pesan tersebut total terdiri dari 10 pecahan SMS, dan UDH
tersebut adalah milik pesan ke 2 (perhatikan nilai 02).

Sebagai gambaran misalkan kita punya teks SMS asli sbb:

Perkenalkan Nama Saya Rosihan Ari Yuana. Saya Memiliki Tiga Anak, Dua Diantaranya Laki-Laki Dan Satu
Orang Perempuan. Saya Juga Punya Seorang Istri Yang Saya Cintai. Rumah Saya Di Colomadu Karanganyar.
Saya Lahir Di Boyolali Tiga Puluh Tahun Yang Lalu. Sekarang Saya Mengajar Di Salah Satu Perguruan Tinggi
Di Kota Solo, Yaitu Universitas Sebelas Maret.

Panjang karakter text SMS di atas adalah 353 buah.

Karena pesan tersebut panjangnya lebih dari 160 karakter, maka langkah pertama kita harus split dahulu
menjadi beberapa pecahan string dengan panjang maks 153 untuk setiap pecahannya. Berikut ini hasil
pecahannya

Pecahan ke-1 : Perkenalkan Nama Saya Rosihan Ari Yuana. Saya Memiliki Tiga Anak, Dua Diantaranya Laki-
Laki Dan Satu Orang Perempuan. Saya Juga Punya Seorang Istri Yang
Pecahan ke-2 : Saya Cintai. Rumah Saya Di Colomadu Karanganyar. Saya Lahir Di Boyolali Tiga Puluh Tahun
Yang Lalu. Sekarang Saya Mengajar Di Salah Satu Perguruan Tinggi
Pecahan ke-3 : Di Kota Solo, Yaitu Universitas Sebelas Maret.

Panjang pecahan ke-1 dan ke-2 adalah 153 karakter, dan pecahan ke-3 panjangnya 47 karakter.

Setelah dipecah, selanjutnya kita simpan pecahan ke-1 ke tabel OUTBOX


view sourceprint?
1.INSERT INTO outbox (DestinationNumber, UDH, TextDecoded, MultiPart,
CreatorID)
2.VALUES ('NO TELP TUJUAN', '050003A70301', 'Perkenalkan Nama Saya Rosihan Ari
Yuana.
3.Saya Memiliki Tiga Anak, Dua Diantaranya Laki-Laki Dan Satu Orang
Perempuan. Saya Juga
4.Punya Seorang Istri Yang ', 'true', 'Gammu');

Perhatikan nilai UDH dari pecahan pertama di atas, yaitu 050003A70301. Nilai 03 dari 0301 menunjukkan
total pecahan ada 3 buah, dan 01 dari 0301 menunjukkan urutan pecahan.

Selanjutnya misalkan ID dari record hasil query di atas adalah 200 (lihat field ID record di atas pada tabel
OUTBOX), maka kita gunakan ID = 200 ini untuk proses penyimpanan pecahan yang ke-2 dan ke-3 di tabel
OUTBOX_MULTIPART nya.

Perintah query untuk menyimpan pecahan ke-2 ke tabel OUTBOX_MULTIPART:

view sourceprint?
1.INSERT INTO outbox_multipart(UDH, TextDecoded, ID, SequencePosition)
2.VALUES ('050003A70302', 'Saya Cintai. Rumah Saya Di Colomadu Karanganyar.
Saya Lahir Di
3.Boyolali Tiga Puluh Tahun Yang Lalu. Sekarang Saya Mengajar Di Salah Satu
Perguruan
4.Tinggi', '200', '2');

Perhatikan nilai UDH dari pecahan kedua di atas, yaitu 050003A70302.

Perintah query untuk menyimpan pecahan ke-3 ke tabel OUTBOX_MULTIPART:

view sourceprint?
1.INSERT INTO outbox_multipart(UDH, TextDecoded, ID, SequencePosition)
2.VALUES ('050003A70303', 'Di Kota Solo, Yaitu Universitas Sebelas
Maret.','200', '3');

Perhatikan nilai UDH dari pecahan kedua di atas, yaitu 050003A70303.

Nah.. dah paham kan konsepnya? OK sekarang saya berikan script khusus untuk mengirim long text SMS
sebagaimana ide di atas.

view sourceprint?
01.<?php
02.
03.// koneksi ke mysql
04.mysql_connect("dbhost", "dbuser", "dbpass");
05.mysql_select_db("dbname");
06.
07.// pesan asli
08.$pesan = ".......";
09.
10.// menghitung jumlah pecahan
11.$jmlSMS = ceil(strlen($pesan)/153);
12.
13.// memecah pesan asli
14.$pecah = str_split($pesan, 153);
15.
16.// proses untuk mendapatkan ID record yang akan disisipkan ke tabel OUTBOX
17.$query = "SHOW TABLE STATUS LIKE 'outbox'";
18.$hasil = mysql_query($query);
19.$data = mysql_fetch_array($hasil);
20.$newID = $data['Auto_increment'];
21.
22.// proses penyimpanan ke tabel mysql untuk setiap pecahan
23.for ($i=1; $i<=$jmlSMS; $i++)
24.{
25.// membuat UDH untuk setiap pecahan, sesuai urutannya
26.$udh = "050003A7".sprintf("%02s", $jmlSMS).sprintf("%02s", $i);
27.
28.// membaca text setiap pecahan
29.$msg = $pecah[$i-1];
30.
31.if ($i == 1)
32.{
33.// jika merupakan pecahan pertama, maka masukkan ke tabel OUTBOX
34.$query = "INSERT INTO outbox (DestinationNumber, UDH, TextDecoded, ID,
MultiPart, CreatorID)
35.VALUES ('$noTelp', '$udh', '$msg', '$newID', 'true','Gammu')";
36.}
37.else
38.{
39.// jika bukan merupakan pecahan pertama, simpan ke tabel OUTBOX_MULTIPART
40.$query = "INSERT INTO outbox_multipart(UDH, TextDecoded, ID,
SequencePosition)
41.VALUES ('$udh', '$msg', '$newID', '$i')";
42.}
43.
44.// jalankan query
45.mysql_query($query);
46.}
47.?>

OK deh.. selamat mencoba ya


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

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.

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

view sourceprint?
01.<?php
02.
03.// parameter koneksi ke database Gammu di MySQL
04.$mysqlHost = "...";
05.$mysqlUser = "...";
06.$mysqlPass = "...";
07.$mysqlDB = "...";
08.
09.// parameter koneksi ke MS. Access via ODBC
10.$odbcDataSource = "...";
11.$odbcUser = "...";
12.$odbcPass = "...";
13.
14.// proses koneksi ke mysql
15.mysql_connect($mysqlHost, $mysqlUser, $mysqlPass);
16.mysql_select_db($mysqlDB);
17.
18.// cari data SMS yang masuk ke INBOX MySQL
19.// yang berawalan NILAI#...
20.$queryMySQL = "SELECT * FROM inbox WHERE TextDecoded LIKE 'NILAI#%' AND
Processed = 'false'";
21.$hasilMySQL = mysql_query($queryMySQL);
22.while ($dataMySQL = mysql_fetch_array($hasilMySQL))
23.{
24.// baca ID sms
25.$id = $dataMySQL['ID'];
26.// baca nomor pengirim (akan digunakan untuk mengirim SMS balasan)
27.$sender = $dataMySQL['SenderNumber'];
28.// mengubah sms ke huruf kapital semua
29.$sms = strtoupper($dataMySQL['TextDecoded']);
30.// proses parsing untuk mendapatkan KODEMK dan NIM dari SMS
31.$split = explode('#', $sms);
32.$kodemk = $split[1];
33.$nim = $split[2];
34.
35.// koneksi ke MS. Access via ODBC
36.$koneksiODBC = odbc_connect($odbcDataSource, $odbcUser , $odbcPass);
37.// query untuk mencari ada tidaknya data di tabel 'nilai' pada MS. Access
berdasarkan KODEMK dan NIM
38.$queryODBC = "SELECT count(*) AS jum FROM nilai WHERE nim = '$nim' AND
kodemk = '$kodemk'";
39.$hasilODBC = odbc_exec($koneksiODBC, $queryODBC);
40.$dataODBC = odbc_fetch_array($hasilODBC);
41.
42.// jika hasil query ditemukan (hasil query > 0), maka cari nilainya dengan
query
43.if ($dataODBC['jum'] > 0)
44.{
45.// query untuk mendapatkan nilai di MS. Access
46.$queryODBC = "SELECT * FROM nilai WHERE nim = '$nim' AND kodemk =
'$kodemk'";
47.$hasilODBC = odbc_exec($koneksiODBC, $queryODBC);
48.$dataODBC = odbc_fetch_array($hasilODBC);
49.$nilai = $dataODBC['nilai'];
50.// bunyi balasan SMS jika nilai ditemukan
51.$reply = "Nilai MK ".$kodemk." mahasiswa berNIM ".$nim." adalah ".$nilai;
52.}
53.// jika hasil query tidak ada, maka bunyi balasan SMS nya 'Data tidak
ditemukan'
54.else $reply = "Data tidak ditemukan";
55.
56.// query untuk mengirim SMS balasan via Gammu
57.$queryMySQL2 = "INSERT INTO outbox(DestinationNumber, TextDecoded,
CreatorID)
58.VALUES ('$sender', '$reply', 'Gammu')";
59.mysql_query($queryMySQL2);
60.
61.// proses penandaan SMS di Inbox bahwa SMS sudah diproses berdasarkan ID
SMS
62.$queryMySQL3 = "UPDATE inbox SET Processed = 'true' WHERE ID = '$id'";
63.mysql_query($queryMySQL3);
64.
65.}

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

view sourceprint?
01.<html>
02.<head>
03.<title>SMS Server Running...</title>
04.<script type="text/javascript">
05.function ajax()
06.{
07.if (window.XMLHttpRequest)
08.{
09.xmlhttp=new XMLHttpRequest();
10.}
11.else
12.{
13.xmlhttp =new ActiveXObject("Microsoft.XMLHTTP");
14.}
15.
16.xmlhttp.onreadystatechange=function()
17.{
18.if (xmlhttp.readyState==4 && xmlhttp.status==200)
19.{
20.}
21.}
22.
23.xmlhttp.open("GET","sms.php");
24.xmlhttp.send();
25.setTimeout("ajax()", 5000);
26.}
27.</script>
28.
29.</head>
30.<body onload="ajax()">
31.<h1>SMS Server Running...</h1>
32.</body>
33.</html>

Dengan demikian, Anda cukup menjalankan script index.php nya saja di browser dan biarkan script SMS
servernya bekerja secara otomatis.
Membuat Sendiri Kirim SMS Gratis Via Web dengan PHP dan MySQL

Masih terkait dengan SMS gateway, dalam artikel kali ini saya akan mencoba memaparkan cara membuat
sendiri aplikasi kirim SMS gratis via web. Permintaan untuk membuat artikel dengan topik ini sudah banyak
masuk ke email saya maupun komentar dalam blog ini. Namun, mohon maaf baru kali ini saya bisa
mewujudkannya.

Untuk membuat fasilitas kirim SMS gratis via web, kita membutuhkan sebuah aplikasi gateway untuk
mengirim SMS. Aplikasi sms gateway ini nanti kita install atau letakkan di pc yang ada di rumah kita beserta
modem/hp yang tercolok pada PC tersebut sebagai alat untuk mengirim SMS. PC ini harus senantiasa
terhubung ke internet untuk berkomunikasi dengan PC server yang ada di hosting. Sedangkan di dalam
hosting, kita buat semacam script form untuk interface user yang ingin mengirim SMS. Untuk aplikasi sms
gateway yang diinstall di PC rumah, Anda bisa menggunakan Gammu sebagai enginenya.

Pertanyaan yang muncul kemudian adalah bagaimana cara mengkomunikasikan PC server yang ada di hosting
dengan PC di rumah, atau dengan kata lain bagaimana mengirim data sms yang disubmit via hosting kemudian
bisa sampai di PC rumah lalu mengirimkan sms tersebut via modem/hp?

OK konsep dasar atau ide dasar dalam pembuatannya adalah kita menggunakan semacam web service yang
dibuat di server hosting untuk komunikasi antara PC rumah dan PC hosting. Web service ini nanti senantiasa
akan diakses oleh PC rumah. Melalui web service inilah SMS akan dikirim dari PC hosting ke PC rumah. Lantas,
apa bentuk output dari web service ini? Web service disajikan dalam bentuk XML yang isinya adalah bunyi
SMS dan nomor tujuan SMS yang akan dikirim. Data XML yang berisi bunyi sms dan nomor tujuan inilah yang
nanti akan dibaca oleh PC rumah, lalu mengirimkannya lewat SMS gateway (Gammu).

Nah.. sekarang kita menuju implementasi cara pembuatannya.

Langkah pertama, Anda harus sudah menginstall Gammu sebagai tool SMS gateway nya. Pastikan Anda bisa
mengirim SMS menggunakan Gammu dan HP/modem yang tercolok di PC Anda.

Langkah kedua, buatlah script form untuk mengirim SMS. Script form ini nanti diletakkan di server hosting

sms.html

view sourceprint?
1.<form method="post" action="kirim.php">
2.No. Tujuan <input type="text" name="destination">
3.Isi SMS<br><textarea name="sms"></textarea>
4.</form>

Bila diperhatikan, form kirim SMS di atas nantinya akan disubmit di script kirim.php. Di dalam script kirim.php
inilah nomor tujuan dan isi SMS akan disimpan dalam tabel temporary pada database server hosting. Misalkan
kita beri nama tabel temporary tersebut adalah outbox. Kita bisa buat tabel outbox ini dengan struktur sbb:

view sourceprint?
1.CREATE TABLE `outbox` (
2.`id` int(11) AUTO_INCREMENT,
3.`destinationNumber` varchar(20),
4.`sms` text,
5.PRIMARY KEY (`id`)
6.)

Field id digunakan sebagai nomor unik penanda setiap SMS yang akan dikirim, field destinationNumber
untuk menyimpan nomor tujuan SMS, dan sms untuk menyimpan isi SMS.

OK, kita buat script kirim.php nya

kirim.php

view sourceprint?
01.<?php
02.// koneksi ke mysql server hosting
03.mysql_connect('dbhost', 'dbuser', 'dbpass');
04.mysql_select_db('dbname');
05.
06.// baca nomor tujuan dan isi sms dari form
07.$destNumber = $_POST['destination'];
08.$sms = $_POST['sms'];
09.
10.// query insert data sms ke tabel 'outbox'
11.$query = "INSERT INTO outbox (DestinationNumber, TextDecoded, CreatorID)
VALUES ('$destNumber', '$sms', 'Gammu')";
12.mysql_query($query);
13.
14.echo "SMS sudah dikirim...";
15.?>

Setelah data sms yang dikirim tersimpan dalam tabel outbox, langkah selanjutnya kita buat script web service
untuk menyajikan data sms yang tersimpan dalam tabel outbox tersebut ke dalam bentuk dokumen XML.
Misalkan kita beri nama script untuk mengenerate XML ini data.php

data.php

view sourceprint?
01.<?php
02.// koneksi ke mysql server hosting
03.mysql_connect('dbhost', 'dbuser', 'dbpass');
04.mysql_select_db('dbname');
05.
06.// membuat header dokumen XML
07.header('Content-Type: text/xml');
08.echo "<?xml version='1.0'?>";
09.
10.// membuat root tag untuk data XML
11.echo "<outbox>";
12.
13.// query untuk membaca seluruh SMS yang ada di tabel outbox
14.$query = "SELECT * FROM outbox ORDER BY id";
15.$hasil = mysql_query($query);
16.while ($data = mysql_fetch_array($hasil))
17.{
18.// representasi data sms
19.echo "<data>";
20.echo "<id>".$data['id']."</id>";
21.echo "<destination>".$data['destinationNumber']."</destination>";
22.echo "<sms>".$data['sms']."</sms>";
23.echo "</data>";
24.}
25.echo "</outbox>";
26.?>

OK ketiga file di atas (sms.html, kirim.php, dan data.php) nanti diletakkan di dalam server hosting. Sampai
langkah ini, kita sudah selesai bekerja di level server hosting. Langkah berikutnya adalah membuat script di
sisi PC rumah.

Di dalam PC rumah, nantinya kita akan membuat script untuk membaca data sms yang tersaji dalam bentuk
XML yang digenerate melalui script data.php yang ada di server hosting. Setelah data sms ini dibaca,
kemudian kita masukkan ke dalam tabel outbox bawaannya Gammu untuk dikirim melalui hp/modem. Oya,
kita perlu juga menghapus setiap data sms di server hosting yang sudah dibaca. Mengapa hal ini dilakukan?
ya dong, supaya tabel outbox nya di server hosting tidak penuh. Lantas, bagaimana cara menghapus data
secara otomatis di server hosting setelah data sms nya terbaca? ya kita gunakan CURL.

OK ini dia script untuk membaca data sms dari XML nya.

bacasms.php

view sourceprint?
01.<?php
02.// koneksi ke mysql di server localhost
03.mysql_connect('dbhost', 'dbuser', 'dbpass');
04.// nama database Gammu yang ada di localhost
05.mysql_select_db('dbname');
06.
07.// baca data XML dari server hosting yang digenerate oleh data.php
08.$dataxml = simplexml_load_file('http://namasitus/data.php');
09.foreach($dataxml->data as $data)
10.{
11.// baca field ID
12.$id = $data->id;
13.// baca nomor tujuan
14.$destination = $data->destination;
15.// baca isi sms
16.$sms = $data->sms;
17.
18.// mengirim SMS via Gammu dengan insert data ke tabel outbox Gammu
19.$query = "INSERT INTO outbox (DestinationNumber, TextDecoded) VALUES
('$destination', '$sms')";
20.mysql_query($query);
21.
22.// hapus data SMS di server hosting yang sudah terbaca berdasarkan ID
23.$curlHandle = curl_init();
24.curl_setopt($curlHandle, CURLOPT_URL, 'http://namasitus/hapus.php');
25.curl_setopt($curlHandle, CURLOPT_POSTFIELDS, 'id='.$id);
26.curl_setopt($curlHandle, CURLOPT_HEADER, 0);
27.curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
28.curl_setopt($curlHandle, CURLOPT_TIMEOUT,30);
29.curl_setopt($curlHandle, CURLOPT_POST, 1);
30.curl_exec($curlHandle);
31.curl_close($curlHandle);
32.}
33.?>

Jika web server di PC localhost belum mendukung CURL, maka lakukan setting CURLterlebih dahulu.

Eh kalo kita liat pada script bacasms.php di atas, pada proses penghapusan data SMS yang ada di server
hosting melalui CURL terdapat pemanggilan script hapus.php. Nah script ini belum kita buat di server
hosting. Script hapus.php ini nanti berfungsi untuk menghapus data sms yang ada di tabel outbox dalam
database server hosting berdasarkan ID nya setelah data sms tersebut di baca oleh script bacasms.php.

hapus.php

view sourceprint?
01.<?php
02.// koneksi ke mysql di server hosting
03.mysql_connect('dbhost', 'dbuser', 'dbpass');
04.mysql_select_db('dbname');
05.
06.// baca ID data yang akan dihapus yang dikirim via CURL dari localhost
07.$id = $_POST['id'];
08.// hapus data SMS berdasarkan ID
09.$query = "DELETE FROM outbox WHERE id = '$id'";
10.mysql_query($query);
11.
12.?>

Sekali lagi script hapus.php di atas harus ditaruh di server hosting lho ya !!!

Selanjutnya script bacasms.php ini harus senantiasa kita jalankan melalui web browser localhost di PC rumah
kita supaya bisa selalu membaca data sms yang ada di hosting lalu mengirimnya via Gammu. Lalu bagaimana
supaya script bacasms.php ini bisa secara otomatis berjalan dan selalu bisa membaca data dari server hosting?
Sebenarnya Anda bisa mengklik tombol REFRESH pada web browser supaya script ini bekerja, namun tentu
hal ini membuat report kan? Nah salah satu solusi dari hal ini adalah Anda bisa menjalankan autorefresh
melalui AJAX yang secara otomatis merefresh script bacasms.php ini pada setiap selang n detik. Ini dia script
nya

index.php

view sourceprint?
01.<html>
02.<head>
03.<title>SMS Server Running...</title>
04.<script type="text/javascript">
05.function ajax()
06.{
07.if (window.XMLHttpRequest)
08.{
09.xmlhttp=new XMLHttpRequest();
10.}
11.else
12.{
13.xmlhttp =new ActiveXObject("Microsoft.XMLHTTP");
14.}
15.
16.xmlhttp.onreadystatechange=function()
17.{
18.if (xmlhttp.readyState==4 && xmlhttp.status==200)
19.{
20.}
21.}
22.
23.xmlhttp.open("GET","bacasms.php");
24.xmlhttp.send();
25.setTimeout("ajax()", 5000);
26.}
27.</script>
28.
29.</head>
30.<body onload="ajax()">
31.<h1>SMS Server Running...</h1>
32.</body>
33.</html>

Contoh script AJAX yang ada di index.php di atas diset supaya bisa merefresh secara otomatis bacasms.php
dalam interval 5 detik (5000 ms). Dengan demikian yang perlu Anda jalankan di localhost hanyalah script
index.php di atas melalui browser.
Membuat Layanan Auto Reply SMS Untuk Mengetahui Artikel Terbaru Situs/Blog

Terkadang saya melihat-lihat lagi secara sekilas artikel-artikel yang pernah saya posting sebelumnya, sekedar
mencari ide dan inspirasi untuk tulisan saya yang terbaru di blog tutorial ini. Dan suatu ketika saya
menemukan arsip artikel saya tentangSMS notifikasi artikel terbaru dan teknik menyingkat URL dengan
Google API. Sepertinya kedua artikel ini bisa memberikan ide sebagai bahan artikel yang baru. Ide nya adalah
bagaimana membuat layanan SMS auto reply untuk menginformasikan artikel terbaru dari sebuah situs atau
blog. Hanya dengan format SMS misalnya: NEWS#BLOG.ROSIHANARI.NET, maka pengirim SMS ini bisa
mendapatkan informasi artikel terbaru dari Blog.RosihanAri.Net termasuk link URL nya.

Lantas apa bedanya dengan ide baru ini dengan SMS Notifikasi sebelumnya? Bedanya adalah SMS Notifikasi
ini bersifat broadcast SMS langsung ke banyak nomor ketika ada artikel terbaru dipublish, sedangkan ide baru
yang menggunakan Auto Reply SMS ini adalah hanya mengirimkan SMS informasi ke orang yang merequest
informasi tersebut. Tahu bedanya kan? Kelebihan dari Auto Reply SMS adalah bersifat terbuka, artinya
layanan ini terbuka bagi siapa saja yang ingin merequest informasi. Sedangkan untuk SMS notifikasi via
broadcast, bersifat tertutup artinya kita hanya bisa mengirim informasi ke nomor-nomor tertentu yang ada
dalam database.

Oya lantas apa gunanya penyingkat URL nya? gunanya adalah untuk menyingkat URL artikel terbaru yang
muncul dalam respon SMS auto replynya. Mengapa harus disingkat? ya karena saat ini kebanyakan blog
atau situs menggunakan permalink yang panjang untuk setiap artikelnya. Kalau URL permalinknya panjang,
bisa-bisa tekor biaya pengiriman SMS balasannya

OK dalam artikel kali ini, saya akan mencoba memaparkan cara membuat layanan auto reply SMS untuk
mengetahui artikel terbaru dalam suatu situs/blog. Akan tetapi dalam artikel ini hanya akan saya batasi pada
situs atau blog yang dibuat dengan WordPress saja karena pada umumnya blog WordPress memiliki URL RSS
Feed standard yaitu di http://namasitus/feed, contohnya http://blog.rosihanari.net/feed. Dari RSS Feed
itulah nanti kita akan manfaatkan untuk mendapatkan artikel terbaru.

Untuk membangun layanan ini, Anda bisa menggunakan Gammu sebagai core SMS engine nya, dan Gammu
ini sudah Anda install dengan baik dengan modem SMS yang direkomendasikan.

Setelah Gammu diinstall, pertama kita buat script untuk membaca SMS yang masuk ke inbox. Script ini nanti
berfungsi akan membaca SMS yang memiliki formatNEWS#NAMASITUS. Setelah SMS dibaca, selanjutnya
akan membaca RSS Feed dari situs tersebut dan mengambil data artikel terbaru meliputi judul artikel dan
URL artikelnya. Kemudian URL artikel ini nantinya akan disingkat, dan akhirnya mengirimkan respon sms ke
nomor pengirim berisi judul dan url artikel yang disingkat tersebut. Simpel kan idenya???

Oh ya hampir lupa, pastikan sebelumnya Anda sudah membuat function untuk menyingkat URL nya. Nama
function ini adalah singkatURL() yang disimpan dalam file function.php

function.php

view sourceprint?
01.<?php
02.function singkatURL($url)
03.{
04.$curlHandle = curl_init();
05.// melakukan request ke server Google API
06.curl_setopt($curlHandle,
CURLOPT_URL,'https://www.googleapis.com/urlshortener/v1/url');
07.curl_setopt($curlHandle, CURLOPT_HEADER, 0);
08.curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, 0);
09.// menentukan tipe konten hasil request yg berupa JSON
10.curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array('Content-Type:
application/json'));
11.// parameter yang berisi URL yang akan disingkat
12.curl_setopt($curlHandle, CURLOPT_POSTFIELDS, '{"longUrl":"'.$url.'"}');
13.curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
14.curl_setopt($curlHandle, CURLOPT_TIMEOUT,30);
15.// lakukan request dengan POST method
16.curl_setopt($curlHandle, CURLOPT_POST, 1);
17.
18.// baca data hasil request yg berupa JSON
19.$content = curl_exec($curlHandle);
20.curl_close($curlHandle);
21.
22.// ekstrak data JSON untuk mendapatkan hasil URL yg disingkat
23.$data = json_decode($content);
24.return $data->id;
25.}
26.?>

Selanjutnya kita buat script untuk memproses SMS nya

newartikel.php

view sourceprint?
01.<?php
02.
03.// mengincludekan function untuk menyingkat URL
04.include 'function.php';
05.
06.// koneksi ke database Gammu
07.$dbhost = 'localhost';
08.$dbuser = '...';
09.$dbpass = '...';
10.$dbname = '...';
11.mysql_connect($dbhost, $dbuser, $dbpass);
12.mysql_select_db($dbname);
13.
14.// membaca INBOX Gammu
15.$query = "SELECT * FROM inbox WHERE Processed = 'false'";
16.$hasil = mysql_query($query);
17.$data = mysql_fetch_array($hasil);
18.$id = $data['ID'];
19.$sms = $data['TextDecoded'];
20.$sender = $data['SenderNumber'];
21.
22.// proses parsing SMS berdasarkan karakter #
23.$parse = explode('#', $sms);
24.
25.// jika jumlah parameter hasil parsing adalah 2
26.if (count($parse) == 2)
27.{
28.// baca keyword hasil parsing
29.$keyword = strtoupper($parse[0]);
30.// baca url blog hasil parsing
31.$blogurl = $parse[1];
32.// jika keyword adalah 'NEWS' maka jalankan proses update status
33.if ($keyword == 'NEWS')
34.{
35.// mengubah URL blog menjadi huruf kecil spy seragam
36.$url = strtolower($blogurl);
37.// membaca data RSS Feed url blog
38.$fetchData = simplexml_load_file('http://'.$url.'/feed');
39.
40.foreach($fetchData as $news)
41.{
42.// membaca title dari RSS Feed
43.$title = $news->item->title;
44.// membaca URL artikel
45.$posturl = $news->item->link;
46.// menyingkat URL artikel
47.$singkatUrl = singkatURL($posturl);
48.break;
49.}
50.// setting balasan SMS
51.$reply = 'Artikel terbaru dari '.$url.': "'.$title.'" ('.$singkatUrl.')';
52.}
53.else $reply = 'Keyword salah';
54.}
55.else $reply = 'Format SMS Salah';
56.
57.// menandai SMS di INBOX Gammu bahwa sudah diproses
58.$query = "UPDATE inbox SET Processed = 'true' WHERE ID = '$id'";
59.mysql_query($query);
60.
61.// mengirim pesan SMS balasan ke nomor pengirim
62.$query = "INSERT INTO outbox(DestinationNumber, TextDecoded, CreatorID)
63.VALUES ('$sender', '$reply', 'Gammu')";
64.mysql_query($query);
65.?>

Supaya script newartikel.php ini bisa berjalan terus menerus sebagai SMS center, maka perlu kita gunakan
AJAX yang otomatis merefresh setiap interval waktu tertentu, sehingga Anda tidak perlu repot merefresh
script di atas secara manual berkali-kali.

index.html

view sourceprint?
01.<html>
02.<head>
03.<script type="text/javascript">
04.function proses()
05.{
06.if (window.XMLHttpRequest)
07.{
08.xmlhttp=new XMLHttpRequest();
09.}
10.else
11.{
12.xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
13.}
14.
15.xmlhttp.onreadystatechange=function()
16.{
17.if (xmlhttp.readyState==4 && xmlhttp.status==200)
18.{
19.}
20.}
21.
22.xmlhttp.open("GET","newartikel.php");
23.xmlhttp.send();
24.setTimeout("proses()", 5000);
25.}
26.</head>
27.<body onload="proses();">
28.<h1>SMS Center</h1>
29.</body>
30.</html>

Script AJAX di atas akan senantiasa merefresh script newartikel.php setiap selang interval 5 detik. Pastikan
index.html ini selalu terbuka di browser Anda.

Berikut ini contoh tampilan SMS balasan dari SMS center yang diterima di HP pengirim request dengan format
SMS: NEWS#BLOG.ROSIHANARI.NET

Mmm sepertinya script di atas masih ada kelemahan yaitu belum bisa mengirim balasan jika nama
blog/situsnya tidak valid atau tidak ada di internet. Nah hal ini sekaligus PR buat Anda untuk
mengembangkan script di atas
Menjalankan Script PHP Untuk SMS Gateway Tanpa Autorefresh Dengan AJAX

Sebenarnya sudah lama niat saya untuk artikel ini, tapi maaf baru kesampaian sekarang. Sepertinya para fans
blog ini sudah gak sabar Artikel ini didasarkan pada hasil eksperimen pribadi yang awalnya hanya bersifat
iseng-iseng saja. Dari judul artikel di atas, tentu Anda sudah bisa memperkirakan apa isi artikel ini yaitu cara
alternatif menjalankan script PHP untuk memproses SMS gateway tanpaautorefresh browser. Dalam hal ini
pembahasan hanya dibatasi untuk SMS Gateway dengan Gammu.

Pada artikel-artikel sebelumnya, seringkali saya membuat contoh-contoh script PHP untuk memproses SMS
yang masuk ke database menggunakan konsep autorefresh setiap n detik atau menjalankan script berulang-
ulang secara otomatis setiap n detik. Namun konsep ini terkadang kurang cocok untuk browser yang menolak
autorefresh. Beberapa rekan-rekan mengeluh karena browsernya tidak bisa melakukan autorefresh yang
kemungkinan disebabkan settingan di browsernya. Dengan autorefresh yang sering tersebut, terkadang
browser menganggap adanya suatu program abnormal.

Dari hal di atas, maka saya menggunakan pendekatan lain untuk menjalankan script PHP pengolah SMS
gateway tersebut bukan lagi menggunakan autorefresh namun menjalankan script PHP nya di balik layar
(browser) menggunakan AJAX (Asynchronous Javascript And XML).

Pada prinsipnya, penggunaan AJAX untuk menjalankan script PHP pengolah SMS gateway ini hampir sama
dengan autorefresh, namun perbedaannya hanyalah autorefreshnya dilakukan di balik layar browser. Untuk
proses autorefreshnya sendiri nanti menggunakan Javascript dan bukannya meload script ke browser seperti
sebelumnya.

Lantas.. bagaimana implementasinya? OK, andaikan kita memiliki script PHP bernama script.php untuk
mengolah SMS gatewaynya, dan juga halaman index.htm untuk halaman utama tampilan. Maka isi struktur
dari halaman index.htm adalah sbb:

index.htm

view sourceprint?
01.<html>
02.<head>
03.<title>SMS Server</title>
04.<script type="text/javascript" src="ajax.js"></script>
05.</head>
06.<body onload="autorefresh('script.php')">
07.<h1 align="center">SMS SERVER</h1>
08..
09..
10.</body>
11.</html>

Keterangan:

File ajax.js merupakan file berisi script Javascript untuk menjalankan AJAX
Sedangkan function autorefresh() adalah function untuk menjalankan autorefresh pada script.php.
Function ini nantinya diletakkan dalam ajax.js.

Selanjutnya, bagaimana isi script ajax.js nya? OK ini dia isinya


ajax.js

view sourceprint?
01.var page = "script.php";
02.
03.function autorefresh(page) {
04.if (window.XMLHttpRequest) {
05.req = new XMLHttpRequest();
06.req.open("GET", page, true);
07.req.send(null);
08.} else if (window.ActiveXObject) {
09.req = new ActiveXObject("Microsoft.XMLDOM");
10.if (req) {
11.req.open("GET", page, true);
12.req.send(null);
13.}
14.}
15.setTimeout("autorefresh(page)", 5000);
16.}

Javascript di atas akan melakukan autorefresh menggunakan AJAX pada setiap interval 5 detik (5000
milisekon). Anda bisa mengatur sendiri lama intervalnya pada bagian

view sourceprint?
1.setTimeout("autorefresh(page)", 5000);

OK thats all. Nah Script mana yang nantinya dijalankan di browser? yang dijalankan cukup file index.htm
saja. Untuk script.php nya tidak perlu dijalankan karena yang menjalankan adalah script AJAX nya.

Sekarang saya akan mengambil contoh implementasi pendekatan di atas pada kasusSMS Ulang Tahun yang
pernah dibahas.

Misalkan kita punya script PHP untuk memproses SMSnya sbb:

ultah.php

view sourceprint?
01.<?php
02.
03.// koneksi ke database mysql
04.mysql_connect("dbhost", "dbuser", "dbpass");
05.mysql_select_db("dbname");
06.
07.// baca tanggal sekarang
08.$tglNow = date("d");
09.
10.// baca bulan sekarang
11.$blnNow = date("m");
12.
13.// baca tahun-bulan-tanggal sekarang
14.$now = date("Y-m-d");
15.
16.// cari data teman yang bulan lahir dan tanggal lahir sesuai pada current
date
17.$query = "SELECT * FROM friends WHERE DAY(tglLahir) = '$tglNow' AND
MONTH(tglLahir) = '$blnNow'";
18.$hasil = mysql_query($query);
19.while ($data = mysql_fetch_array($hasil))
20.{
21.// baca nomor HP dan nama teman
22.$noHP = $data['noHP'];
23.$nama = $data['nama'];
24.
25.// insert data ke tabel kirim
26.$query2 = "INSERT INTO kirim (noHP, tglKirim) VALUES ('$noHP', '$now')";
27.$hasil2 = mysql_query($query2);
28.
29.// jika proses insert ke tabel kirim sukses maka kirim sms ucapan
30.if ($hasil2)
31.{
32.// isi pesan SMS ucapan ultah, disertai nama temannya
33.$pesanSMS = "Wahai sahabatku ".$nama.", Happy Birthday !! Semoga dengan
bertambahnya usiamu, semakin bertambah pula amalan ibadahmu.";
34.
35.// proses kirim sms via insert data ke tabel outbox
36.$query2 = "INSERT INTO outbox (DestinationNumber, TextDecoded, CreatorID)
VALUES ('$noHP', '$pesanSMS', 'Gammu')";
37.mysql_query($query2);
38.}
39.}
40.
41.?>

Berikutnya kita buat javascript ajax.js untuk AJAX nya sbb:

ajax.js

view sourceprint?
01.// setting file tujuan autorefresh via AJAX
02.var page = "ultah.php";
03.
04.function autorefresh(page) {
05.if (window.XMLHttpRequest) {
06.req = new XMLHttpRequest();
07.req.open("GET", page, true);
08.req.send(null);
09.} else if (window.ActiveXObject) {
10.req = new ActiveXObject("Microsoft.XMLDOM");
11.if (req) {
12.req.open("GET", page, true);
13.req.send(null);
14.}
15.}
16.setTimeout("autorefresh(page)", 5000);
17.}

Sedangkan isi dari file index.htm nya adalah

index.htm
view sourceprint?
01.<html>
02.<head>
03.<title>SMS Server</title>
04.<script type="text/javascript" src="ajax.js"></script>
05.</head>
06.<body onload="autorefresh('ultah.php')">
07.<h1 align="center">SMS SERVER ULANG TAHUN</h1>
08.</body>
09.</html>

Script di atas sudah diuji coba dan berjalan dengan lancar di modem Wavecom Fastrack.

Anda mungkin juga menyukai