Membuat sms gateway itu gampang, jangan dipersulit !!!
Berhubung banyaknya pengunjung yang nyasar ke blog ini, gara-gara keyword “sms gateway” saya jadi merasa bersalah klo enggax ikut-ikutan membahas artikel yang satu ini he he he .
Walaupun sudah banyak blog yang membahas tentang masalah ini, tapi kayaxnya tema “sms gateway” masih hangat dan saru eh… seru untuk dibahas , dan tentunya dengan adanya artikel ini saya berharap lebih banyak lagi yang tersesat ke blog ini
.
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 artikel saya 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 komponen yang bisa mengeksekusi perintah-perintah tersebut.
Tentunya cara ini (menggunakan AT COMMAND) bukan cara yang favorit dikalangan programmer instan seperti Anda dan Saya , jadi diartikel ini saya menggunakan komponen pihak ketiga.
Ingat komponen ini adalah shareware, segala resiko (kemudahan dalam membuat aplikasi sms gateway) ditanggung sendiri
, saya disini hanya share dan tidak terikat kerja sama dengan pihak ketiga tersebut.
Halah pernyataan ngawur
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
Untuk mengetahui daftar hp/modem apa saja yang didukung, jangan sungkan dan malu-malu untuk mengklik link ini.
Selamat MENCOBA
Comments