Raspberry Pi 2 sebagai SMS Gateway

Salah satu situs kita, butuh notifikasi SMS untuk transaksi, pendaftaran dan lain-lain. Nancepin modem di server malas juga pergi ke datacenter di Jakarta, belum lagi kalau ada masalah. Solusinya? Beli Raspberry Pi diisi Linux, trus pasang gammu yang databasenya connect online ke server. Simple kan?

Kenapa Raspberry Pi?

Mainan baru Raspberry Pi 2 datang hari ini, langsung diantar sama ownernya Toko Raspberry Pi sendiri. Biasa, udah kangen juga, secara kita lama gak ngobrol. Kalau sama yang kawan yang satu ini, pasti lah topiknya tentang dunia Raspberry Pi.

Btw, kenapa pilih ini? Raspberry Pi ini selain harganya cukup murah, ternyata irit daya, gak gampang panas, cocok lah buat dipasang 24 jam terus terusan. Raspberry Pi juga udah support beberapa distro linux seperti Debian, Ubuntu dll. Jadi singkatnya dipasangin gammu (seperti rencana) juga jadi gak masalah.

Raspberry Pi sebagai Gateway

Beruntung ada link tutorial keren ini Raspberry Pi as an SMS Gateway.

So, let’s get started!

Si pemilik toko tadi, ternyata sudah berbaik hati mengintallkan Debian di microSD hehehe … (Makasih Zoel). Setelah semua terpasang, termasuk modemnya, langsung kita update system dan install gammu-nya. Gak lupa juga vim, padahal Zoel udah install nano editor sepertinya.
$ sudo apt-get update
$ sudo apt-get install -y gammu-smsd gammu python-gammu usb-modeswitch vim

Check modemnya bekerja atau tidak

Saya pake Huawei E173, dan ternyata langsung terdetect dengan baik.

$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 09da:000a A4 Tech Co., Ltd Optical Mouse Opto 510D
Bus 001 Device 006: ID 12d1:1c24 Huawei Technologies Co., Ltd.
Bus 001 Device 005: ID 0603:00f2 Novatek Microelectronics Corp.

Namun untuk keperluan konfigurasi, tetep harus set seperti yang ada di situs ini usb-modeswitch tutorial

Dari tutor di atas, saya tambahkan di /etc/usb_modeswitch.conf
TargetVendor= 0x12d1
TargetProduct= 0x1c12
MessageContent="55534243123456780000000000000011062000000100000000000000000000"

Kode ini didapat dari tuturial usb-modeswitch tadi ya … Jadi gak bakalan sama untuk kasus lain.

Kemudian kita cek status USB kita
$ dmesg | grep tty
[ 0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=1824 bcm2708_fb.fbheight=984 bcm2709.boardrev=0xa21041 bcm2709.serial=0x5e907206 smsc95xx.macaddr=B8:27:EB:90:72:06 bcm2708_fb.fbswap=1 bcm2709.disk_led_gpio=47 bcm2709.disk_led_active_low=0 sdhci-bcm2708.emmc_clock_freq=250000000 vc_mem.mem_base=0x3dc00000 vc_mem.mem_size=0x3f000000 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
[ 0.001799] console [tty1] enabled
[ 0.748221] dev:f1: ttyAMA0 at MMIO 0x3f201000 (irq = 83, base_baud = 0) is a PL011 rev3
[ 1.266627] console [ttyAMA0] enabled
[ 16.204921] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB0
[ 16.205375] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB1
[ 16.205777] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB2
[ 16.206136] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB3

Terhubung ke empat USB. Abaikan saja, kita pake yang ttyUSB0 aja, sesuai saran.

Jalankan konfigurasi gammu
$ gammu-config

  ┌─────────────────────────────────────────┐
  │ Current Gammu configuration             │
  │                                         │
  │  P Port                 (/dev/ttyUSB0)  │
  │  C Connection           (at19200)       │
  │  M Model                ()              │
  │  D Synchronize time     (yes)           │
  │  F Log file             ()              │
  │  O Log format           (nothing)       │
  │  L Use locking          ()              │
  │  G Gammu localisation   ()              │
  │  H Help                                 │
  │  S Save                                 │
  │                                         │
  │                                         │
  │        <Ok>            <Cancel>         │
  │                                         │
  └─────────────────────────────────────────┘

Ganti portnya dengan yang dipilih tadi, /dev/ttyUSB0. Gammu-config ini akan buat file di home directory ~/.gammurc.

Cek perubahan permission
$ ls -l /dev/ttyUSB*
crw-rw---T 1 root dialout 188, 0 May 14 18:06 /dev/ttyUSB0
crw-rw---T 1 root dialout 188, 1 May 14 16:56 /dev/ttyUSB1
crw-rw---T 1 root dialout 188, 2 May 14 16:56 /dev/ttyUSB2
crw-rw---T 1 root dialout 188, 3 May 14 16:56 /dev/ttyUSB3

Test gammu sudah bekerja atau belum?

Masukkan command ini
$ gammu getallsms
0 SMS parts in 0 SMS sequences

Sip! Sudah bekerja dengan baik kalau lihat pesan diatas.

Coba juga dengan kirim SMS.
$ echo "Kirim SMS dari gammu nih" | gammu sendsms TEXT 08xxxxxxxx9
If you want break, press Ctrl+C...
Sending SMS 1/1....waiting for network answer..OK, message reference=7

Nyalain service gammu-smsd

Karena tujuannya tadi buat service yang baca remote database, jadi kita harus set service untuk SMS gateway kita ini.

Pertama tentunya set konfigurasi /etc/gammu-smsdrc. Pertama samakan dulu port di bagian [gammu], seperti yang didapat diatas.
[gammu]
port = /dev/ttyUSB0
connection = at19200

Di bagian [smsd], kita remark service = files dan tambahkan koneksi ke database MySQL kita. Karena database saya remote, kira-kira begini konfigurasi saya.
[smsd]
#service = files
PIN = 1234
service = sql
driver = native_mysql
host = xxx.xxx.xxx.xxx
database = xxxxxx
user = xxxxxx
password = xxxxxx

Sesuaikan sendiri, kalau pake database lain ya …

Restart service nya
$ sudo service gammu-smsd restart

Jangan lupa, cek log file di /var/log/syslog kalau ada error yang muncul.

Kita coba kirim SMS
$ echo "Uji mengirim SMS dari gammu-smsd" | sudo -u gammu gammu-smsd-inject TEXT 08xxxxxxxx9
gammu-smsd-inject[2658]: Connected to Database: xxxxxx on xxx.xxx.xxx.xxx
gammu-smsd-inject[2658]: Connected to Database native_mysql: xxxxxx on xxx.xxx.xxx.xxx
gammu-smsd-inject[2658]: Written message with ID 6
Written message with ID 6

Sip! Sudah masuk ke antrian kirim. Kalau sms sudah diterima, artinya gammu-smsd sudah bekerja dengan baik.

Kirim SMS dengan menggunakan PHP

Tujuan kita tadi adalah mengirim SMS secara otomatis kan? Ternyata, mengirimkan SMSnya cukup mudah. Jadi kita buat query connect ke mysql, trus cukup insert seperti dibawah ini

INSERT INTO outbox (DestinationNumber, TextDecoded)
VALUES ('08xxxxxxxx9', 'Uji kirim SMS dengan insert ke database');

SMS gateway kita kemudian akan membaca perubahan table outbox ini, dan kemudian mengirimkan SMSnya.

Kalau pengen script untuk SMS masuk, terkirim dan lain-lainnya silahkan lihat struktrur database dari MySql untuk gammu-smsd ini

Atau pasang script Kalkun SMS Management ini. 🙂

Selamat mencoba sendiri.

Bagaimana dengan modem lebih dari satu?

[update: tambahan per tanggal 25 Mei 2015]

Setelah deteksi modem modemnya, kita mengubah konfigurasi ~/.gammurc. Sebelumnya port harus disesuaikan dengan hasil pengecekan

~ $ dmesg | grep tty
[ 0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2709.boardrev=0xa21041 bcm2709.serial=0x5e907206 smsc95xx.macaddr=B8:27:EB:90:72:06 bcm2708_fb.fbswap=1 bcm2709.disk_led_gpio=47 bcm2709.disk_led_active_low=0 sdhci-bcm2708.emmc_clock_freq=250000000 vc_mem.mem_base=0x3dc00000 vc_mem.mem_size=0x3f000000 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 cgroup_enable=memory elevator=deadline rootwait
[ 0.001888] console [tty1] enabled
[ 0.748292] dev:f1: ttyAMA0 at MMIO 0x3f201000 (irq = 83, base_baud = 0) is a PL011 rev3
[ 1.285991] console [ttyAMA0] enabled
[ 14.329792] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB0
[ 14.330680] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB1
[ 14.331343] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB2
[ 16.066209] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB3
[ 16.066964] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB4
[ 16.067750] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB5
[ 16.068542] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB6

Dalam contoh di atas, terdeteksi modem yang beda, dan kita ambil masing masing port pertama yaitu /dev/ttyUSB0 dan /dev/ttyUSB3.

Jadi file ~/.gammurc kita sunting seperti contoh dibawah ini
[gammu]
port = /dev/ttyUSB0
connection = at115200
...
[gammu1]
port = /dev/ttyUSB3
connection = at115200
...
[gammu2]
.... dst

Kemudian saatnya kita periksa konfigurasinya. Pastikan juga service gammu-smsd mati.
sudo service gammu-smsd stop
$ gammu 0 identify
Device : /dev/ttyUSB0
Manufacturer : Huawei
Model : unknown (E352)
Firmware : 11.102.23.04.314
IMEI : 3xxxxxxxxxxxxx1
SIM IMSI : 5xxxxxxxxxxxxx7

$ gammu 1 identify
Device : /dev/ttyUSB3
Manufacturer : Huawei
Model : E173 (E173)
Firmware : 21.028.00.05.18
IMEI : 8xxxxxxxxxxxxx3
SIM IMSI : 5xxxxxxxxxxxxx3

Dengan contoh hasil diatas, kita tahu bahwa kedua modem sudah siap bekerja. 🙂

Menambah service Gammu untuk modem tambahan

Sebelumnya, kita tahu service gammu yang terpasang baru satu yaitu yang konfigurasinya tersimpan di /etc/gammu-smsdrc.

Untuk menambah service untuk modem kedua, pertama kita edit dulu /etc/gammu-smsdrc.

$ cd /etc
$ sudo nano gammu-smsdrc

Tambahkan phoneid di bagian smsd

....
[smsd]
phoneid=phone1
...

Kemudian kita copy file /etc/gammu-smsdrc menjadi /etc/gammu-phone2 misalnya, dan kita langsung ubah konfigurasinya

$ cd /etc
$ sudo cp gammu-smsdrc gammu-phone2
$ sudo nano gammu-phone2

Rubah dibagian [gammu] sesuai dengan port yang terdeteksi di atas
[gammu]
port = /dev/ttyUSB3
...

Kemudian dibagian [smsd], kita set phoneid yang berbeda

[smsd]
....
phoneid=phone2
....

Tahap berikutnya kita harus menambahkan service (kita namakan ‘gammu-phone2’ misalnya) di dalam /etc/init.d
$ cd /etc/init.d
sudo cp gammu-smsd gammu-phone2

Edit gammu-phone2. Rubah berikut ini
### BEGIN INIT INFO
# Provides: gammu-phone2
....
....
NAME=gammu-phone2
DESC="Gammu SMS Daemon Phone #2"
....

Tambahkan juga baris DAEMONPARAM=
....
DAEMON=/usr/bin/gammu-smsd
DAEMONPARAM="--config /etc/gammu-phone2"
....

Jadi service ini akan membaca konfigurasi /etc/gammu-phone2.

Berikutnya kita edit juga sedikit baris ini
....
start)
if grep -q '^port = /dev/null' /etc/gammu-phone2 ; then
....

Simpan dan kemudian kita coba nyalakan service keduanya.

$ sudo service gammu-smsd start
$ sudo service gammu-phone2 start

Karena gammu-phone2 ini masih belum masuk di list start-up service, maka kita tambahan sebagai berikut
$ sudo update-rc.d gammu-phone2 defaults

Jika di kemudian hari, anda ingin mencopot service ini dari start-up, caranya mudah seperti di bawah ini.
$ sudo update-rc.d -f gammu-phone2 remove

Untuk mengetahui service ini, kita bisa gunakan htop. Jika belum terinstall, kita install dulu htop-nya.
$ sudo apt-get install htop
$ htop

Disana anda akan melihat dua service yang menggunakan /usr/bin/gammu-smsd, masing-masing untuk tiap modem.

Reboot dan cek kembali servicenya apakah sudah menyala dengan reboot si Pi nya.
$ sudo reboot

Btw, untuk scipt pengiriman SMS dengan PHP, maka caranya dirubah sedikit dengan menambahkan SenderID, seperti contoh dibawah ini

INSERT INTO outbox (DestinationNumber, TextDecoded, SenderID)
VALUES ('08xxxxxxxx9', 'Uji kirim SMS dengan insert ke database', 'phone2');

Dan SMS ini akan dikirimkan oleh modem kedua.

Jika SenderID dikosongkan atau tidak diupdate, maka Gammu SMSD secara otomatis akan memilih salah satu modem untuk mengirimnya.

Akhirnya cukup panjang juga nih artikel. Mudah-mudahan cukup lengkap pembahasannya…

3 thoughts on “Raspberry Pi 2 sebagai SMS Gateway

  1. Mau numpang tanya mas, itu untuk kirim sms otomatis dari server ke raspberry cukup dengan query INSERT ya? Terus dengan parameter query INSERT apa iya otomatis membaca perubahan table outbox? Atau mungkin dengan cara lain?

Leave a Reply