Membuat
SMS Gateway sendiri memiliki tantangan yang cukup berat. Di internet sebenarnya telah tersedia banyak dokumentasinya, namun yang masih kurang adalah tutorial yang benar2 cocok untuk
newbie. Setelah bergadang hampir 2 minggu akhirnya penulis berhasil menyetelnya. Berbeda dengan program SMS bawaan dari telepon genggam, dengan Kannel dan Playsms, kita bisa menjadikannya multi-user dan bisa diakses dari mana saja.
Pertama2 penulis ingin berterima kasih kepada semua rekan yang telah banyak membantu
Baiklah mari kita mulai. Hal2 yang diperlukan adalah:
1.
Modem GSM. Dalam hal ini penulis menggunakan Itegno 3000 yang menggunakan koneksi USB (
http://www.dsc.co.id/?page=category&catid=5&pid=120). Sebenarnya kita dapat pula menggunakan telepon genggam GPRS kita, tapi mungkin di lain artikel yah.
2.
Kannel (http://www.kannel.org) sebagai sms engine.
3.
Playsms (http://playsms.sourceforge.net) sebagai web-based Mobile Portal System.
4. Linux OS dgn MySQL, kali ini penulis menggunakan Fedora Core 4, dengan kernel terbaru 2.6.15-1.1830.
5. Kopi kental, roti bakar, dan mie instant sesuai selera sebagai teman bergadang :)
Langkah2 yang harus dilakukan adalah:
1. Mensetting Modem GSM.
2. Menginstall dan mensetup kannel.
3. Menginstall dan mensetup playsms.
4. Mentesting
A. Mensetting Modem GSMMasukkan kartu GSM ke dalam modem GSM, dan jangan lupa pasang tutupnya. Sebab kalau tidak terpasang, modem tidak akan berfungsi dengan baik.
Hidupkan Linux, dan colokkan modem ke port USB.
Buka terminal, dan lakukan tail -f /var/log/messages. Di dalam /var/log/messages itu akan terlihat ini bila Linux berhasil mengenali modem GSM kita:
Feb 18 19:36:01 fc4 kernel: usb 2-2: new full speed USB device using uhci_hcd and address 3Feb 18 19:36:01 fc4 kernel: usbcore: registered new driver usbserialFeb 18 19:36:01 fc4 kernel: drivers/usb/serial/usb-serial.c: USB Serial support registered for genericFeb 18 19:36:01 fc4 kernel: usbcore: registered new driver usbserial_genericFeb 18 19:36:01 fc4 kernel: drivers/usb/serial/usb-serial.c: USB Serial Driver coreFeb 18 19:36:02 fc4 kernel: drivers/usb/serial/usb-serial.c: USB Serial support registered for pl2303Feb 18 19:36:02 fc4 kernel: pl2303 2-2:1.0: pl2303 converter detectedFeb 18 19:36:02 fc4 kernel: usb 2-2: pl2303 converter now attached to ttyUSB0Feb 18 19:36:02 fc4 kernel: usbcore: registered new driver pl2303Feb 18 19:36:02 fc4 kernel: drivers/usb/serial/pl2303.c: Prolific PL2303 USB to serial adaptor driverSecara fisik kita bisa melihat apakah Modem telah dikenali dengan baik dari lampunya yang berkedip2.
B1. Menginstall kannel.Kita bisa menginstall dari source, ataupun dari binary. Tidak masalah. Menggunakan FC4, kita dapat menginstallnya dengan cara:
yum install kannel kannel-develIa berada di dalam repository extras.
B2. Mensetup kannel.Selanjutnya yang cukup sulit adalah mensetting kannel. Sangat disarankan kita mendownload dan mempelajari kannel userguide dari kannel.org. Playsms telah menyediakan settingan awal untuk kita, kita tinggal melengkapinya sesuai perlengkapan yang kita gunakan.
Berikut ini adalah file /etc/kannel.conf penulis:
# COREgroup = coreadmin-port = 13000admin-password = pwdstatus-password = pwdlog-file = "/var/log/kannel/kannel.log"log-level = 0access-log = "/var/log/kannel/access.log"smsbox-port = 13001store-file = "/var/log/kannel/kannel.store"# SMSC Fake#group = smsc#smsc = fake#host = localhost#port = 13013#SMSC modem gsm group = smscsmsc = athost = localhostport = 13013smsc-id = linuxkumodemtype = wavecomdevice = /dev/ttyUSB0speed = 115200sms-center = 0816124group = modemsid = WAVECOMname = wavecomdetect-string = WAVECOMinit-string = "AT+CNMI=1,2,0,1,0;+CMEE=1"# SMSBOX SETUPgroup = smsboxbearerbox-host = localhostsendsms-port = 13131sendsms-chars = "0123456789+"log-file = "/var/log/kannel/smsbox.log"log-level = 0access-log = "/var/log/kannel/access.log"# SEND-SMS USERSgroup = sendsms-userusername = playsmspassword = pwd# SMS SERVICE 'Default'# there should be default alwaysgroup = sms-servicekeyword = defaultmax-messages = 0exec = /usr/local/bin/kannel_incoming %t %q %a#get-url = "http://localhost/~playsms/plugin/gateway/kannel/geturl.php?t=%t&q=%q&a=%a"Penjelasan:
Bagian SMSC Fake kita comment out sebab dia berfungsi untuk testing saja. Kita tidak akan bisa mengirimkan sms yang sesungguhnya menggunakan SMSC Fake ini. Sebaliknya, kita definisikan group smsc modem gsm. sms-center juga kita sesuaikan dengan kartu gsm kita.
Kita definisikan juga group modems. Yang penting disini adalah init-stringnya yaitu "AT+CNMI=1,2,0,1,0;+CMEE=1", CMEE=1 itu berarti kita menginstruksikan modem agar menyebutkan jenis error yang terjadi pada Mobile Equipment kita. Kalau tidak dibuat verbose, maka ketika terjadi error misalnya pulsa kita habis sehingga tidak bisa kirim sms, modem gsm kita cuma bilang error tapi tidak disebutkan kenapa, sehingga kannel tidak mengetahui error apa yang terjadi:
2006-02-18 10:20:46 [8984] [7] ERROR: AT2[/dev/ttyUSB0]: Error occurs: ERROR (error number not known to us. ask google and add it.)Setelah dibuat verbose menjadi keliatan sebab errornya:
2006-02-18 10:25:20 [8984] [7] CMS ERROR: +CMS ERROR: 38 (Network out of order)Kemudian yang juga penting adalah bagian max-messages = 0 di group sms-service. Option max-message = 0 ini berguna agar modem kita tidak mengirimkan reply ketika menerima sms. Sebab akan terjadi kesalahan yang sangat fatal yaitu looping send-receive, dimana jika kita mengirimkan sms ke diri sendiri, maka modem akan mengirimkan reply ke diri sendiri, dan selanjutnya reply ini akan di reply, begitu seterusnya, sampai pulsa kita habis.
Bagaimana kannel bekerja?
Kannel sebenarnya lebih dari sekedar sms engine, dia juga dapat berfungsi sebagai wap engine. Ada 3 komponen utama kannel, yaitu: bearerbox, smsbox, dan wapbox. Bearerbox ini adalah inti dari kannel. Dia berfungsi sebagai koordinator dari 2 komponen lainnya yaitu smsbox dan wapbox. Kira2 demikian deh :)
C. Menginstall dan mensetup playsmsUntuk lengkapnya, baca file INSTALL dari playsms yah! Berikut cuplikannya:
1. It is important to meet all minimum requiments above (Its a must!)
2. Setup a system user named 'playsms' to manage PlaySMS
# adduser playsms
# passwd playsms
Note: on some Linux distributions adduser and passwd combined
3. On most Linux distributions actions (2) will create system user and group named playsms
with home directory /home/playsms, there you will install all PlaySMS files
4. Create public_html on user's home directory, if its not already exists
# mkdir /home/playsms/public_html
5. Extract PlaySMS package somewhere (Place in /usr/local/src if you want to)
# tar -zxvf playsms-x.x.x.tar.gz -C /usr/local/src
# cd /usr/local/src/playsms-x.x.x
6. Copy 'web' directory to public_html directory and set owner back to user playsms again
(for security reason)
# cp -rR web/* /home/playsms/public_html
# chown -R playsms /home/playsms/public_html
# chmod 701 /home/playsms
7. Setup database (import database)
# mysqladmin -u root -p create playsms
# mysql -u root -p playsms < /usr/local/src/playsms-x.x.x/db/playsms.sql Note: you dont need to use MySQL root access nor this method to setup PlaySMS database, but this is beyond our scope, you should read MySQL manual's for custom installation method 8. Edit config.php on playsms web directory (/home/playsms/public_html/config.php) Please read and fill all required fields carefully 9. Enter bin directory and copy playsmsd and playsmsd_start to /usr/local/bin # cd /usr/local/src/playsms-x.x.x # cd bin # cp playsmsd playsmsd_start /usr/local/bin/ 10. Enter /etc/init.d or /etc/rc.d/init.d and look for file rc.local, im sure you'll found it. Edit that file and put "/usr/local/bin/playsmsd_start" (without quotes) on the bottom of the file (before exit if theres exit). This way playsmsd_start will be run everytime the system startup. You need 'root' access for this purpose. 11 Browse http://localhost/~playsms and login using default administrator user username: admin password: admin 12. At this point you should be able to logon PlaySMS webbased interface. Lets move on to gateway module part, the hard one :) If you decide to use kannel gateway module, then you must install kannel on the same server where PlaySMS installed. There are discussion on hoto install Kannel on separate machine with PlaySMS. Due to complexity of installation process for kannel, we decide to leave this module for experts. Well experts, there's something you should see on this package contrib/kannel/kannel.conf, sms service 'Default' part. Dont forget to: 1. Create kannel cache directory and make it writable to the web servers user # mkdir /usr/local/cache # mkdir /usr/local/cache/smsd # chmod -R 777 /usr/local/cache Note: - make it writable to the world (chmod -R 777) just to simplify installation - it is better if you know what is the web server's user (eg: 'nobody') and instead chmod -R 777 you use: # chown -R nobody /usr/local/cache 2. Create log directory # mkdir /var/log/kannel 3. Enter bin directory in this package, and copy kannel_incoming to /usr/local/bin If you decide to use kannel gateway module, but you dont want to use 'exec' method in sms service, just replace you kannel.conf near to sms service 'Default' part, with sms service 'Default' part in this package contrib/kannel/kannel-geturl.conf After copying sample configuration, dont forget to change 'CHANGE_THIS_TO_YOUR_PLAYSMS_URL' in your kannel.conf near to sms service 'Default' part, to your working PlaySMS URL Catatan: Di FC4, secara default direktori home user ngga bisa diakses dari web. Untuk membuatnya aktif, kita edit file /etc/httpd/conf/httpd.conf. Cari baris berikut dan beri tanda comment di depan UserDir disable:
# UserDir: The name of the directory that is appended onto a user's home # UserDir is disabled by default since it can confirm the presence# UserDir disableOk, sekarang kita restart apache, dan kemudian kita coba buka web playsmsnya. Kalau ada di localhost, kita ketik ini di browser:
http://localhost/~playsms
Loginlah dengan username: admin, password: admin
D. MentestingSetelah semua siap, marilah kita testing.
- Jalankan bearerbox
bearerbox /etc/kannel.conf
2006-02-16 09:11:48 [6196] [0] INFO: Kannel bearerbox II version 1.4.0 starting2006-02-16 09:11:48 [6196] [0] INFO: Loading store file `/var/log/kannel/kannel.store'2006-02-16 09:11:48 [6196] [0] INFO: Store-file size 0, starting to unpack2006-02-16 09:11:48 [6196] [0] INFO: Retrieved 0 messages, non-acknowledged messages: 02006-02-16 09:11:48 [6196] [7] DEBUG: Thread 7 (gw/smsc/smsc_at.c:at2_device_thread) maps to pid 6196.2006-02-16 09:11:48 [6196] [0] INFO: MAIN: Start-up done, entering mainloop2006-02-16 09:11:48 [6196] [0] DEBUG: AT2[linuxku]: start called2006-02-16 09:11:48 [6196] [8] DEBUG: Thread 8 (gw/bb_smscconn.c:sms_router) maps to pid 6196.2006-02-16 09:11:48 [6196] [8] DEBUG: sms_router: time to sleep2006-02-16 09:11:48 [6196] [8] DEBUG: sms_router: list_len = 02006-02-16 09:11:48 [6196] [7] DEBUG: AT2[linuxku]: detecting modem type2006-02-16 09:11:48 [6196] [7] INFO: AT2[linuxku]: opening device2006-02-16 09:11:48 [6196] [7] DEBUG: AT2[linuxku]: device opened2006-02-16 09:11:49 [6196] [7] DEBUG: AT2[linuxku]: device opened2006-02-16 09:11:49 [6196] [7] INFO: AT2[linuxku]: speed set to 1152002006-02-16 09:11:49 [6196] [7] DEBUG: AT2[linuxku]: --> ^M2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: --> AT^M2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- AT2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: --> AT&F^M2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- AT&F2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: --> ATE0^M2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- ATE02006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: --> ATI^M2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- WAVECOM MODEM2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- MULTIBAND 900E 18002006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: found string , using modem definition 2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: --> AT+CSMS=?^M2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- +CSMS: (0,1)2006-02-16 09:11:51 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:11:51 [6196] [7] INFO: AT2[linuxku]: Phase 2+ is supported2006-02-16 09:11:51 [6196] [7] INFO: AT2[linuxku]: closing device2006-02-16 09:11:52 [6196] [7] INFO: AT2[linuxku]: opening device2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: device opened2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: device opened2006-02-16 09:11:52 [6196] [7] INFO: AT2[linuxku]: init device2006-02-16 09:11:52 [6196] [7] INFO: AT2[linuxku]: speed set to 1152002006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: --> ATZ^M2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: --> AT^M2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: <-- AT2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: --> AT&F^M2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: <-- AT&F2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: --> ATE0^M2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: <-- ATE02006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: --> AT+IFC=2,2^M2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: --> AT+CPIN?^M2006-02-16 09:11:52 [6196] [7] DEBUG: AT2[linuxku]: <-- +CPIN: READY2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: --> AT+CSCA="0816124"^M2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: --> AT+CMGF=0^M2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: --> AT+CSMS=?^M2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: <-- +CSMS: (0,1)2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:12:03 [6196] [7] INFO: AT2[linuxku]: Phase 2+ is supported2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: --> AT+CSMS=1^M2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: <-- +CSMS: 1,1,12006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: --> AT+CNMI=1,2,0,1,0;+CMEE=1^M2006-02-16 09:12:03 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:12:03 [6196] [7] INFO: AT2[linuxku]: AT SMSC successfully opened.- Jalankan smsbox:
smsbox /etc/kannel.conf
2006-02-12 13:36:20 [7002] [0] DEBUG: Kannel smsbox version 1.4.0 starting2006-02-12 13:36:20 [7002] [0] DEBUG: Started thread 4 (gw/smsbox.c:obey_request_thread)2006-02-12 13:36:20 [7002] [0] DEBUG: Started thread 5 (gw/smsbox.c:url_result_thread)2006-02-12 13:36:20 [7002] [0] DEBUG: Started thread 6 (gw/smsbox.c:http_queue_thread)2006-02-12 13:36:20 [7002] [0] INFO: Connected to bearerbox at localhost port 13001.2006-02-12 13:36:20 [7002] [0] DEBUG: Started thread 7 (gw/heartbeat.c:heartbeat_thread)2006-02-12 13:36:20 [7002] [2] DEBUG: Thread 2 (gwlib/http.c:server_thread) maps to pid 7002.2006-02-12 13:36:20 [7002] [3] DEBUG: Thread 3 (gw/smsbox.c:sendsms_thread) maps to pid 7002.2006-02-12 13:36:20 [7002] [1] DEBUG: Thread 1 (gwlib/fdset.c:poller) maps to pid 7002.2006-02-12 13:36:20 [7002] [4] DEBUG: Thread 4 (gw/smsbox.c:obey_request_thread) maps to pid 7002.2006-02-12 13:36:20 [7002] [5] DEBUG: Thread 5 (gw/smsbox.c:url_result_thread) maps to pid 7002.2006-02-12 13:36:20 [7002] [6] DEBUG: Thread 6 (gw/smsbox.c:http_queue_thread) maps to pid 7002.2006-02-12 13:36:20 [7002] [7] DEBUG: Thread 7 (gw/heartbeat.c:heartbeat_thread) maps to pid 7002.- Buka playsms dan coba kirim sms ke temen kita:

Di /var/log/kannel/kannel.log akan terlihat:
2006-02-16 09:12:16 [6196] [6] DEBUG: Started thread 9 (gw/bb_boxc.c:function)2006-02-16 09:12:16 [6196] [9] DEBUG: Thread 9 (gw/bb_boxc.c:function) maps to pid 6196.2006-02-16 09:12:16 [6196] [9] INFO: Client connected from <127.0.0.1>2006-02-16 09:12:16 [6196] [9] DEBUG: Started thread 10 (gw/bb_boxc.c:boxc_sender)2006-02-16 09:12:16 [6196] [10] DEBUG: Thread 10 (gw/bb_boxc.c:boxc_sender) maps to pid 6196.2006-02-16 09:15:06 [6196] [7] DEBUG: AT2[linuxku]: <-- +CMT: ,352006-02-16 09:15:06 [6196] [7] DEBUG: AT2[linuxku]: <-- 059126181642040C9126189519497500006020619041628212502B284C6EA7DDA0B03C0D5297D9E5352006-02-16 09:15:06 [6196] [7] DEBUG: AT2[linuxku]: Numeric sender (international) <+628153314433>2006-02-16 09:15:06 [6196] [7] DEBUG: AT2[linuxku]: User data length read as (18)2006-02-16 09:15:06 [6196] [7] DEBUG: AT2[linuxku]: Udh decoding done len=18 udhi=0 udhlen=0 udh=''2006-02-16 09:15:06 [6196] [7] DEBUG: AT2[linuxku]: --> AT+CNMA^M2006-02-16 09:15:06 [6196] [10] DEBUG: send_msg: sending msg to box: <127.0.0.1>2006-02-16 09:15:06 [6196] [10] DEBUG: boxc_sender: sent message to <127.0.0.1>2006-02-16 09:15:06 [6196] [7] DEBUG: AT2[linuxku]: <-- OK2006-02-16 09:15:07 [6196] [9] DEBUG: boxc_receiver: got ack2006-02-16 09:15:07 [6196] [1] DEBUG: Dumping 0 messages and 0 acks to store2006-02-16 09:15:16 [6196] [9] DEBUG: boxc_receiver: heartbeat with load value 0 receivedDi /var/log/kannel/smsbox.log akan terlihat:
2006-02-17 11:08:30 [9423] [3] INFO: smsbox: Got HTTP request from <127.0.0.1>2006-02-17 11:08:30 [9423] [3] INFO: sendsms used by 2006-02-17 11:08:30 [9423] [3] INFO: sendsms sender: (127.0.0.1) to:<+628153314433> msg:2006-02-17 11:08:30 [9423] [3] DEBUG: message length 56, sending 1 messages2006-02-17 11:08:30 [9423] [3] DEBUG: Status: 202 Answer: 2006-02-17 11:08:30 [9423] [3] DEBUG: HTTP: Destroying HTTPClient area 0x91794e0.2006-02-17 11:08:30 [9423] [3] DEBUG: HTTP: Destroying HTTPClient for `127.0.0.1'.2006-02-17 11:08:35 [9423] [4] INFO: Starting delivery report from <+628161922701>2006-02-17 11:08:35 [9423] [4] DEBUG: Started thread 8 (gwlib/fdset.c:poller)2006-02-17 11:08:35 [9423] [4] DEBUG: Started thread 9 (gwlib/http.c:write_request_thread)2006-02-17 11:08:35 [9423] [8] DEBUG: Thread 8 (gwlib/fdset.c:poller) maps to pid 9423.2006-02-17 11:08:35 [9423] [9] DEBUG: Thread 9 (gwlib/http.c:write_request_thread) maps to pid 9423.2006-02-17 11:08:35 [9423] [9] DEBUG: Parsing URL `http://localhost/~playsms/plugin/gateway/kannel/dlr.php?type=8&slid=93&uid=1':2006-02-17 11:08:35 [9423] [9] DEBUG: Scheme: http://2006-02-17 11:08:35 [9423] [9] DEBUG: Host: localhost2006-02-17 11:08:35 [9423] [9] DEBUG: Port: 802006-02-17 11:08:35 [9423] [9] DEBUG: Username: (null)2006-02-17 11:08:35 [9423] [9] DEBUG: Password: (null)2006-02-17 11:08:35 [9423] [9] DEBUG: Path: /~playsms/plugin/gateway/kannel/dlr.php2006-02-17 11:08:35 [9423] [9] DEBUG: Query: type=8&slid=93&uid=12006-02-17 11:08:35 [9423] [9] DEBUG: Fragment: (null)Kalau kita lihat di Outboxnya playsms, akan kelihatan apakah sms kita sampai (delivered) atau tidak:

Penutup
Demikianlah tutorial membuat gateway sms menggunakan Modemn GSM Itegno, Kannel, dan Playsms. Tutorial ini tentu saja masih jauh dari sempurna, namun begitu diharapkan dapat bermanfaat sebagai panduan langkah awal bagi kita yang ingin memiliki sms gateway sendiri.