SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
IMPLEMENTASI SMS GATEWAY DENGAN KANNEL
DAN MODEM WAVECOM
Hary Cahyono
wordpress.com, tifosilinux
Email : hary.cahyono@waki.mobi
h4ry.oop@gmail.com
Begitu banyak referensi mengenai smsgateway dengan berbagai
third party yang digunakannya, dengan hobi didunia Linux/UNIX
dan niat menambah referensi implementasi dengan kannel, maka
saya iseng membuat tulisan ini. Now being developed further by
the open source community, namely the Kannel Group.
Keyword : Guide Kannel
Pendahuluan
Sudah terlalu banyak referensi yang memuat Linux beserta kannel sebagai SMS
GATEWAY nya. Sekarang saya coba membagi seperti apa sih implementasinya jika
perusahaan/ corporate atau bahkan personal menginginkan business dengan Linux
beserta Kannel. Ekspektasi nya selalu diarahkan kepada hal yang sifatnya untuk
pemanfaatan ke arah positif. Mampu meraih optimalisasi business walaupun tetap
membawa lisensi GPL. Membuat business mudah dalam melakukan analisis dan
membuat Decision.
Konfigurasi Kannel
Semuanya dirancang bangun diatas sistem Linux OpenSuSE 11.2 Emerald dan
menggunakan modem WAVECOM dimana saya hanya akan memberikan point-point
nya saja karena sudah banyak referensi jika kita mencoba mencari di luar sana. Pasti
tidak akan memenuhi kebutuhan informasi kamu :) oleh karena itu saya coba
mencantumkan alamat email diatas. Biasanya kita rujuk ke path /etc/kannel/ namun akan
berbeda jika kamu melakukan kompilasi secara custom pada --prefix=/<path_directory>/
, berikut konfigurasi yang saya gunakan:
# Custom Config, Initiated by Hary on tifosilinux.com
# :) Check these out
#
# In case we are using WAVECOM as a modem to implementing this topologys : [public user, HP]<----
>([SMSC, Telco]<--send sms-->[Modem or HP])<---->[Kannel SMS Gateway]<---->[Database Server or
Content Server]
# We have to know 3 points of Kannel which is important to configure like mandatory (m), optional (o), and
conditional (c), then
# As we know it have 3 things to understand : bearerbox as connection handler between smsbox and(to)
smsc, smsbox as management function on kannel sms gateway, and wapbox as wap as connection
# Four group + 1 group modem required by group 'core' such as Group smsbox, smsc, sendsms-user,
smsservice, and modem
# Divided by 4 log-level to describes, 0 : Level debug, 1 : info, 2 : warning, 3 : error, 4 : panic
#
# Noted : Kannel SMS Gateway can be control/ managed by HTTP interface, like http://localhost:<admin-
port>/shutdown?password=<admin-password>
# Which is the <password> on url above could be changed with status, suspend, resume, start-smsc, and stop-
smsc
group = core
admin-port = 13000
admin-password = harysmatta
status-password = probolinggo
admin-deny-ip = "*.*.*.*"
admin-allow-ip = "127.0.0.1"
smsbox-port = 13003
#wapbox-port = 13004 # Not needed wap right now
box-deny-ip = "*.*.*.*"
box-allow-ip = "127.0.0.1"
log-file = "/var/log/kannel/kannel.log"
log-level = 1
access-log = "/var/log/kannel/kannel.access"
#unified-prefix = "+358, 00358, 0, +, 00"
#white-list = "http://localhost/whitelist.txt"
store-file = "/var/log/kannel/kannel.store"
group = smsbox
bearerbox-host = 127.0.0.1
sendsms-port = 13013
sendsms-chars = "0123456789 +-"
log-file = "/var/log/kannel/smsbox.log"
log-level = 0
access-log = "/var/log/kannel/sms-access.log"
global-sender = +6281100000
# blacklist = "http://localhost/sms/blacklist.txt"
group = smsc
smsc = at
host = 127.0.0.1
smsc-id = test
#modemtype = auto
modemtype = wavecom
device = /dev/ttyUSB0
speed = 115200
#validityperiod = 167
#keepalive = 10
# pin = 1314 # <== used by GSM
sim-buffering = true
sms-center = +6281100000
my-number = +6285311761918
#my-number = +6281316764465
# Mobile phone configuration
group = modems
id = WAVECOM
name = wavecom
detect-string = WAVECOM
#detect-string = AT # Use this if u're set modemtype as automatic on group smsc
init-string = "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
#init-string = "AT+CMEE=2;+CNMI=3,1,0,0,0"
#init-string = "AT+CNMI=2,1,2,2,0
#keepalive-cmd = "AT+CBC;+CSQ"
#message-storage = "sm"
############################### [IF] SMS Connection with SMPP as a protocol
#############################################
# group = smsc (m) #
# smsc = smpp (m) #
# host = 10.195.7.8 # Thisi is using VPN managed by vpn box in order to connect to telco ipaddress_server
SMS CENTER #
# port = 4322 #
# receive-port = 4322 # This is port including IP in order to connect to telco #
# smsc-username = "passinds" # Provided by telco #
# smsc-password = "smpassdf" # Provided by telco #
# system-type = "TCP" #
# interface-version = 33 #
# address-range = "9790" # CP / Content Provider's Shortcode provided by telco #
#######################################################################################
##################################
group = sendsms-user
username = telkomsel
password = telkomsel
max-messages = 5
concatenation = true
# --- SERVICES ---
# -- Find these with your own docs from telco --
# added new parameters :
# %k --> keyword
# %p --> User Number Sender
# %P --> User Number Receiver
# %t --> Time sender
# %T --> transactionid
# %D --> meta-data, forwarded from Operator (XL request)
group = sms-service
keyword = default
#keyword = reg
# get-url = "http://192.168.0.102:39790/mo/index.php?smscid=%i&msisdn=%p&to=%P&sms=
%a&trx_date=%t&tid=%T&meta=%D" # (c) URL came from program or
# script will be execute if the keyword match with text gateway received by. Using GET method in URL
<=== The highest one of hierarchy response text
# Parameter get-url dibawah akan mengembalikan reply couldn't fetch content
#get-url = "http://localhost/playsms/plugin/gateway/kannel/geturl.php?t=%t&q=%q&a=%a"
#get-url = "http://localhost/mo/getting.php?text=%b&sender=%p"
get-url = "http://localhost/mo/gettings.php?sender=%p&to=%P&text=%b&time=%t"
#get-url = "http://localhost/mo/received.php?sender=%p&text=%b"
max-messages = 3
#text = 'Pendaftaran Mahasiswa Baru'
###group = sms-service
###keyword = INFO
# post-url = # as same as get-url with different method POST <=== The highest one of hierarchy response
text
###file = /home/hary/info.txt
# Kannel helps you to store delivery reports
group = mysql-connection
id = mydlr
id = dlr-db
host = localhost
username = kannel
password = kannel
database = kannels
max-connections = 1
group = dlr-db
id = dlr-db
table = dlr
field-smsc = smsc
field-timestamp = ts
field-source = source
field-destination = destination
field-service = service
field-url = url
field-status = status
field-mask = mask
field-boxc-id = boxc
#group = sms-service
#keyword = Reg
#text = "Selamat anda terdaftar di layanan info IT. Dan tidak dapat berhenti berlangganan. :):) CS :
08569042489"
Dari konfigurasi diatas, sistem mengabaikan hashtag dan kita bisa membacanya sebagai
sebuah informasi. Semua konfigurasi dan MSISDN “BEBAS UNTUK DILIHAT :)”.
Didalam informasi tersebut, saya juga memberikan gambaran bagaimana jika shortcode
yang digunakan untuk kepentingan business corporate, jadinya tidak dengan
menggunakan msisdn pribadi (kamu bisa lihat-lihat di fitur busness di laman
http://tifosilinux.wordpress.com). Tinggal disesuaikan pada parameter :
global-sender = +6281100000, dan
sms-center = +6281100000
Karena saya menggunakan operator telkomsel, maka pusat dari pesan saya rujuk ke
+6281100000 dan +6281100000 untuk global-sender yang artinya, setiap nomor yang
diterima ke user (sebagai balasan dari sms MT yang telah dikirim) akan menggunakan
nomor +6281100000.
Kemudian, pada group sms-service kita bisa melakukan aktifasi jika menginginkan
sistem melakukan reply secara otomatis. Tinggal kita masukkan keyword dan text nya
sebagai reply atas keyword yang telah dikirim dari si sender. Kannel sebagai receiver
juga dapat melakukan custom reply pada get-url (bisa juga menggunakan post-url dsb)
dimana keyword tertentu yang telah di hardcode atau ter-register sebelumnya akan
melakukan reply sesuai trigger yang telah di register. Syaratnya set keyword ke nilai
default terlebih dahulu. Dalam hal melakukan dailypush (dimana user ter register dahulu
didalam sistem basis data untuk kemudian dikirimkan MT SMS (ter charge ataupun
tidak)), kita perlu menyiapkan parameter URI berikut :
"http://127.0.0.1:13013/cgi-bin/sendsms?
username=telkomsel&password=telkomsel&to=085695042489&text=Isi+SMS+yang+i
ngin+dikirim"
Untuk hubungan langsung Kannel ke MySQL guna meyimpan DLR (Delivery Report)
tidak akan saya bahas dan kamu bisa mendapatkan referensinya sendiri di internet. Jika
setting dan test berhasil, kamu akan mendapati logging-logging sebagai berikut :
Simulasi Transaksi
Sekarang kita coba memperjelas hal ini dengan membuat scripting yang 'amat sangat'
sederhana dengan PHP dan koneksi MySQL. Konsepnya begini:
Sebagai penyelia konten terhadap client, kita memutuhkan sebuah tools yang dapat
melakukan registrasi services atau layanan beserta nilai charging, isi konten, serta
deskripsi dari layanan tersebut. Didalam sistem butuh sebuah trigger guna mencocokkan
antara layanan dengan nilai charging. Untuk script bisa kamu download di
tifosilinux.wordpress.com, berikut screenshot nya :
Jika sudah mengerti arahnya, kita amati script get-url untuk mendapatkan reply sms
sesuai dengan yang diharapkan. File mengacu pada parameter get-url yang digunakan.
Tempatkan script sesuai document root kamu;
<?php
// Inititated by Harysmatta
mysql_connect("localhost", "kannel", "kannel");
mysql_select_db("kannels");
//http://localhost/mo/gettings.php?sender=%p&to=%P&text=%b&time=%t
//http://localhost/mo/gettings.php?sender=09230232&to=1212232&text=DOA&time=091282912
$msgfrom = $_GET['sender'];
$msgto = $_GET['to'];
$msgtimestamp = $_GET['time'];
$svc_keyword = $_GET['text'];
//Or you can using :
//$svc_keyword = $HTTP_GET_VARS['text'];
// Avoiding these nested query if u can ;)
$price_mapping = "select b.charging_value as price from charging b where b.id in(select c.charging_id from
service_charging_mapping c where c.service_id = (select a.id from service a where a.service_name =
'$svc_keyword' ))";
$key_price_mapping = mysql_query($price_mapping);
while($result1 = mysql_fetch_array($key_price_mapping)){
$price = $result1['price'];
}
// 'Mobile Originating' like
$inserting_MO = mysql_query("insert into tbl_msgtransacts (MSGFROM, MSGTO, MSGDATA, PRICE,
MSGTIMESTAMP, SUBJECT, OPERATOR) values('$msgfrom', '$msgto', '$svc_keyword', '$price',
'$msgtimestamp', 'MO;PULL;TEXT', 'TSEL')");
$keyword_query = "select description from service where service_name = '$svc_keyword'";
$key_query=mysql_query($keyword_query);
while($result2=mysql_fetch_array($key_query)){
$msgdata = "Congrats : ".$result2['description']."";
echo "Congrats : ".$result2['description']."";
}
// 'Mobile Terminating' like
$inserting_MT = mysql_query("insert into tbl_msgtransacts (MSGFROM, MSGTO, MSGDATA, PRICE,
MSGTIMESTAMP, SUBJECT, OPERATOR) values('$msgto', '$msgfrom', '$msgdata', '$price', '$msgtimestamp',
'MT;PULL;TEXT', 'TSEL')");
Sesuaikan koneksi ke MySQL kamu, sebenarnya bisa menggunakan PDO jika DB Type
yang digunakan berlainan jenis. Script akan mengambil variabel pada url kemudian
melakukan pengecekkan pada tabel-tabel yang digunakan saat inserting service
(disarankan kamu membuat service register terlebih dahulu seperti screenshoot diatas).
Script akan mencocokkan price sesuai dengan keyword (dalam hal ini kita analogikan
sebagai service) dan akan melakukan inserting as a MO and MT. Kita bahkan bisa
menambahkan status ataupun Closereason dari setiap message, namun belum sempat
saya lakukan. Dan bisa saja kamu memperluas konsep diatas.
Kita bisa melihat setiap transaksi diatas pada table tbl_msgtransacts yang kita siapkan
sebelumnya, berikut screenshoot nya:
Silahkan kamu buat sendiri MO Traffic sebagai tools complement transaksi diatas ;)
SMS Alert
Ibaratkan begini, kita seorang business analyst.. dan melakukan sebuah perencanaan
pada setiap Content Provider untuk menjalankan campaign sebagai activity sales nya.
Kita menjalankan sebuah aplikasi dari vendor dimana mulai dari menentukan tipe
layanan yang dijalankan, range waktu hingga telco mana yang dipilih, namun satu hal..
tidak ada notifikasi pesan ke Account Engineer (AE) sebagai perwakilan CP dan System
Administrator serta Monitoring Team nya. Bahwa telah dijalankan sebuah campaign
dengan range waktu tertentu dan di setiap telco dan CP mana saja campaign telah
berjalan hingga selesai.
Jadi yang kita harapkan ada sebuah aktifitas tambahkan untuk mengirimkan notifikasi ke
System Administrator serta Monitoring Team. Sebuah analogi kembali saya coba
perlihatkan:
Karena hal ini berkaitan dengan mengirimkan pesan notifikasi dan sedikit banyak
menentukan dalam membuat keputusan bisnis, maka kita perlu membuat priviliges
berupa sebuah session. File-file yang dibutuhkan adalah trigger.sh, triggering.sh,
cekpswd.php, login.html, logout.php, sign.php, sorry.html, green.png, red.png, exec1
s.d. exec9.sh serta SendSMS.php. Tentu file-file tersebut penamaannya bisa
disesuaikan.
Oke, diperjelas.. contoh sample hierarki direktorinya sebagai berikut:
/var/www/html/SendSMS.php
/var/www/html/support/cekpswd.php
/var/www/html/support/login.html
/var/www/html/support/logout.php
/var/www/html/support/sign.php
/var/www/html/support/sorry.html
/var/www/html/support/green.png
/var/www/html/support/red.png
/home/hary/script/trigger.sh
/home/hary/script/triggering.sh
/home/hary/script/exec1-9.sh
Sebagai catatan, saya tidak akan memberikan detail DB dan table-table yang
digunakan hingga field-field nya, namun kamu bisa memenuhi kebutuhan tersebut
dengan membaca script.
Kemudian kita breakdown isi setiap script;
<Login.html>
<html>
<head>
<title>Login dulu</title>
</head>
<body>
<article style='width:40%;float:left;margin:0 30%;' />
<b>Login untuk user yang sudah terdaftar sebelumnya </b>
<pre>
<form name="frmLogIn" METHOD="post" ACTION="/support/cekpswd.php">
Username : <INPUT TYPE="text" NAME="uname">
Password : <INPUT TYPE="password" NAME="pswd">
<INPUT TYPE="submit" VALUE="Submit">
</form>
</pre>
</body>
</html>
Script menggunakan method post pada attribute nya dan menggunakan nama frmLogin
dimana membutuhkan file cekpswd.php guna pengecekkan.
<cekpswd.php>
<?php
/*
* Session started by HarysMatta on tifosilinux.wordpress.com
*
*/
session_start();
$uname = $_POST['uname'];
$pswd = sha1($_POST['pswd']);
$host = "localhost";
$user = "root";
$pwd = '';
$db = 'login';
$sql = "select * from member where uname='$uname'";
$conn = @mysql_connect($host, $user, $pwd) or die("Koneksi gagal : " . mysql_error());
mysql_select_db($db);
$qry = mysql_query($sql) or die("Query salah : " . mysql_error());
$num = mysql_num_rows($qry);
$row = mysql_fetch_array($qry);
if ($num==0 OR $pswd!=$row['pswd']){
header("Location: /support/sorry.html");
}
else{
$_SESSION['login']=1;
header("Location: http://localhost/SendSMS.php");
}
?>
Disinilah session kita buka menggunakan fungsi session_start(); dan melakukan
pengecekkan jika username dan password sudah di insert secara manual atau belum.
Dengan segala detail nya mulai dari koneksi dan pengambilan value dari method POST
yang digunakan, jika login berhasil akan di redirect ke halaman
http://localhost/SendSMS.php
<SendSMS.php>
<?php
session_start();
if(!isset($_SESSION['login'])){
include("/var/www/html/support/login.html");
}
else{
mysql_connect("localhost", "kannel", "kannel");
mysql_select_db("kannels");
echo "<html>
<head>
<title>TifosiLinux Wordpress</title>
</head>
<body>";
echo "<article style='width:40%;float:left;margin:0 30%;' />";
echo "<div style='border: 2px solid green; height: 370px; padding: 5px; text-align: left; width: 430px;'>
<form method='post' action='SendSMS.php'>
<table border=0 width=430px>
<tr>
<td>
<b>CP 3Tinggi</b><br>
<input type='checkbox' value='ProXL1' name='ProXL1'>ProXL<br>
<input type='checkbox' value='Indosat1' name='Indosat1'>Indosat<br>
<input type='checkbox' value='TSEL1' name='TSEL1'>Telkomsel<br><br>
<b>CP Passindonesia</b><br>
<input type='checkbox' value='ProXL2' name='ProXL2'>ProXL<br>
<input type='checkbox' value='Indosat2' name='Indosat2'>Indosat<br>
<input type='checkbox' value='TSEL2' name='TSEL2'>Telkomsel<br><br>
<b>CP YattaEra</b><br>
<input type='checkbox' value='ProXL3' name='ProXL3'>ProXL<br>
<input type='checkbox' value='Indosat3' name='Indosat3'>Indosat<br>
<input type='checkbox' value='TSEL3' name='TSEL3'>Telkomsel<br><br>
</td>
<td>
<b>Duration of Campaign</b><br>
<select name='hour'>
<option selected='selected'>Hour</option>";
for($d=0; $d<=24; $d+=1){
echo "<option value=$d>$d</option>";
}
echo "</select>hour
<select name='minute'>
<option selected='selected'>Minute</option>";
for($c=1; $c<=60; $c+=1){
echo "<option value=$c>$c</option>";
}
echo "</select>minute/s
<br><br><b>Status</b><br>";
echo "<iframe src='http://localhost/support/sign.php' height='120' width='120'></iframe>";
echo "</td>
</tr>
</table>
";
/* For Example */
if (isset($_POST['ProXL1']))
{
// echo $_POST['ProXL1'].'<br />';
shell_exec("/home/hary/script/exec1.sh");
}
if (isset($_POST['ProXL2']))
{
// echo $_POST['ProXL2'].'<br />';
shell_exec("/home/hary/script/exec2.sh");
}
if (isset($_POST['ProXL3']))
{
// echo $_POST['ProXL3'].'<br />';
shell_exec("/home/hary/script/exec3.sh");
}
if (isset($_POST['Indosat1']))
{
// echo $_POST['Indosat1'].'<br />';
shell_exec("/home/hary/script/exec4.sh");
}
if (isset($_POST['Indosat2']))
{
shell_exec("/home/hary/script/exec5.sh");
}
if (isset($_POST['Indosat3']))
{
// echo $_POST['Indosat3'].'<br />';
shell_exec("/home/hary/script/exec6.sh");
}
if (isset($_POST['TSEL1']))
{
// echo $_POST['TSEL1'].'<br />';
shell_exec("/home/hary/script/exec7.sh");
}
if (isset($_POST['TSEL2']))
{
// echo $_POST['TSEL2'].'<br />';
shell_exec("/home/hary/script/exec8.sh");
}
if (isset($_POST['TSEL3']))
{
// echo $_POST['TSEL3'].'<br />';
shell_exec("/home/hary/script/exec9.sh");
}
/* For Example */
//if ($_POST['hour'] != "Hour" && $_POST['minute'] != "Minute")
if ($_POST['hour'] != "Hour" && $_POST['minute'] != "Minute")
{
$HOUR = $_POST['hour'];
$MINUTE = $_POST['minute'];
mysql_query("TRUNCATE TABLE `kannels`.`trigger`");
mysql_query("INSERT INTO `kannels`.`trigger` (`id`, `hour`, `minute`, `status`, `laststatus`) VALUES (NULL, '$HOUR',
'$MINUTE', 'isActive', 'set')");
echo "Schedule has been set<br>";
}
else
{
echo "<b>Noted : </b>Schedule & Duration of Campaign can't be empty<br>";
}
echo "<input type='submit' value='Submit' name='submit'>
<a href='http://localhost/support/logout.php'>Logout</a></div>
</body>
</html>";
Iframe digunakan untuk menampilkan status secara realtime dengan menggunakan file
sign.php dengan META refresh untuk melihat kondisi campaign. Gunakan file green.png
untuk status aktif dan red.png ketika status finish. Status dipicu oleh isi dari table
trigger pada field status dan laststatus. Shell script yang bertugas untuk melakukan
action nya, yakni trigger.sh yang kita set pada cronjobs untuk pengecekkan setiap saat.
Kemudian script ini akan otomatis melakukkan update waktu cronjobs untuk file
triggering.sh
<trigger.sh>
#!/bin/bash
# Setup this script with all wildcards : * * * * * /home/hary/script/trigger.sh
check=`mysql -hlocalhost -ukannel -p'kannel' kannels -e "select laststatus from kannels.trigger order by id desc limit 1" | grep -v
"laststatus"`
if [[ $check == "set" ]];
then
menit=`crontab -l | grep 'triggering.sh' | awk '{print $1}'`
jam=`crontab -l | grep 'triggering.sh' | awk '{print $2}'`
hour=`mysql -hlocalhost -ukannel -p'kannel' kannels -e "select hour from kannels.trigger order by id desc limit 1" | grep -v
"hour"`
minute=`mysql -hlocalhost -ukannel -p'kannel' kannels -e "select minute from kannels.trigger order by id desc limit 1" | grep -v
"minute"`
final_minute=`date --date='+'$minute' minutes' +"%M"`
final_hour=`date --date='+'$hour' hour' +"%H"`
sed -i 's/'$menit' '$jam' * * * /home/hary/script/triggering.sh/'$final_minute' '$final_hour' * * *
/home/hary/script/triggering.sh/' /var/spool/cron/tabs/root
mysql -hlocalhost -ukannel -p'kannel' kannels -e "UPDATE kannels.trigger set laststatus='unset' where laststatus='set'"
fi
<triggering.sh>
#!/bin/bash
#number1=085695042489
number2=081316764465
time=`date +"%H:%M"`
#links -dump "http://127.0.0.1:13013/cgi-bin/sendsms?username=telkomsel&password=telkomsel&to=$number1&text=Info+:
+Campaign+has+been+stop+at+$time+a+clock"
links -dump "http://127.0.0.1:13013/cgi-bin/sendsms?username=telkomsel&password=telkomsel&to=$number2&text=Info+:
+Campaign+has+been+stop+at+$time+a+clock"
mysql -hlocalhost -ukannel -p'kannel' kannels -e "UPDATE kannels.trigger set status='isDie' where status='isActive'"
Kita juga membutuhkan file-file exec sebagai action apabila value dari POST sesuai
dengan kondisi, file menggunakan parameter url untuk mengirimkan pesan.
<exec1.sh – exec9.sh>
#!/bin/bash
#number1=085695042489
number2=081316764465
hour=`mysql -hlocalhost -ukannel -p'kannel' kannels -e "select hour from kannels.trigger order by id desc limit 1" | grep -v hour`
minute=`mysql -hlocalhost -ukannel -p'kannel' kannels -e "select minute from kannels.trigger order by id desc limit 1" | grep -v
minute`
#links -dump "http://127.0.0.1:13013/cgi-bin/sendsms?username=telkomsel&password=telkomsel&to=$number1&text=Info+:
+telco+ProXL+di+3Tinggi+sedang+campaign"
links -dump "http://127.0.0.1:13013/cgi-bin/sendsms?username=telkomsel&password=telkomsel&to=$number2&text=Info+:
+telco+Telkomsel+di+3Tinggi+sedang+campaign+untuk+$hour+jam+$minute+minute"
echo 'date +"%H:%M:%S"' >> /tmp/LOGGING.txt
#links -dump "http://127.0.0.1:13013/cgi-bin/sendsms?username=telkomsel&password=telkomsel&to=$number1&text=Info+:
+telco+Telkomsel+di+3Tinggi+sedang+campaign"
Isi message diatas bisa dirubah sesuai kebutuhan.
<sorry.html>
<HTML>
<HEAD>
<TITLE> Sorry </TITLE>
</HEAD>
<BODY>
<article style='width:40%;float:left;margin:0 30%;' />
<b> Username ato password anda ndak bener</b><br>
<a href="http://localhost/support/login.html"> Back </a>
</BODY>
</HTML>
<logout.php>
<?
/*
* Session started by HarysMatta on tifosilinux.wordpress.com
*
*/
session_start();
unset($_SESSION['login']);
session_destroy();
header("Location: /support/login.html");
?>
Script pada file logout.php diatas akan melepas session yang sebelumnya telah
terbentuk.
<sign.php>
<?php
mysql_connect("localhost", "kannel", "kannel");
mysql_select_db("kannels");
echo "<META HTTP-EQUIV='REFRESH' CONTENT='3;URL=http://localhost/support/sign.php'>";
$stat="select status from kannels.trigger order by id desc limit 1";
$hasil1=mysql_query($stat);
$hasil2=mysql_fetch_array($hasil1);
if($hasil2['status'] != "isActive")
{
echo "<img src='http://localhost/support/red.png'></img>";
}
else{
echo "<img src='http://localhost/support/green.png'></img>";
}
Akhirnya kita bisa lihat kondisi pada tiga screenshoot dibawah ini:
Referensi
Kannel cvs-20030901 User’s Guide, Open Source WAP and SMS gateway Andreas Fink
Chairman & CTO, Global Networks Inc. andreas@fink.org, http://www.smsrelay.com,
http://www.gni.ch, Bruno Rodrigues, bruno.rodrigues@litux.org, http://litux.org/bruno
*) Semuanya ditulis diatas sistem Linux OpenSuSE 11.2 Emerald, OpenOffice 3.1.1, dia
v 0.97. dan Okular v 0.9.5

Más contenido relacionado

La actualidad más candente

Cloud Computing Dengan VMWARE
Cloud Computing Dengan VMWARECloud Computing Dengan VMWARE
Cloud Computing Dengan VMWAREHary HarysMatta
 
2013 12. Administrasi Server Linux Ubuntu
2013 12. Administrasi Server Linux Ubuntu2013 12. Administrasi Server Linux Ubuntu
2013 12. Administrasi Server Linux UbuntuSyiroy Uddin
 
Trik membuat-websites-intranet-agar-dapat-di-akses-dari-internet
Trik membuat-websites-intranet-agar-dapat-di-akses-dari-internetTrik membuat-websites-intranet-agar-dapat-di-akses-dari-internet
Trik membuat-websites-intranet-agar-dapat-di-akses-dari-internetrizal99x
 
Supriyanto squidproxyserver
Supriyanto squidproxyserverSupriyanto squidproxyserver
Supriyanto squidproxyserverHARRY CHAN PUTRA
 
Aplikasi monitor jaringan dan keamanan linux ~ m rendi
Aplikasi monitor jaringan dan keamanan linux ~ m rendiAplikasi monitor jaringan dan keamanan linux ~ m rendi
Aplikasi monitor jaringan dan keamanan linux ~ m rendiRachman Arif
 
Konfigurasi dhcp server pada debian 7
Konfigurasi dhcp server pada debian 7Konfigurasi dhcp server pada debian 7
Konfigurasi dhcp server pada debian 7Denni Setyawan
 
2012-26. video streaming dgn cms menggunakan phpmotion
2012-26. video streaming dgn cms menggunakan phpmotion2012-26. video streaming dgn cms menggunakan phpmotion
2012-26. video streaming dgn cms menggunakan phpmotionSyiroy Uddin
 
Laporan instalasi dan konfigurasi samba pada linux ubuntu sever 11
Laporan instalasi dan konfigurasi samba pada linux ubuntu sever 11Laporan instalasi dan konfigurasi samba pada linux ubuntu sever 11
Laporan instalasi dan konfigurasi samba pada linux ubuntu sever 11Rosidin Ali Syabana
 
Cara replikasi
Cara replikasiCara replikasi
Cara replikasichrezjohn
 
Memblokir situs dengan squid proxy di linux debian server By: Fakhri akbar CC5
Memblokir situs dengan squid proxy di linux debian server By: Fakhri akbar CC5Memblokir situs dengan squid proxy di linux debian server By: Fakhri akbar CC5
Memblokir situs dengan squid proxy di linux debian server By: Fakhri akbar CC5akbarfak
 
Laporan konfigurasi samba server
Laporan konfigurasi samba serverLaporan konfigurasi samba server
Laporan konfigurasi samba serverDenni Setyawan
 
Tutorial ClearOS Enterprise 5.2 (Step By Step)
Tutorial ClearOS Enterprise 5.2 (Step By Step)Tutorial ClearOS Enterprise 5.2 (Step By Step)
Tutorial ClearOS Enterprise 5.2 (Step By Step)Deni Kurnia
 
Makalah pemrograman generasi keempat postgresql
Makalah pemrograman generasi keempat postgresqlMakalah pemrograman generasi keempat postgresql
Makalah pemrograman generasi keempat postgresqlfaisalrafix
 
Pembahasansoallks2013
Pembahasansoallks2013Pembahasansoallks2013
Pembahasansoallks2013dedd_simbolon
 
Mengubah Hostname dari Standalone PVE 5.3 Node
Mengubah Hostname dari Standalone PVE 5.3 NodeMengubah Hostname dari Standalone PVE 5.3 Node
Mengubah Hostname dari Standalone PVE 5.3 NodeI Putu Hariyadi
 
Konfigurasi proxy server
Konfigurasi proxy serverKonfigurasi proxy server
Konfigurasi proxy serverYudha Satya
 

La actualidad más candente (20)

Cloud Computing Dengan VMWARE
Cloud Computing Dengan VMWARECloud Computing Dengan VMWARE
Cloud Computing Dengan VMWARE
 
2013 12. Administrasi Server Linux Ubuntu
2013 12. Administrasi Server Linux Ubuntu2013 12. Administrasi Server Linux Ubuntu
2013 12. Administrasi Server Linux Ubuntu
 
Trik membuat-websites-intranet-agar-dapat-di-akses-dari-internet
Trik membuat-websites-intranet-agar-dapat-di-akses-dari-internetTrik membuat-websites-intranet-agar-dapat-di-akses-dari-internet
Trik membuat-websites-intranet-agar-dapat-di-akses-dari-internet
 
Tutorial instalasi ubuntu server 12.04, setting DNS server dan Web server
Tutorial instalasi ubuntu server 12.04, setting DNS server dan Web serverTutorial instalasi ubuntu server 12.04, setting DNS server dan Web server
Tutorial instalasi ubuntu server 12.04, setting DNS server dan Web server
 
Supriyanto squidproxyserver
Supriyanto squidproxyserverSupriyanto squidproxyserver
Supriyanto squidproxyserver
 
Ajar mysql5 1
Ajar mysql5 1Ajar mysql5 1
Ajar mysql5 1
 
Aplikasi monitor jaringan dan keamanan linux ~ m rendi
Aplikasi monitor jaringan dan keamanan linux ~ m rendiAplikasi monitor jaringan dan keamanan linux ~ m rendi
Aplikasi monitor jaringan dan keamanan linux ~ m rendi
 
Konfigurasi dhcp server pada debian 7
Konfigurasi dhcp server pada debian 7Konfigurasi dhcp server pada debian 7
Konfigurasi dhcp server pada debian 7
 
2012-26. video streaming dgn cms menggunakan phpmotion
2012-26. video streaming dgn cms menggunakan phpmotion2012-26. video streaming dgn cms menggunakan phpmotion
2012-26. video streaming dgn cms menggunakan phpmotion
 
Laporan instalasi dan konfigurasi samba pada linux ubuntu sever 11
Laporan instalasi dan konfigurasi samba pada linux ubuntu sever 11Laporan instalasi dan konfigurasi samba pada linux ubuntu sever 11
Laporan instalasi dan konfigurasi samba pada linux ubuntu sever 11
 
Cara replikasi
Cara replikasiCara replikasi
Cara replikasi
 
Memblokir situs dengan squid proxy di linux debian server By: Fakhri akbar CC5
Memblokir situs dengan squid proxy di linux debian server By: Fakhri akbar CC5Memblokir situs dengan squid proxy di linux debian server By: Fakhri akbar CC5
Memblokir situs dengan squid proxy di linux debian server By: Fakhri akbar CC5
 
Laporan konfigurasi samba server
Laporan konfigurasi samba serverLaporan konfigurasi samba server
Laporan konfigurasi samba server
 
Tutorial ClearOS Enterprise 5.2 (Step By Step)
Tutorial ClearOS Enterprise 5.2 (Step By Step)Tutorial ClearOS Enterprise 5.2 (Step By Step)
Tutorial ClearOS Enterprise 5.2 (Step By Step)
 
Makalah pemrograman generasi keempat postgresql
Makalah pemrograman generasi keempat postgresqlMakalah pemrograman generasi keempat postgresql
Makalah pemrograman generasi keempat postgresql
 
Pembahasansoallks2013
Pembahasansoallks2013Pembahasansoallks2013
Pembahasansoallks2013
 
Mengubah Hostname dari Standalone PVE 5.3 Node
Mengubah Hostname dari Standalone PVE 5.3 NodeMengubah Hostname dari Standalone PVE 5.3 Node
Mengubah Hostname dari Standalone PVE 5.3 Node
 
Konfigurasi proxy server
Konfigurasi proxy serverKonfigurasi proxy server
Konfigurasi proxy server
 
Tugas os 2 ke II
Tugas os 2 ke IITugas os 2 ke II
Tugas os 2 ke II
 
Lapres 6 1235010002
Lapres 6   1235010002Lapres 6   1235010002
Lapres 6 1235010002
 

Similar a SMS GATEWAY DENGAN KANNEL DAN MODEM WAVECOM

Tutorial membuat sertifikat ssl menggunakan xampp
Tutorial membuat sertifikat ssl menggunakan xamppTutorial membuat sertifikat ssl menggunakan xampp
Tutorial membuat sertifikat ssl menggunakan xamppYoga Pratama Putra
 
Cara mengerjakan ukk
Cara mengerjakan ukkCara mengerjakan ukk
Cara mengerjakan ukkactorterbaik
 
Kajian kes datagram analisis dengan wireshark
Kajian kes   datagram analisis dengan wiresharkKajian kes   datagram analisis dengan wireshark
Kajian kes datagram analisis dengan wiresharkMad Qiyud
 
2013-40. Konfigurasi Mail server pada ubuntu server 11.10
2013-40. Konfigurasi Mail server pada ubuntu server 11.102013-40. Konfigurasi Mail server pada ubuntu server 11.10
2013-40. Konfigurasi Mail server pada ubuntu server 11.10Syiroy Uddin
 
konfigurasi mail server
konfigurasi mail serverkonfigurasi mail server
konfigurasi mail serverMuhammad Anang
 
Tugas keamanan sistem informasi membuat ca hazahara
Tugas keamanan sistem informasi membuat ca hazaharaTugas keamanan sistem informasi membuat ca hazahara
Tugas keamanan sistem informasi membuat ca hazaharaHazahara shadah
 
Laporan resmi HTTP dan HTTPS
Laporan resmi HTTP dan HTTPSLaporan resmi HTTP dan HTTPS
Laporan resmi HTTP dan HTTPSiintanamalia
 
Bypass web security dengan menggunakan teknik XST (Cross Sites Tracing)
Bypass web security dengan menggunakan  teknik XST (Cross Sites Tracing)Bypass web security dengan menggunakan  teknik XST (Cross Sites Tracing)
Bypass web security dengan menggunakan teknik XST (Cross Sites Tracing)Mark Thalib
 
3 anang supriyanta_konfigurasi_server_full_version2
3 anang supriyanta_konfigurasi_server_full_version23 anang supriyanta_konfigurasi_server_full_version2
3 anang supriyanta_konfigurasi_server_full_version2HARRY CHAN PUTRA
 
Bab v konfigurasi jaringan lanjut cli (copy)
Bab v konfigurasi jaringan lanjut cli  (copy)Bab v konfigurasi jaringan lanjut cli  (copy)
Bab v konfigurasi jaringan lanjut cli (copy)Mailes Wunungga9910307
 
Bab v konfigurasi jaringan lanjut cli (copy)
Bab v konfigurasi jaringan lanjut cli  (copy)Bab v konfigurasi jaringan lanjut cli  (copy)
Bab v konfigurasi jaringan lanjut cli (copy)Mailes Wunungga9910307
 
Implementasi otentikasi pada squid dalam mode transparent proxy
Implementasi otentikasi pada squid dalam mode transparent proxyImplementasi otentikasi pada squid dalam mode transparent proxy
Implementasi otentikasi pada squid dalam mode transparent proxyPanggih Supraja
 
Modul setting dns--ok
Modul setting dns--ok Modul setting dns--ok
Modul setting dns--ok Iman Sudrajat
 
Hitung Ongkos Kirim Menggunakan API rajaongkir.com dengan PHP+JQUERY
Hitung Ongkos Kirim Menggunakan API rajaongkir.com dengan PHP+JQUERYHitung Ongkos Kirim Menggunakan API rajaongkir.com dengan PHP+JQUERY
Hitung Ongkos Kirim Menggunakan API rajaongkir.com dengan PHP+JQUERYYusuf A.H.
 

Similar a SMS GATEWAY DENGAN KANNEL DAN MODEM WAVECOM (20)

Tutorial membuat sertifikat ssl menggunakan xampp
Tutorial membuat sertifikat ssl menggunakan xamppTutorial membuat sertifikat ssl menggunakan xampp
Tutorial membuat sertifikat ssl menggunakan xampp
 
Setting mikrotik ll
Setting mikrotik llSetting mikrotik ll
Setting mikrotik ll
 
J
JJ
J
 
Cara mengerjakan ukk
Cara mengerjakan ukkCara mengerjakan ukk
Cara mengerjakan ukk
 
Dokumentasi Gammu
Dokumentasi GammuDokumentasi Gammu
Dokumentasi Gammu
 
Kajian kes datagram analisis dengan wireshark
Kajian kes   datagram analisis dengan wiresharkKajian kes   datagram analisis dengan wireshark
Kajian kes datagram analisis dengan wireshark
 
2013-40. Konfigurasi Mail server pada ubuntu server 11.10
2013-40. Konfigurasi Mail server pada ubuntu server 11.102013-40. Konfigurasi Mail server pada ubuntu server 11.10
2013-40. Konfigurasi Mail server pada ubuntu server 11.10
 
konfigurasi mail server
konfigurasi mail serverkonfigurasi mail server
konfigurasi mail server
 
Konfigurasi web server
Konfigurasi web serverKonfigurasi web server
Konfigurasi web server
 
Tugas keamanan sistem informasi membuat ca hazahara
Tugas keamanan sistem informasi membuat ca hazaharaTugas keamanan sistem informasi membuat ca hazahara
Tugas keamanan sistem informasi membuat ca hazahara
 
Laporan resmi HTTP dan HTTPS
Laporan resmi HTTP dan HTTPSLaporan resmi HTTP dan HTTPS
Laporan resmi HTTP dan HTTPS
 
Bypass web security dengan menggunakan teknik XST (Cross Sites Tracing)
Bypass web security dengan menggunakan  teknik XST (Cross Sites Tracing)Bypass web security dengan menggunakan  teknik XST (Cross Sites Tracing)
Bypass web security dengan menggunakan teknik XST (Cross Sites Tracing)
 
3 anang supriyanta_konfigurasi_server_full_version2
3 anang supriyanta_konfigurasi_server_full_version23 anang supriyanta_konfigurasi_server_full_version2
3 anang supriyanta_konfigurasi_server_full_version2
 
Bab v konfigurasi jaringan lanjut cli (copy)
Bab v konfigurasi jaringan lanjut cli  (copy)Bab v konfigurasi jaringan lanjut cli  (copy)
Bab v konfigurasi jaringan lanjut cli (copy)
 
Bab v konfigurasi jaringan lanjut cli (copy)
Bab v konfigurasi jaringan lanjut cli  (copy)Bab v konfigurasi jaringan lanjut cli  (copy)
Bab v konfigurasi jaringan lanjut cli (copy)
 
FreeBSD Mail Server
FreeBSD Mail ServerFreeBSD Mail Server
FreeBSD Mail Server
 
FreeBSD web-based MUA
FreeBSD web-based MUAFreeBSD web-based MUA
FreeBSD web-based MUA
 
Implementasi otentikasi pada squid dalam mode transparent proxy
Implementasi otentikasi pada squid dalam mode transparent proxyImplementasi otentikasi pada squid dalam mode transparent proxy
Implementasi otentikasi pada squid dalam mode transparent proxy
 
Modul setting dns--ok
Modul setting dns--ok Modul setting dns--ok
Modul setting dns--ok
 
Hitung Ongkos Kirim Menggunakan API rajaongkir.com dengan PHP+JQUERY
Hitung Ongkos Kirim Menggunakan API rajaongkir.com dengan PHP+JQUERYHitung Ongkos Kirim Menggunakan API rajaongkir.com dengan PHP+JQUERY
Hitung Ongkos Kirim Menggunakan API rajaongkir.com dengan PHP+JQUERY
 

Más de Hary HarysMatta

Strongswan ipsec vpn_linux_strongswan_ip
Strongswan ipsec vpn_linux_strongswan_ipStrongswan ipsec vpn_linux_strongswan_ip
Strongswan ipsec vpn_linux_strongswan_ipHary HarysMatta
 
Letsencrypt with pfsense
Letsencrypt with pfsenseLetsencrypt with pfsense
Letsencrypt with pfsenseHary HarysMatta
 
Membangun Aplikasi Web Data Analysis dengan Framework Django
Membangun Aplikasi Web Data Analysis dengan Framework DjangoMembangun Aplikasi Web Data Analysis dengan Framework Django
Membangun Aplikasi Web Data Analysis dengan Framework DjangoHary HarysMatta
 
GA (Google Analytics) Masterclass
GA (Google Analytics) MasterclassGA (Google Analytics) Masterclass
GA (Google Analytics) MasterclassHary HarysMatta
 
Pengantar jaringan komputer
Pengantar jaringan komputerPengantar jaringan komputer
Pengantar jaringan komputerHary HarysMatta
 
Ayat jurnal penyesuaian dan ayat jurnal balik
Ayat jurnal penyesuaian dan ayat jurnal balikAyat jurnal penyesuaian dan ayat jurnal balik
Ayat jurnal penyesuaian dan ayat jurnal balikHary HarysMatta
 
Ikhtisar pengantar akuntansi dan manajemen keuangan2
Ikhtisar pengantar akuntansi dan manajemen keuangan2Ikhtisar pengantar akuntansi dan manajemen keuangan2
Ikhtisar pengantar akuntansi dan manajemen keuangan2Hary HarysMatta
 
Cluster management (supercomputer)
Cluster management (supercomputer)Cluster management (supercomputer)
Cluster management (supercomputer)Hary HarysMatta
 
Update - Superkomputer dengan Native GNU/ Linux - Final
Update - Superkomputer dengan Native GNU/ Linux - FinalUpdate - Superkomputer dengan Native GNU/ Linux - Final
Update - Superkomputer dengan Native GNU/ Linux - FinalHary HarysMatta
 
Superkomputer dengan Native Linux(encrypted)
Superkomputer dengan Native Linux(encrypted)Superkomputer dengan Native Linux(encrypted)
Superkomputer dengan Native Linux(encrypted)Hary HarysMatta
 
Esensi Sholat Berjama'ah
Esensi Sholat Berjama'ahEsensi Sholat Berjama'ah
Esensi Sholat Berjama'ahHary HarysMatta
 
Vcenter Server Appliance - Testing
Vcenter Server Appliance - TestingVcenter Server Appliance - Testing
Vcenter Server Appliance - TestingHary HarysMatta
 
Panduan Evaluasi Sholat dan Hadits Shahih - Mengevaluasi Cara Sholat Kita
Panduan Evaluasi Sholat dan Hadits Shahih - Mengevaluasi Cara Sholat KitaPanduan Evaluasi Sholat dan Hadits Shahih - Mengevaluasi Cara Sholat Kita
Panduan Evaluasi Sholat dan Hadits Shahih - Mengevaluasi Cara Sholat KitaHary HarysMatta
 
Panduan Java sebagai Pemrograman Berorientasi Objek dan Implementasi Thread
Panduan Java sebagai Pemrograman Berorientasi Objek dan Implementasi ThreadPanduan Java sebagai Pemrograman Berorientasi Objek dan Implementasi Thread
Panduan Java sebagai Pemrograman Berorientasi Objek dan Implementasi ThreadHary HarysMatta
 
Metode Praktis Penetapan Nisab Zakat
Metode Praktis Penetapan Nisab ZakatMetode Praktis Penetapan Nisab Zakat
Metode Praktis Penetapan Nisab ZakatHary HarysMatta
 

Más de Hary HarysMatta (15)

Strongswan ipsec vpn_linux_strongswan_ip
Strongswan ipsec vpn_linux_strongswan_ipStrongswan ipsec vpn_linux_strongswan_ip
Strongswan ipsec vpn_linux_strongswan_ip
 
Letsencrypt with pfsense
Letsencrypt with pfsenseLetsencrypt with pfsense
Letsencrypt with pfsense
 
Membangun Aplikasi Web Data Analysis dengan Framework Django
Membangun Aplikasi Web Data Analysis dengan Framework DjangoMembangun Aplikasi Web Data Analysis dengan Framework Django
Membangun Aplikasi Web Data Analysis dengan Framework Django
 
GA (Google Analytics) Masterclass
GA (Google Analytics) MasterclassGA (Google Analytics) Masterclass
GA (Google Analytics) Masterclass
 
Pengantar jaringan komputer
Pengantar jaringan komputerPengantar jaringan komputer
Pengantar jaringan komputer
 
Ayat jurnal penyesuaian dan ayat jurnal balik
Ayat jurnal penyesuaian dan ayat jurnal balikAyat jurnal penyesuaian dan ayat jurnal balik
Ayat jurnal penyesuaian dan ayat jurnal balik
 
Ikhtisar pengantar akuntansi dan manajemen keuangan2
Ikhtisar pengantar akuntansi dan manajemen keuangan2Ikhtisar pengantar akuntansi dan manajemen keuangan2
Ikhtisar pengantar akuntansi dan manajemen keuangan2
 
Cluster management (supercomputer)
Cluster management (supercomputer)Cluster management (supercomputer)
Cluster management (supercomputer)
 
Update - Superkomputer dengan Native GNU/ Linux - Final
Update - Superkomputer dengan Native GNU/ Linux - FinalUpdate - Superkomputer dengan Native GNU/ Linux - Final
Update - Superkomputer dengan Native GNU/ Linux - Final
 
Superkomputer dengan Native Linux(encrypted)
Superkomputer dengan Native Linux(encrypted)Superkomputer dengan Native Linux(encrypted)
Superkomputer dengan Native Linux(encrypted)
 
Esensi Sholat Berjama'ah
Esensi Sholat Berjama'ahEsensi Sholat Berjama'ah
Esensi Sholat Berjama'ah
 
Vcenter Server Appliance - Testing
Vcenter Server Appliance - TestingVcenter Server Appliance - Testing
Vcenter Server Appliance - Testing
 
Panduan Evaluasi Sholat dan Hadits Shahih - Mengevaluasi Cara Sholat Kita
Panduan Evaluasi Sholat dan Hadits Shahih - Mengevaluasi Cara Sholat KitaPanduan Evaluasi Sholat dan Hadits Shahih - Mengevaluasi Cara Sholat Kita
Panduan Evaluasi Sholat dan Hadits Shahih - Mengevaluasi Cara Sholat Kita
 
Panduan Java sebagai Pemrograman Berorientasi Objek dan Implementasi Thread
Panduan Java sebagai Pemrograman Berorientasi Objek dan Implementasi ThreadPanduan Java sebagai Pemrograman Berorientasi Objek dan Implementasi Thread
Panduan Java sebagai Pemrograman Berorientasi Objek dan Implementasi Thread
 
Metode Praktis Penetapan Nisab Zakat
Metode Praktis Penetapan Nisab ZakatMetode Praktis Penetapan Nisab Zakat
Metode Praktis Penetapan Nisab Zakat
 

SMS GATEWAY DENGAN KANNEL DAN MODEM WAVECOM

  • 1. IMPLEMENTASI SMS GATEWAY DENGAN KANNEL DAN MODEM WAVECOM Hary Cahyono wordpress.com, tifosilinux Email : hary.cahyono@waki.mobi h4ry.oop@gmail.com Begitu banyak referensi mengenai smsgateway dengan berbagai third party yang digunakannya, dengan hobi didunia Linux/UNIX dan niat menambah referensi implementasi dengan kannel, maka saya iseng membuat tulisan ini. Now being developed further by the open source community, namely the Kannel Group. Keyword : Guide Kannel
  • 2. Pendahuluan Sudah terlalu banyak referensi yang memuat Linux beserta kannel sebagai SMS GATEWAY nya. Sekarang saya coba membagi seperti apa sih implementasinya jika perusahaan/ corporate atau bahkan personal menginginkan business dengan Linux beserta Kannel. Ekspektasi nya selalu diarahkan kepada hal yang sifatnya untuk pemanfaatan ke arah positif. Mampu meraih optimalisasi business walaupun tetap membawa lisensi GPL. Membuat business mudah dalam melakukan analisis dan membuat Decision. Konfigurasi Kannel Semuanya dirancang bangun diatas sistem Linux OpenSuSE 11.2 Emerald dan menggunakan modem WAVECOM dimana saya hanya akan memberikan point-point nya saja karena sudah banyak referensi jika kita mencoba mencari di luar sana. Pasti tidak akan memenuhi kebutuhan informasi kamu :) oleh karena itu saya coba mencantumkan alamat email diatas. Biasanya kita rujuk ke path /etc/kannel/ namun akan berbeda jika kamu melakukan kompilasi secara custom pada --prefix=/<path_directory>/ , berikut konfigurasi yang saya gunakan: # Custom Config, Initiated by Hary on tifosilinux.com # :) Check these out # # In case we are using WAVECOM as a modem to implementing this topologys : [public user, HP]<---- >([SMSC, Telco]<--send sms-->[Modem or HP])<---->[Kannel SMS Gateway]<---->[Database Server or Content Server] # We have to know 3 points of Kannel which is important to configure like mandatory (m), optional (o), and conditional (c), then # As we know it have 3 things to understand : bearerbox as connection handler between smsbox and(to) smsc, smsbox as management function on kannel sms gateway, and wapbox as wap as connection # Four group + 1 group modem required by group 'core' such as Group smsbox, smsc, sendsms-user, smsservice, and modem # Divided by 4 log-level to describes, 0 : Level debug, 1 : info, 2 : warning, 3 : error, 4 : panic # # Noted : Kannel SMS Gateway can be control/ managed by HTTP interface, like http://localhost:<admin- port>/shutdown?password=<admin-password> # Which is the <password> on url above could be changed with status, suspend, resume, start-smsc, and stop-
  • 3. smsc group = core admin-port = 13000 admin-password = harysmatta status-password = probolinggo admin-deny-ip = "*.*.*.*" admin-allow-ip = "127.0.0.1" smsbox-port = 13003 #wapbox-port = 13004 # Not needed wap right now box-deny-ip = "*.*.*.*" box-allow-ip = "127.0.0.1" log-file = "/var/log/kannel/kannel.log" log-level = 1 access-log = "/var/log/kannel/kannel.access" #unified-prefix = "+358, 00358, 0, +, 00" #white-list = "http://localhost/whitelist.txt" store-file = "/var/log/kannel/kannel.store" group = smsbox bearerbox-host = 127.0.0.1 sendsms-port = 13013 sendsms-chars = "0123456789 +-" log-file = "/var/log/kannel/smsbox.log" log-level = 0 access-log = "/var/log/kannel/sms-access.log" global-sender = +6281100000 # blacklist = "http://localhost/sms/blacklist.txt" group = smsc smsc = at host = 127.0.0.1 smsc-id = test #modemtype = auto modemtype = wavecom device = /dev/ttyUSB0 speed = 115200 #validityperiod = 167 #keepalive = 10 # pin = 1314 # <== used by GSM sim-buffering = true sms-center = +6281100000 my-number = +6285311761918 #my-number = +6281316764465 # Mobile phone configuration group = modems id = WAVECOM name = wavecom detect-string = WAVECOM
  • 4. #detect-string = AT # Use this if u're set modemtype as automatic on group smsc init-string = "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0" #init-string = "AT+CMEE=2;+CNMI=3,1,0,0,0" #init-string = "AT+CNMI=2,1,2,2,0 #keepalive-cmd = "AT+CBC;+CSQ" #message-storage = "sm" ############################### [IF] SMS Connection with SMPP as a protocol ############################################# # group = smsc (m) # # smsc = smpp (m) # # host = 10.195.7.8 # Thisi is using VPN managed by vpn box in order to connect to telco ipaddress_server SMS CENTER # # port = 4322 # # receive-port = 4322 # This is port including IP in order to connect to telco # # smsc-username = "passinds" # Provided by telco # # smsc-password = "smpassdf" # Provided by telco # # system-type = "TCP" # # interface-version = 33 # # address-range = "9790" # CP / Content Provider's Shortcode provided by telco # ####################################################################################### ################################## group = sendsms-user username = telkomsel password = telkomsel max-messages = 5 concatenation = true # --- SERVICES --- # -- Find these with your own docs from telco -- # added new parameters : # %k --> keyword # %p --> User Number Sender # %P --> User Number Receiver # %t --> Time sender # %T --> transactionid # %D --> meta-data, forwarded from Operator (XL request) group = sms-service keyword = default #keyword = reg # get-url = "http://192.168.0.102:39790/mo/index.php?smscid=%i&msisdn=%p&to=%P&sms= %a&trx_date=%t&tid=%T&meta=%D" # (c) URL came from program or # script will be execute if the keyword match with text gateway received by. Using GET method in URL <=== The highest one of hierarchy response text # Parameter get-url dibawah akan mengembalikan reply couldn't fetch content #get-url = "http://localhost/playsms/plugin/gateway/kannel/geturl.php?t=%t&q=%q&a=%a" #get-url = "http://localhost/mo/getting.php?text=%b&sender=%p"
  • 5. get-url = "http://localhost/mo/gettings.php?sender=%p&to=%P&text=%b&time=%t" #get-url = "http://localhost/mo/received.php?sender=%p&text=%b" max-messages = 3 #text = 'Pendaftaran Mahasiswa Baru' ###group = sms-service ###keyword = INFO # post-url = # as same as get-url with different method POST <=== The highest one of hierarchy response text ###file = /home/hary/info.txt # Kannel helps you to store delivery reports group = mysql-connection id = mydlr id = dlr-db host = localhost username = kannel password = kannel database = kannels max-connections = 1 group = dlr-db id = dlr-db table = dlr field-smsc = smsc field-timestamp = ts field-source = source field-destination = destination field-service = service field-url = url field-status = status field-mask = mask field-boxc-id = boxc #group = sms-service #keyword = Reg #text = "Selamat anda terdaftar di layanan info IT. Dan tidak dapat berhenti berlangganan. :):) CS : 08569042489" Dari konfigurasi diatas, sistem mengabaikan hashtag dan kita bisa membacanya sebagai sebuah informasi. Semua konfigurasi dan MSISDN “BEBAS UNTUK DILIHAT :)”. Didalam informasi tersebut, saya juga memberikan gambaran bagaimana jika shortcode yang digunakan untuk kepentingan business corporate, jadinya tidak dengan menggunakan msisdn pribadi (kamu bisa lihat-lihat di fitur busness di laman http://tifosilinux.wordpress.com). Tinggal disesuaikan pada parameter :
  • 6. global-sender = +6281100000, dan sms-center = +6281100000 Karena saya menggunakan operator telkomsel, maka pusat dari pesan saya rujuk ke +6281100000 dan +6281100000 untuk global-sender yang artinya, setiap nomor yang diterima ke user (sebagai balasan dari sms MT yang telah dikirim) akan menggunakan nomor +6281100000. Kemudian, pada group sms-service kita bisa melakukan aktifasi jika menginginkan sistem melakukan reply secara otomatis. Tinggal kita masukkan keyword dan text nya sebagai reply atas keyword yang telah dikirim dari si sender. Kannel sebagai receiver juga dapat melakukan custom reply pada get-url (bisa juga menggunakan post-url dsb) dimana keyword tertentu yang telah di hardcode atau ter-register sebelumnya akan melakukan reply sesuai trigger yang telah di register. Syaratnya set keyword ke nilai default terlebih dahulu. Dalam hal melakukan dailypush (dimana user ter register dahulu didalam sistem basis data untuk kemudian dikirimkan MT SMS (ter charge ataupun tidak)), kita perlu menyiapkan parameter URI berikut : "http://127.0.0.1:13013/cgi-bin/sendsms? username=telkomsel&password=telkomsel&to=085695042489&text=Isi+SMS+yang+i ngin+dikirim" Untuk hubungan langsung Kannel ke MySQL guna meyimpan DLR (Delivery Report) tidak akan saya bahas dan kamu bisa mendapatkan referensinya sendiri di internet. Jika setting dan test berhasil, kamu akan mendapati logging-logging sebagai berikut :
  • 7. Simulasi Transaksi Sekarang kita coba memperjelas hal ini dengan membuat scripting yang 'amat sangat' sederhana dengan PHP dan koneksi MySQL. Konsepnya begini: Sebagai penyelia konten terhadap client, kita memutuhkan sebuah tools yang dapat melakukan registrasi services atau layanan beserta nilai charging, isi konten, serta deskripsi dari layanan tersebut. Didalam sistem butuh sebuah trigger guna mencocokkan antara layanan dengan nilai charging. Untuk script bisa kamu download di tifosilinux.wordpress.com, berikut screenshot nya : Jika sudah mengerti arahnya, kita amati script get-url untuk mendapatkan reply sms sesuai dengan yang diharapkan. File mengacu pada parameter get-url yang digunakan. Tempatkan script sesuai document root kamu; <?php // Inititated by Harysmatta mysql_connect("localhost", "kannel", "kannel"); mysql_select_db("kannels"); //http://localhost/mo/gettings.php?sender=%p&to=%P&text=%b&time=%t //http://localhost/mo/gettings.php?sender=09230232&to=1212232&text=DOA&time=091282912 $msgfrom = $_GET['sender']; $msgto = $_GET['to']; $msgtimestamp = $_GET['time']; $svc_keyword = $_GET['text']; //Or you can using : //$svc_keyword = $HTTP_GET_VARS['text'];
  • 8. // Avoiding these nested query if u can ;) $price_mapping = "select b.charging_value as price from charging b where b.id in(select c.charging_id from service_charging_mapping c where c.service_id = (select a.id from service a where a.service_name = '$svc_keyword' ))"; $key_price_mapping = mysql_query($price_mapping); while($result1 = mysql_fetch_array($key_price_mapping)){ $price = $result1['price']; } // 'Mobile Originating' like $inserting_MO = mysql_query("insert into tbl_msgtransacts (MSGFROM, MSGTO, MSGDATA, PRICE, MSGTIMESTAMP, SUBJECT, OPERATOR) values('$msgfrom', '$msgto', '$svc_keyword', '$price', '$msgtimestamp', 'MO;PULL;TEXT', 'TSEL')"); $keyword_query = "select description from service where service_name = '$svc_keyword'"; $key_query=mysql_query($keyword_query); while($result2=mysql_fetch_array($key_query)){ $msgdata = "Congrats : ".$result2['description'].""; echo "Congrats : ".$result2['description'].""; } // 'Mobile Terminating' like $inserting_MT = mysql_query("insert into tbl_msgtransacts (MSGFROM, MSGTO, MSGDATA, PRICE, MSGTIMESTAMP, SUBJECT, OPERATOR) values('$msgto', '$msgfrom', '$msgdata', '$price', '$msgtimestamp', 'MT;PULL;TEXT', 'TSEL')"); Sesuaikan koneksi ke MySQL kamu, sebenarnya bisa menggunakan PDO jika DB Type yang digunakan berlainan jenis. Script akan mengambil variabel pada url kemudian melakukan pengecekkan pada tabel-tabel yang digunakan saat inserting service (disarankan kamu membuat service register terlebih dahulu seperti screenshoot diatas). Script akan mencocokkan price sesuai dengan keyword (dalam hal ini kita analogikan sebagai service) dan akan melakukan inserting as a MO and MT. Kita bahkan bisa menambahkan status ataupun Closereason dari setiap message, namun belum sempat saya lakukan. Dan bisa saja kamu memperluas konsep diatas. Kita bisa melihat setiap transaksi diatas pada table tbl_msgtransacts yang kita siapkan sebelumnya, berikut screenshoot nya:
  • 9. Silahkan kamu buat sendiri MO Traffic sebagai tools complement transaksi diatas ;) SMS Alert Ibaratkan begini, kita seorang business analyst.. dan melakukan sebuah perencanaan pada setiap Content Provider untuk menjalankan campaign sebagai activity sales nya. Kita menjalankan sebuah aplikasi dari vendor dimana mulai dari menentukan tipe layanan yang dijalankan, range waktu hingga telco mana yang dipilih, namun satu hal.. tidak ada notifikasi pesan ke Account Engineer (AE) sebagai perwakilan CP dan System Administrator serta Monitoring Team nya. Bahwa telah dijalankan sebuah campaign dengan range waktu tertentu dan di setiap telco dan CP mana saja campaign telah berjalan hingga selesai. Jadi yang kita harapkan ada sebuah aktifitas tambahkan untuk mengirimkan notifikasi ke System Administrator serta Monitoring Team. Sebuah analogi kembali saya coba perlihatkan:
  • 10. Karena hal ini berkaitan dengan mengirimkan pesan notifikasi dan sedikit banyak menentukan dalam membuat keputusan bisnis, maka kita perlu membuat priviliges berupa sebuah session. File-file yang dibutuhkan adalah trigger.sh, triggering.sh, cekpswd.php, login.html, logout.php, sign.php, sorry.html, green.png, red.png, exec1 s.d. exec9.sh serta SendSMS.php. Tentu file-file tersebut penamaannya bisa disesuaikan. Oke, diperjelas.. contoh sample hierarki direktorinya sebagai berikut: /var/www/html/SendSMS.php /var/www/html/support/cekpswd.php /var/www/html/support/login.html /var/www/html/support/logout.php /var/www/html/support/sign.php /var/www/html/support/sorry.html /var/www/html/support/green.png /var/www/html/support/red.png /home/hary/script/trigger.sh /home/hary/script/triggering.sh /home/hary/script/exec1-9.sh Sebagai catatan, saya tidak akan memberikan detail DB dan table-table yang digunakan hingga field-field nya, namun kamu bisa memenuhi kebutuhan tersebut
  • 11. dengan membaca script. Kemudian kita breakdown isi setiap script; <Login.html> <html> <head> <title>Login dulu</title> </head> <body> <article style='width:40%;float:left;margin:0 30%;' /> <b>Login untuk user yang sudah terdaftar sebelumnya </b> <pre> <form name="frmLogIn" METHOD="post" ACTION="/support/cekpswd.php"> Username : <INPUT TYPE="text" NAME="uname"> Password : <INPUT TYPE="password" NAME="pswd"> <INPUT TYPE="submit" VALUE="Submit"> </form> </pre> </body> </html> Script menggunakan method post pada attribute nya dan menggunakan nama frmLogin dimana membutuhkan file cekpswd.php guna pengecekkan. <cekpswd.php> <?php /* * Session started by HarysMatta on tifosilinux.wordpress.com * */ session_start(); $uname = $_POST['uname']; $pswd = sha1($_POST['pswd']); $host = "localhost"; $user = "root"; $pwd = ''; $db = 'login'; $sql = "select * from member where uname='$uname'"; $conn = @mysql_connect($host, $user, $pwd) or die("Koneksi gagal : " . mysql_error()); mysql_select_db($db); $qry = mysql_query($sql) or die("Query salah : " . mysql_error()); $num = mysql_num_rows($qry); $row = mysql_fetch_array($qry); if ($num==0 OR $pswd!=$row['pswd']){ header("Location: /support/sorry.html"); } else{ $_SESSION['login']=1; header("Location: http://localhost/SendSMS.php"); } ?> Disinilah session kita buka menggunakan fungsi session_start(); dan melakukan pengecekkan jika username dan password sudah di insert secara manual atau belum. Dengan segala detail nya mulai dari koneksi dan pengambilan value dari method POST yang digunakan, jika login berhasil akan di redirect ke halaman http://localhost/SendSMS.php <SendSMS.php>
  • 12. <?php session_start(); if(!isset($_SESSION['login'])){ include("/var/www/html/support/login.html"); } else{ mysql_connect("localhost", "kannel", "kannel"); mysql_select_db("kannels"); echo "<html> <head> <title>TifosiLinux Wordpress</title> </head> <body>"; echo "<article style='width:40%;float:left;margin:0 30%;' />"; echo "<div style='border: 2px solid green; height: 370px; padding: 5px; text-align: left; width: 430px;'> <form method='post' action='SendSMS.php'> <table border=0 width=430px> <tr> <td> <b>CP 3Tinggi</b><br> <input type='checkbox' value='ProXL1' name='ProXL1'>ProXL<br> <input type='checkbox' value='Indosat1' name='Indosat1'>Indosat<br> <input type='checkbox' value='TSEL1' name='TSEL1'>Telkomsel<br><br> <b>CP Passindonesia</b><br> <input type='checkbox' value='ProXL2' name='ProXL2'>ProXL<br> <input type='checkbox' value='Indosat2' name='Indosat2'>Indosat<br> <input type='checkbox' value='TSEL2' name='TSEL2'>Telkomsel<br><br> <b>CP YattaEra</b><br> <input type='checkbox' value='ProXL3' name='ProXL3'>ProXL<br> <input type='checkbox' value='Indosat3' name='Indosat3'>Indosat<br> <input type='checkbox' value='TSEL3' name='TSEL3'>Telkomsel<br><br> </td> <td> <b>Duration of Campaign</b><br> <select name='hour'> <option selected='selected'>Hour</option>"; for($d=0; $d<=24; $d+=1){ echo "<option value=$d>$d</option>"; } echo "</select>hour <select name='minute'> <option selected='selected'>Minute</option>"; for($c=1; $c<=60; $c+=1){ echo "<option value=$c>$c</option>"; } echo "</select>minute/s <br><br><b>Status</b><br>"; echo "<iframe src='http://localhost/support/sign.php' height='120' width='120'></iframe>"; echo "</td> </tr> </table> "; /* For Example */ if (isset($_POST['ProXL1'])) { // echo $_POST['ProXL1'].'<br />'; shell_exec("/home/hary/script/exec1.sh"); } if (isset($_POST['ProXL2'])) { // echo $_POST['ProXL2'].'<br />'; shell_exec("/home/hary/script/exec2.sh"); } if (isset($_POST['ProXL3'])) { // echo $_POST['ProXL3'].'<br />'; shell_exec("/home/hary/script/exec3.sh"); } if (isset($_POST['Indosat1'])) {
  • 13. // echo $_POST['Indosat1'].'<br />'; shell_exec("/home/hary/script/exec4.sh"); } if (isset($_POST['Indosat2'])) { shell_exec("/home/hary/script/exec5.sh"); } if (isset($_POST['Indosat3'])) { // echo $_POST['Indosat3'].'<br />'; shell_exec("/home/hary/script/exec6.sh"); } if (isset($_POST['TSEL1'])) { // echo $_POST['TSEL1'].'<br />'; shell_exec("/home/hary/script/exec7.sh"); } if (isset($_POST['TSEL2'])) { // echo $_POST['TSEL2'].'<br />'; shell_exec("/home/hary/script/exec8.sh"); } if (isset($_POST['TSEL3'])) { // echo $_POST['TSEL3'].'<br />'; shell_exec("/home/hary/script/exec9.sh"); } /* For Example */ //if ($_POST['hour'] != "Hour" && $_POST['minute'] != "Minute") if ($_POST['hour'] != "Hour" && $_POST['minute'] != "Minute") { $HOUR = $_POST['hour']; $MINUTE = $_POST['minute']; mysql_query("TRUNCATE TABLE `kannels`.`trigger`"); mysql_query("INSERT INTO `kannels`.`trigger` (`id`, `hour`, `minute`, `status`, `laststatus`) VALUES (NULL, '$HOUR', '$MINUTE', 'isActive', 'set')"); echo "Schedule has been set<br>"; } else { echo "<b>Noted : </b>Schedule & Duration of Campaign can't be empty<br>"; } echo "<input type='submit' value='Submit' name='submit'> <a href='http://localhost/support/logout.php'>Logout</a></div> </body> </html>"; Iframe digunakan untuk menampilkan status secara realtime dengan menggunakan file sign.php dengan META refresh untuk melihat kondisi campaign. Gunakan file green.png untuk status aktif dan red.png ketika status finish. Status dipicu oleh isi dari table trigger pada field status dan laststatus. Shell script yang bertugas untuk melakukan action nya, yakni trigger.sh yang kita set pada cronjobs untuk pengecekkan setiap saat. Kemudian script ini akan otomatis melakukkan update waktu cronjobs untuk file triggering.sh <trigger.sh> #!/bin/bash # Setup this script with all wildcards : * * * * * /home/hary/script/trigger.sh check=`mysql -hlocalhost -ukannel -p'kannel' kannels -e "select laststatus from kannels.trigger order by id desc limit 1" | grep -v "laststatus"` if [[ $check == "set" ]];
  • 14. then menit=`crontab -l | grep 'triggering.sh' | awk '{print $1}'` jam=`crontab -l | grep 'triggering.sh' | awk '{print $2}'` hour=`mysql -hlocalhost -ukannel -p'kannel' kannels -e "select hour from kannels.trigger order by id desc limit 1" | grep -v "hour"` minute=`mysql -hlocalhost -ukannel -p'kannel' kannels -e "select minute from kannels.trigger order by id desc limit 1" | grep -v "minute"` final_minute=`date --date='+'$minute' minutes' +"%M"` final_hour=`date --date='+'$hour' hour' +"%H"` sed -i 's/'$menit' '$jam' * * * /home/hary/script/triggering.sh/'$final_minute' '$final_hour' * * * /home/hary/script/triggering.sh/' /var/spool/cron/tabs/root mysql -hlocalhost -ukannel -p'kannel' kannels -e "UPDATE kannels.trigger set laststatus='unset' where laststatus='set'" fi <triggering.sh> #!/bin/bash #number1=085695042489 number2=081316764465 time=`date +"%H:%M"` #links -dump "http://127.0.0.1:13013/cgi-bin/sendsms?username=telkomsel&password=telkomsel&to=$number1&text=Info+: +Campaign+has+been+stop+at+$time+a+clock" links -dump "http://127.0.0.1:13013/cgi-bin/sendsms?username=telkomsel&password=telkomsel&to=$number2&text=Info+: +Campaign+has+been+stop+at+$time+a+clock" mysql -hlocalhost -ukannel -p'kannel' kannels -e "UPDATE kannels.trigger set status='isDie' where status='isActive'" Kita juga membutuhkan file-file exec sebagai action apabila value dari POST sesuai dengan kondisi, file menggunakan parameter url untuk mengirimkan pesan. <exec1.sh – exec9.sh> #!/bin/bash #number1=085695042489 number2=081316764465 hour=`mysql -hlocalhost -ukannel -p'kannel' kannels -e "select hour from kannels.trigger order by id desc limit 1" | grep -v hour` minute=`mysql -hlocalhost -ukannel -p'kannel' kannels -e "select minute from kannels.trigger order by id desc limit 1" | grep -v minute` #links -dump "http://127.0.0.1:13013/cgi-bin/sendsms?username=telkomsel&password=telkomsel&to=$number1&text=Info+: +telco+ProXL+di+3Tinggi+sedang+campaign" links -dump "http://127.0.0.1:13013/cgi-bin/sendsms?username=telkomsel&password=telkomsel&to=$number2&text=Info+: +telco+Telkomsel+di+3Tinggi+sedang+campaign+untuk+$hour+jam+$minute+minute" echo 'date +"%H:%M:%S"' >> /tmp/LOGGING.txt #links -dump "http://127.0.0.1:13013/cgi-bin/sendsms?username=telkomsel&password=telkomsel&to=$number1&text=Info+: +telco+Telkomsel+di+3Tinggi+sedang+campaign" Isi message diatas bisa dirubah sesuai kebutuhan. <sorry.html> <HTML> <HEAD> <TITLE> Sorry </TITLE> </HEAD> <BODY> <article style='width:40%;float:left;margin:0 30%;' /> <b> Username ato password anda ndak bener</b><br>
  • 15. <a href="http://localhost/support/login.html"> Back </a> </BODY> </HTML> <logout.php> <? /* * Session started by HarysMatta on tifosilinux.wordpress.com * */ session_start(); unset($_SESSION['login']); session_destroy(); header("Location: /support/login.html"); ?> Script pada file logout.php diatas akan melepas session yang sebelumnya telah terbentuk. <sign.php> <?php mysql_connect("localhost", "kannel", "kannel"); mysql_select_db("kannels"); echo "<META HTTP-EQUIV='REFRESH' CONTENT='3;URL=http://localhost/support/sign.php'>"; $stat="select status from kannels.trigger order by id desc limit 1"; $hasil1=mysql_query($stat); $hasil2=mysql_fetch_array($hasil1); if($hasil2['status'] != "isActive") { echo "<img src='http://localhost/support/red.png'></img>"; } else{ echo "<img src='http://localhost/support/green.png'></img>"; } Akhirnya kita bisa lihat kondisi pada tiga screenshoot dibawah ini:
  • 16.
  • 17. Referensi Kannel cvs-20030901 User’s Guide, Open Source WAP and SMS gateway Andreas Fink Chairman & CTO, Global Networks Inc. andreas@fink.org, http://www.smsrelay.com, http://www.gni.ch, Bruno Rodrigues, bruno.rodrigues@litux.org, http://litux.org/bruno *) Semuanya ditulis diatas sistem Linux OpenSuSE 11.2 Emerald, OpenOffice 3.1.1, dia v 0.97. dan Okular v 0.9.5