Coding4ever’s Blog

Just coding… coding… and coding… because coding should be fun :)

Membuat Service SMS Gateway Untuk Engine Gammu

| Comments

Pasti udah pada tau kan apa itu Gammu ? Klo enggak ya keterlaluan he he. Itu loh engine yang biasa digunakan untuk mengirim dan menerima sms dan biasanya sering digunakan untuk membuat sms gateway.

Di postingan ini saya tidak akan membahas bagaimana cara instalasi Gammu, konfigurasi dan database yang digunakan. Jadi saya mengasumsikan bahwa service Gammu Anda (GammuSMSD) sudah berjalan dengan baik, dengan kata lain jika ada sms masuk ke nomor yang Anda gunakan sebagai sms center, maka service Gammu otomatis akan meng-INSERT-kan sms tersebut ke tabel inbox.

Struktur Tabel Gammu

Sebelum kita lanjut bagaimana membuat windows service untuk engine Gammu ada baiknya kita melihat dulu struktur tabel Gammu secara menyeluruh.

Dari keenam tabel di atas, kita cukup fokus di 3 tabel utama yaitu inbox, outbox dan outbox_multipart. Tabel inbox otomatis terisi, jika ada sama masuk tentunya dengan syarat service Gammu Anda (GammuSMSD) sudah berjalan dengan baik. Di tabel inbox ini juga sudah ada field dengan nama Processed yang bisa kita gunakan sebagai flag/penanda sms yang sudah diproses.

Nah jika ada sms yang mau dikirim, tinggal kita INSERT-kan datanya secara manual ke tabel outbox. Dan jika smsnya panjang (lebih dari 160 karakter), smsnya harus kita pecah menjadi 2, 3, dst sesuai dengan jumlah karakter yang mau dikirim. Setelah dipecah, sms pertama masuk ke tabel outbox, dan sisanya masuk ke tabel outbox_multipart.

Untuk informasi lebih lanjut tentang struktur database Gammu bisa Anda cek di sini.

Konfigurasi Gammu

Untuk konfigurasi gammu ada dua file yang harus kita edit nilainya yaitu file smsdrc dan gammurc. File ini biasanya ada di folder Instalasi Gammu\share\doc\gammu\examples\config trus kita copykan ke folder Instalasi Gammu\bin. Berikut adalah contoh konfigurasi gammu yang saya gunakan.

1
2
3
4
5
# konfigurasi file gammurc

[gammu]
device = com3:
connection = at115200
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# konfigurasi file smsdrc

[gammu]
device = com3:
connection = at115200

[smsd]
# SMSD service to use, one of FILES, MYSQL, PGSQL, DBI
service = SQL

# File (or stderr, syslog, eventlog) where information will be logged
logfile = C:\gammu\log\gammu.log

# Amount of information being logged, each bit mean one level
debuglevel = 255

# How many seconds should SMSD wait after there is no message in outbox before scanning it again. Default is 30.
commtimeout = 1

# Shows how many seconds SMSD should wait for network answer during sending sms. If nothing happen during this time, sms will be resent. Default is 30.
sendtimeout = 10

# Phone communication settings
checksecurity = 0
CheckBattery = 0

# Database backends congfiguration
user = root
password = rahasia
host = gammuodbc

# pc can also contain port or socket path after colon (eg. localhost:/path/to/socket)
database = db_gammu

# DBI configuration
driver = odbc

# Possible values: mysql, pgsql, sqlite, mssql (Microsoft SQL Server), access (Microsoft Access), oracle
# ref: https://wammu.eu/docs/manual/smsd/config.html#gammu-smsdrc
sql = mysql

Coba perhatikan konfigurasi pada file smsdrc di atas terutama di bagian host, nilainya kita isikan dengan nama ODBC yang terhubung ke database gammu, dan untuk membuat ODBCnya kita gunakan fasilitas ODBC Data Source.

Untuk menambahkan ODBC di atas, sebelumnya kita harus menginstall terlebih dulu MySQL Connector/ODBC.

Environment Testing dan Development Tool yang Digunakan

  • Windows 7 Pro 64 bit
  • Visual Studio Community 2013 – untuk bahasa yang digunakan C#
  • Tipe aplikasi – Windows Service
  • Micro ORM Dapper.NET
  • Gammu-1.38.4-Windows-64bit
  • Database SQLite – untuk menyimpan data siswa, mata pelajaran dan nilai
  • Database MySQL v5.5.45 – untuk menyimpan data gammu
  • MySQL Connector/ODBC v5.3.9
  • Modem Wavecom M1306B

Kok menggunakan Connector/ODBC ? Iya karena Gammu v1.38.4 sudah mendukung koneksi menggunakan ODBC. Jadi selain MySQL, dengan menggunakan ODBC dukungan databasenya jadi lebih banyak seperti PostgreSQL, SQLite, Oracle, MS SQL Server dan MS Access.

Contoh Kasus

Untuk contoh kasusnya kita akan membuat service sms gateway untuk request data yang berhubungan dengan siswa seperti data pribadi, mata pelajaran dan nilai. Service sms gateway ini akan terhubung ke dua database yaitu database gammu yang tersimpan di MySQL dan database nilai yang tersimpan di SQLite. Sms gateway ini mempunyai beberapa format request data yaitu:

1
2
3
CEKMP                  # request data mata pelajaran
CEKSISWA#NIS           # request data siswa
CEKNILAI#NIS#<KODE MP> # request data nilai, kode mp optional

Untuk data siswa, mata pelajaran dan nilainya disimpan menggunakan database SQLite.

Project SMS Gateway

Project SMS Gateway ini dibangun dengan menggunakan konsep separation of concern atau pemisahan kode program berdasarkan fungsinya. Semua kode untuk akses database harus dipisahkan dengan kode untuk pengaturan user inteface. Hal ini memungkinkan kode akses database yang dibuat untuk aplikasi desktop, dengan mudah digunakan untuk aplikasi lainnya seperti web, console atau windows service. Selain itu penerapan konsep separation of concern secara disiplin, dapat menghasilkan kode program yang dapat dites secara otomatis menggunakan tool Unit Testing.

Untuk urusan kode akses database, project ini menggunakan pattern/pola Repository Pattern yang berisi semua kode untuk mengakses database. Semua kode yang sepesifik terhadap implementasi akses database berhenti di sini, lapisan lebih atas tidak boleh tahu bagaimana akses database diterapkan, apakah menggunakan ADO.NET murni (raw ADO.NET) atau menggunakan tool ORM/Micro ORM seperti Dapper.NET, Entity Framework atau NHibernate. Lapisan lainya hanya perlu tahu fungsionalitas dari suatu method di dalam class Repository, tidak perlu tahu bagimana method tersebut diimplementasikan.

Idealnya secara logic, arsitektur aplikasi yang kita gunakan seperti berikut:

Tetapi untuk menyederhanakan pembahasan business logic layer bisa kita gabung ke presentation layer, sehingga arsitekturnya menjadi seperti berikut:

Nah untuk contoh project SMS Gateway ini menggunakan arsitektur yang kedua.

Yang pertama adalah project WindowsServiceGammu.Model. Project ini bertipe Class Library yang berisi class model/entity yang merupakan representasi dari sebuah table. Jadi kalo kita ingin menerapkan konsep OOP dalam pemrograman database maka class-class model/entity ini wajib kita gunakan.

Berikutnya adalah project WindowsServiceGammu.Repository. Project ini bertipe Class Library yang berisi class-class repository yang bertugas untuk menangani operasi CRUD. Biasanya untuk masing-masing class model/entity kita buatkan class repositorynya.

Pada gambar di atas saya menggunakan dua class context yaitu MySqlContext dan SQLiteContext. Class context adalah class yang bertanggung jawab untuk berinteraksi secara langsung dengan database. Jadi class contextlah yang bertugas untuk membuat koneksi, menjalankan perintah sql seperti insert, update, delete dan select atau objek database seperti store procedure dan function. Selain class context juga ada class-class repository yang bertugas untuk menangani operasi CRUD. Berikut adalah contoh class repository untuk class SiswaRepository dan GammuRepository.

Untuk class repository lainnya bisa Anda cek di sini.

Dan yang terakhir adalah project WindowsServiceGammu.Service yang bertipe Windows Service. Project ini tidak bisa dijalankan secara langsung seperti halnya project dengan tipe Console atau Windows Form, tapi harus didaftarkan terlebih dahulu ke Windows Service.

Project ini hanya memanggil class-class model atau repository yang sudah ada.

Ada dua class utama yang digunakan oleh project ini yang pertama yaitu class MainService yang merupakan turunan dari class ServiceBase. Class ServiceBase adalah class bawaan .NET Framework yang merupakan class dasar agar sebuah aplikasi bisa di register/menjadi bagian dari aplikasi service (Windows Service).

Berikutnya adalah class SMSGatewayTask yang bertugas untuk membaca tabel inbox-nya gammu, memvalidasi perintah yang ada dan mengenerate pesan balasan dan kemudian menyimpannya ke tabel outbox. Semua aktivitas membaca dan menyimpan kembali ke database ini dibantu oleh class-class repository.

Instalasi Windows Service

Seperti yang sudah saya jelaskan di atas, project dengan tipe Windows Service tidak bisa dijalankan secara langsung seperti halnya project dengan tipe Console atau Windows Form, tapi harus didaftarkan terlebih dahulu ke Windows Service. Untuk mendaftarkannya kita gunakan tool bawaan .NET Framework yaitu InstallUtil.exe.

1
2
3
4
5
# install service
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe WindowsServiceGammu.Service.exe

# uninstall service
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe WindowsServiceGammu.Service.exe /u

Jika berhasil seharusnya service sms gateway yang sudah kita buat akan terdaftar di Windows Service.

Selamat MENCOBA :-)

Comments