Sabtu, 01 Juni 2013

Cara Membuat SMS Gateway

Cara Membuat SMS Gateway

SMS Gateway Adalah satu platform yang menyediakan mekanisme untuk menghantar dan menerima SMS dan Merupakan pintu gerbang bagi penyebaran Informasi dengan menggunakan SMS, sehingga memudahkan dalam menyebarkan pesan ke ratusan nomor secara otomatis dan cepat yang langsung terhubung dengan database nomor-nomor ponsel.
Sms sekarang bisa jadi sudah mulai di tinggalkan karena sudah banyak aplikasi yang dapat mengirimkan yang lebih baik mulai dari BBM, Whatsapp, chat On dan masih banyak lagi fasilitas untuk mengirim pesan pada smartphone pada saat ini, walaupun sms ketinggalan jaman tapi tetap bisa menjadi salah satu alat mengirim pesan sederhana yang memiliki pusa terbatas, kali ini saya coba shering cara membangun SMS Gateway atau Sebutan yang kerennya saat ini SMS Center, pasti pada penasaran :) yup untuk alat dan bahan sederhana yakni:
Alat dan Bahan yang Digunakan
  • PC/Laptop Minimal Dengan Sistem Operasi Windows XP Sp 3
  • Modem GSM/CDMA
  • Kartu operator GSM/CDMA dan tentunya jangan lupa kartunya di isi pulsa :)
Download Software yang Akan Digunakan:
  1.  Kalkun program opensource untuk mengatur  sms yang keluar dan masuk
  2.   Gammu Engine untuk penghubungnya dengan modem dan Kalkun agar sms yang masuk lansung di transfer ke Inbox Aplikasi Kalkun, dengan Alat dan bahan yang dipersiapkan adalah Modem GSM.
  3.  XAMPP  sebagai webserver dan database server.
Untuk lebih lengkapnya tutorial SMS Gateway dapat di Download disini.


Saat ini fungsi sms tidak sekedar untuk berkirim pesan kepada kerabat saja, tapi sudah beralih ke fungsi yang lain misalnya quiz sms, polling sms, layanan Info On Demand, dan sebagainya.
Semua aplikasi tersebut membutuhkan suatu aplikasi yang disebut sms gateway.
Aplikasi SMS gateway bisa diterapkan pada Café, Toko, Rumah sakit, Sekolah, maupun instansi pemerintah.
Contoh aplikasi Info On Demand untuk Sekolah misalnya:
-> Info nilai ujian siswa.
cara kerja : client mengirim no.induk siswa diikuti mata pelajaran ke nomor server lalu server akan mengirim nilai ujian secara otomatis
-> Info jadwal ujian, pendaftaran siswa baru dsb.
Sebenarnya untuk membuat SMS gateway tidak terlalu sulit. Bahkan bagi yang awam coding sekalipun. Cukup sedikit pengetahuan tentang Visual Basic dan MsAccess, anda bisa membuat apikasi SMS Gateway sendiri.
Yang diperlukan untuk membuat aplikasi SMS Gateway:
Hardware
- Computer
- GSM Modem atau HP Nokia series sebagai sms gateway
- Kabel Data USB /serial

Software
- Visual Basic
- FBus Activex sebagai komponen Visual Basic
- MsAccess sebagai database
Dengan SMS Activex, kita sudah bisa menerima sms, membaca inbox, maupun mengirim sms melalui PC.
Lalu gimana caranya agar kita bisa membuat sms gateway yang bisa memberikan layanan Info On demand?
Berikut langkah-langkahnya
1. Koneksikan database MsAccess dengan Visual Basic
2. Isi database MsAccess dengan database Buku Telepon
3. Memodifikasi script dari smsactivex. Sehingga setiap ada pesan masuk, program akan membalas secara otomatis.
Source Codenya plus Componentnya. Silahkan anda Download
TUTORIAL
Oke jadi kasusnya apa nih, kita ambil aja sample sederhana yaitu “pembuatan sms gateway untuk request nilai siswa” dan untuk menyederhanakan pembahasan keywordnya kita batasi saja yaitu request nilai tugas dan ulangan.
Apa yang harus di persiapkan, pertama kita rancang dulu databasenya dan berhubung artikelsaya yang membahas tentang database SQLite masih hangat jadi untuk databasenya kita menggunakan SQLite saja.

SQLite adalah database standalone yang kecil, mungil dan gratis. Bagaimana cara membuat database di SQLite sudah saya bahas disini kemudian bagaimana mengaksesnya dari aplikasi juga sudah saya bahasa disini.
Berikut adalah rancangan sederhana database sms yang akan kita buat :

Ada banyak cara untuk membaca sms masuk dan membalasanya, salah satunya adalah menggunakan perintah AT COMMAND dan Microsoft sendiri sudah menyediakan komponenyang bisa mengeksekusi perintah-perintah tersebut.
Tentunya cara ini (menggunakan AT COMMAND) bukan cara yang favorit dikalangan programmer instan seperti Anda dan Saya :D , jadi diartikel ini saya menggunakan komponenpihak ketiga.
Ingat komponen ini adalah shareware, segala resiko (kemudahan dalam membuat aplikasi sms gateway) ditanggung sendiri :D , saya disini hanya share dan tidak terikat kerja sama dengan pihak ketiga tersebut.
Halah pernyataan ngawur :D
Berikut adalah cuplikan source code untuk membaca dan mengirim sms menggunakan komponen ActiveXpert SMS
1. Membaca SMS Masuk
Private Sub cmdBacaSMS_Click()
    Dim objGsmIn        As ASmsCtrl.GsmIn

    Set objGsmIn = New ASmsCtrl.GsmIn
    With objGsmIn
        .Activate "XXX-XXXX-XXXX-XXXXX"  'diisi serial number yg Anda dapatkan secara ilegal
        .Device = "COM1" 'disesuaikan dengan port COM yang digunakan
        .DeviceSpeed = 19200 'default = 0

        .Storage = 2 '0=sim 1=device 2=any
        .DeleteAfterReceive = True
        .Receive

        If .LastError = 0 Or .LastError = 23140 Then ' Success
            .GetFirstMessage

            While .LastError = 0
                Debug.Print "Pengirim : " & .MessageSender
                Debug.Print "Isi SMS : " & .MessageData

                'TODO : INSERT KE TABEL SMS_IN

                .GetNextMessage
            Wend
        End If
    End With
    Set objGsmIn = Nothing
End Sub
2. Mengirim sms
Private Sub cmdKirimSMS_Click()
    Dim objGsmOut       As ASmsCtrl.GsmOut
    Dim objConstants    As ASmsCtrl.Constants

    Set objGsmOut = New ASmsCtrl.GsmOut
    Set objConstants = New ASmsCtrl.Constants

    With objGsmOut
        .Activate "XXX-XXXX-XXXX-XXXXX"  'diisi serial number yg Anda dapatkan secara ilegal
        .Device = "COM1" 'disesuaikan dengan port COM yang digunakan
        .DeviceSpeed = 19200 'default = 0
        .RequestStatusReport = False

        .MessageType = objConstants.asMESSAGETYPE_TEXT 'mengirim pesan maksimal 160 karakter
        '.MessageType = objConstants.asMESSAGETYPE_TEXT_MULTIPART 'jika lebih dari 160 karakter gunakan opsi ini

        .MessageRecipient = "nomor tujuan" 'biasanya menggunakan prefix +62
        .MessageData = "isi pesan"
        .Send 'kirim
    End With

    Set objConstants = Nothing
    Set objGsmOut = Nothing
End Sub
Jadi cukup dengan bermodalkan 2 cuplikan kode diatas kita akan menyelesaikan aplikasi yg dibahas pada artikel kali ini.
Adapun untuk keyword yang akan digunakan sebagai berikut :
1. Request nilai tugas
keyword : tgs#nis
contoh :
tgs#9941224165
balasan :
Nilai tugas (NAMA SISWA) : BI=95, IPA=75, IPS=80, MTK=85
2. Request nilai ulangan harian
keyword : uh#nis
contoh :
uh#9941224165
balasan :
Nilai ulangan (NAMA SISWA) : BI=95, IPA=75, IPS=80, MTK=85
Berikut penjelasan ringkas beberapa cuplikan source code yang digunakan dalam pembuatan aplikasi sms gateway ini.
Private Function connectToDevice(ByVal device As String) As Boolean
    Dim objGsm      As ASmsCtrl.GsmOut
    Dim manufaktur  As String

    On Error GoTo errHandle

    Set objGsm = New ASmsCtrl.GsmOut
    With objGsm
        .Activate SERIAL_NUMBER
        .device = device

        manufaktur = .SendCommand("AT+CGMI", 500)  'menampilkan informasi manufactur
        manufaktur = Replace$(manufaktur, vbCrLf, "")
        manufaktur = Replace$(manufaktur, "OK", "")
        manufaktur = Replace$(manufaktur, "ERROR", "")
        manufaktur = Replace$(manufaktur, "AT+CGMI", "")
    End With
    Set objGsm = Nothing

    If Len(manufaktur) > 0 Then
        txtModem.Text = manufaktur
        connectToDevice = True
    End If

    Exit Function
errHandle:
    connectToDevice = False
End Function
Sesuai namanya fungsi connectToDevice digunakan untuk mengecek status modem sms yang terpasang, salah satu caranya adalah dengan mengirimkan AT COMMAND “AT+CGM”, AT COMMAND ini berfungsi untuk mendapatkan informasi manufaktur.
Sebagai contoh jika modem sms yg digunakan adalah hp siemens maka nilai yg dihasilkan dari perintah ini adalah “SIEMENS” dan tentunya hp yg bersangkutan juga harus mendukung AT COMMAND.
Private Sub readSMS()
    Dim objGsmIn        As ASmsCtrl.GsmIn
    Dim objConstants    As ASmsCtrl.Constants
    Dim cmd             As cCommand

    Dim keyword         As String
    Dim phoneNumber     As String
    Dim i               As Integer

    On Error GoTo errHandle

    Screen.MousePointer = vbHourglass
    cmdStop.Enabled = False
    tmrReceiveSms.Enabled = False

    DoEvents

    Set objGsmIn = New ASmsCtrl.GsmIn
    Set objConstants = New ASmsCtrl.Constants

    With objGsmIn
        .Activate SERIAL_NUMBER
        .device = cmbPORT.Text
        .DeviceSpeed = 0

        .Storage = cmbStorage.ItemData(cmbStorage.ListIndex)
        .DeleteAfterReceive = True 'hapus sms jika sudah dibaca
        .Receive

        If .LastError = 0 Or .LastError = 23140 Then 'baca sms sukses
            .GetFirstMessage

            strSql = "INSERT INTO sms_in (phone_number, sms_keyword, date_in, time_in) VALUES (?, ?, ?, ?)"
            Set cmd = conn.CreateCommand(strSql)
            conn.BeginTrans

            i = 1
            While .LastError = 0
                phoneNumber = rep0to62(.MessageSender)
                keyword = .MessageData

                cmd.SetText 1, phoneNumber
                cmd.SetText 2, keyword
                cmd.SetDate 3, Format(Now, "yyyy/MM/dd")
                cmd.SetTime 4, Format(Now, "hh:mm:ss")

                cmd.Execute

                If i Mod 10 = 0 Then
                    conn.CommitTrans
                    DoEvents

                    conn.BeginTrans
                End If

                i = i + 1

                .GetNextMessage
            Wend

            conn.CommitTrans
            Set cmd = Nothing

        End If
    End With
    Set objGsmIn = Nothing

    If cekSMSIn Then
        Call sendSMS
    Else
        Call Wait(5000)
    End If

    cmdStop.Enabled = True
    Screen.MousePointer = vbDefault

    tmrReceiveSms.Enabled = True

    Exit Sub
errHandle:
    tmrReceiveSms.Enabled = True
End Sub
Prosedur readSMS digunakan untuk membaca sms masuk dan menyimpannya ke tabel sms_in, berhubung komponen ActiveXpert SMS tidak mempunyai event yg menandai adanya sms masuk maka sebagai gantinya kita menggunakan timer untuk memanggil prosedur readSMS.
Salah satu properties penting yang dimiliki oleh ActiveXpert SMS adalah DeleteAfterReceive, jika nilainya diset true maka sms yg masuk akan otomatis dihapus dan tentunya setelah smsnya dibaca.
Private Function cekSMSIn() As Boolean
    Dim ret As Integer

    strSql = "SELECT COUNT(*) FROM sms_in WHERE status = 0" 'jika status = 0 berarti sms masuk belum di proses
    ret = CInt(dbGetValue(strSql, 0))
    If ret > 0 Then 'ada sms yg belum diproses
        cekSMSIn = True
    End If
End Function
Prosedur cekSMSIn dibutuhkan oleh prosedur readSMS, jadi dengan adanya prosedur cekSMSIn ini program akan mengetahui kapan waktu yg tepat untuk memanggil prosedur sendSMS.
Private Sub sendSMS()
    Dim rsSend          As cRecordset
    Dim cmd             As cCommand

    Dim objGsmOut       As ASmsCtrl.GsmOut
    Dim objConstants    As ASmsCtrl.Constants

    Dim phoneNumber     As String
    Dim keyword         As String
    Dim smsBalasan      As String

    On Error GoTo errHandle

    'cek sms yang belum di proses, ditandai dg status = 0
    strSql = "SELECT id, phone_number, sms_keyword " & _
             "FROM sms_in " & _
             "WHERE status = 0 " & _
             "ORDER BY id"
    Set rsSend = conn.OpenRecordset(strSql)
    If Not rsSend.EOF Then
        Set objGsmOut = New ASmsCtrl.GsmOut
        Set objConstants = New ASmsCtrl.Constants

        objGsmOut.Activate SERIAL_NUMBER
        objGsmOut.device = cmbPORT.Text
        objGsmOut.DeviceSpeed = 0
        objGsmOut.RequestStatusReport = False
        objGsmOut.MessageType = objConstants.asMESSAGETYPE_TEXT_MULTIPART

        Do While Not rsSend.EOF
            'ganti prefix nomor hp 0 -> +62
            phoneNumber = rep0to62("" & rsSend("phone_number").Value)
            keyword = rsSend("sms_keyword").Value

            smsBalasan = getBalasanSms(keyword, phoneNumber)

            objGsmOut.MessageRecipient = phoneNumber
            objGsmOut.MessageData = smsBalasan
            objGsmOut.Send

            If objGsmOut.LastError = 0 Or objGsmOut.LastError = 23140 Then 'sms sukses dikirim
                'update status sms -> 1
                strSql = "UPDATE sms_in SET status = ?, no_ref = ? " & _
                         "WHERE id = ?"
                Set cmd = conn.CreateCommand(strSql)
                With cmd
                    .SetInt32 1, 1
                    .SetInt32 2, objGsmOut.MessageReference
                    .SetInt32 3, rsSend("id").Value

                    .Execute
                End With
                Set cmd = Nothing

                'insert ke tabel sms_out, untuk histori sms keluar
                strSql = "INSERT INTO sms_out (phone_number, replay_msg, date_out, time_out) VALUES (?, ?, ?, ?)"
                Set cmd = conn.CreateCommand(strSql)
                With cmd
                    .SetText 1, phoneNumber
                    .SetText 2, smsBalasan
                    .SetDate 3, Format(Now, "yyyy/MM/dd")
                    .SetTime 4, Format(Now, "hh:mm:ss")

                    .Execute
                End With
                Set cmd = Nothing

            Else 'sms gagal dikirim
                'update status sms -> 1

                'ini masih bisa dikembangkan lagi dengan menambah kolom max_jumlah_kirim di tabel sms_in
                'jadi bisa diberi aturan sms yg gagal dikirim > 3x baru status smsnya diupdate menjadi 1
                strSql = "UPDATE sms_in SET status = ?, no_ref = ? " & _
                         "WHERE id = ?"
                Set cmd = conn.CreateCommand(strSql)
                With cmd
                    .SetInt32 1, 1
                    .SetInt32 2, objGsmOut.MessageReference
                    .SetInt32 3, rsSend("id").Value

                    .Execute
                End With
                Set cmd = Nothing
            End If

            Call Wait(5000)

            rsSend.MoveNext
        Loop
        Set objConstants = Nothing
        Set objGsmOut = Nothing
    End If

    Exit Sub
errHandle:
    Resume Next
End Sub
Prosedur sendSMS akan mengolah sms masuk yg belum di proses (ditandai dengan status = 0), mengupdate statusnya menjadi 1 jika berhasil mengirimkan sms, kemudian menyimpannya ke tabel sms_out sebagai histori pengiriman sms.
Public Function rep0to62(ByVal phoneNumber As String) As String
    'fungsi untuk mengganti prefix 0 -> +62

    rep0to62 = phoneNumber
    If Left(phoneNumber, 1) = "0" Then rep0to62 = "+62" & Right(phoneNumber, Len(phoneNumber) - 1)
End Function
Sesuai namanya fungsi ini berguna untuk mengganti prefix nomor hp 0 menjadi +62 (kode indonesia).
Terakhir fungsi untuk memproses keyword sms yang masuk dan sekaligus sebagai balasan untuk sms keluar.
Public Function getBalasanSms(ByVal keywordSms As String, ByVal phoneNumber As String) As String
    Dim rs              As cRecordset
    Dim param1          As String
    Dim arrKeyword()    As String

    Dim prefix          As String
    Dim nilai           As String
    Dim nama            As String

    Dim tha             As String
    Dim semester        As String

    If Len(keywordSms) > 0 Then
        If InStr(1, keywordSms, "#") > 0 Then 'karakter # -> separator keyword
            arrKeyword = Split(keywordSms, "#")
            If Not (Len(arrKeyword(0)) > 0) Then
                getBalasanSms = "Keyword sms salah"
                Exit Function

            Else
                'do nothing
            End If

        Else
            ReDim arrKeyword(0)
            arrKeyword(0) = keywordSms
        End If

    Else
        getBalasanSms = "Keyword sms salah"
        Exit Function
    End If

    prefix = arrKeyword(0)
    prefix = UCase$(prefix)

    If UBound(arrKeyword) > 0 Then param1 = arrKeyword(1) 'untuk contoh disini param1 bernilai nomor induk siswa

    'untuk pengembangan lebih lanjut tahun ajaran dan semester dibuat settingan tersendiri
    tha = "2009/2010"
    semester = 2

    Select Case prefix
        Case "TGS"
            'validasi nis siswa
            If Not isValidNIS(param1) Then getBalasanSms = Replace(NIS_SALAH, "<nis>", param1): Exit Function

            'validasi no hp siswa
            'nama sekolah sebaiknya disimpan didalam variabel
            If Not isValidHPSiswa(param1, phoneNumber) Then
                getBalasanSms = Replace(HP_UNREG, "<nama_sekolah>", "SMA Negeri Yogyakarta")
                getBalasanSms = Replace(getBalasanSms, "<no_hp>", phoneNumber): Exit Function
            End If

            strSql = "SELECT UPPER(nama) FROM siswa WHERE nis = '" & param1 & "'"
            nama = CStr(dbGetValue(strSql, ""))

            'mulai proses pencarian nilai
            strSql = "SELECT matapelajaran_kode, nilai " & _
                     "FROM nilai_tugas " & _
                     "WHERE siswa_nis = '" & param1 & "' AND tahun_ajaran = '" & tha & "' AND semester = " & semester & " " & _
                     "ORDER BY matapelajaran_kode"
            Set rs = conn.OpenRecordset(strSql)
            If Not rs.EOF Then
                Do While Not rs.EOF
                    nilai = nilai & rs("matapelajaran_kode").Value & "=" & rs("nilai").Value & ", "
                    rs.MoveNext
                Loop
            End If

            If Len(nilai) > 0 Then
                nilai = Left(nilai, Len(nilai) - 2)
                getBalasanSms = "Nilai tugas (" & nama & ") : " & nilai

            Else
                getBalasanSms = "Nilai tugas (" & nama & ") sedang dalam proses pendataan"
            End If

        Case "UH"
            'validasi nis siswa
            If Not isValidNIS(param1) Then getBalasanSms = Replace(NIS_SALAH, "<nis>", param1): Exit Function

            'validasi no hp siswa
            'nama sekolah sebaiknya disimpan didalam variabel
            If Not isValidHPSiswa(param1, phoneNumber) Then
                getBalasanSms = Replace(HP_UNREG, "<nama_sekolah>", "SMA Negeri Yogyakarta")
                getBalasanSms = Replace(getBalasanSms, "<no_hp>", phoneNumber): Exit Function
            End If

            strSql = "SELECT UPPER(nama) FROM siswa WHERE nis = '" & param1 & "'"
            nama = CStr(dbGetValue(strSql, ""))

            'mulai proses pencarian nilai
            strSql = "SELECT matapelajaran_kode, nilai " & _
                     "FROM nilai_ulangan " & _
                     "WHERE siswa_nis = '" & param1 & "' AND tahun_ajaran = '" & tha & "' AND semester = " & semester & " " & _
                     "ORDER BY matapelajaran_kode"
            Set rs = conn.OpenRecordset(strSql)
            If Not rs.EOF Then
                Do While Not rs.EOF
                    nilai = nilai & rs("matapelajaran_kode").Value & "=" & rs("nilai").Value & ", "
                    rs.MoveNext
                Loop
            End If

            If Len(nilai) > 0 Then
                nilai = Left(nilai, Len(nilai) - 2)
                getBalasanSms = "Nilai ulangan (" & nama & ") : " & nilai

            Else
                getBalasanSms = "Nilai ulangan (" & nama & ") sedang dalam proses pendataan"
            End If

        Case Else
            getBalasanSms = "Keyword sms salah"
    End Select
End Function

1 komentar:

  1. The information written in the article is descriptive and well written.It is also simple to read and understand.Good Read.
    sms gateway

    BalasHapus