Anda di halaman 1dari 15

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
01 Private Sub cmdBacaSMS_Click() 02 03 04 05 06 Set objGsmIn = New ASmsCtrl.GsmIn With objGsmIn Dim objGsmIn As ASmsCtrl.GsmIn

.Activate "XXX-XXXX-XXXX-XXXXX" 'diisi serial number yg Anda dapatkan secara ilegal 07 .Device = "COM1" 'disesuaikan dengan port COM yang digunakan 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 End With Set objGsmIn = Nothing Wend End If .GetNextMessage 'TODO : INSERT KE TABEL SMS_IN While .LastError = 0 Debug.Print "Pengirim : " & .MessageSender Debug.Print "Isi SMS : " & .MessageData If .LastError = 0 Or .LastError = 23140 Then ' Success .GetFirstMessage .Storage = 2 '0=sim 1=device 2=any .DeleteAfterReceive = True .Receive .DeviceSpeed = 19200 'default = 0

28 End Sub

2. Mengirim sms
01 Private Sub cmdKirimSMS_Click() 02 03 04 05 06 07 08 09 10 11 12 13 .MessageType = objConstants.asMESSAGETYPE_TEXT 'mengirim pesan maksimal 160 karakter '.MessageType = objConstants.asMESSAGETYPE_TEXT_MULTIPART 'jika 15 lebih dari 160 karakter gunakan opsi ini 14 16 17 18 19 20 21 22 23 Set objConstants = Nothing Set objGsmOut = Nothing .MessageRecipient = "nomor tujuan" 'biasanya menggunakan prefix +62 .MessageData = "isi pesan" .Send 'kirim End With 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 Set objGsmOut = New ASmsCtrl.GsmOut Set objConstants = New ASmsCtrl.Constants Dim objGsmOut Dim objConstants As ASmsCtrl.GsmOut As ASmsCtrl.Constants

24 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.
01 Private Function connectToDevice(ByVal device As String) As Boolean 02 03 04 05 06 07 08 09 10 11 manufaktur = .SendCommand("AT+CGMI", 500) 'menampilkan informasi manufactur 13 manufaktur = Replace$(manufaktur, vbCrLf, "") 12 14 15 16 17 18 manufaktur = Replace$(manufaktur, "OK", "") manufaktur = Replace$(manufaktur, "ERROR", "") manufaktur = Replace$(manufaktur, "AT+CGMI", "") End With Set objGsm = Nothing Set objGsm = New ASmsCtrl.GsmOut With objGsm .Activate SERIAL_NUMBER .device = device On Error GoTo errHandle Dim objGsm Dim manufaktur As ASmsCtrl.GsmOut As String

19 20 21 22 23 24 25 27 Exit Function connectToDevice = False 26 errHandle: 28 End Function If Len(manufaktur) > 0 Then txtModem.Text = manufaktur connectToDevice = True End If

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.
01 Private Sub readSMS() 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 Set objGsmIn = New ASmsCtrl.GsmIn Set objConstants = New ASmsCtrl.Constants DoEvents Screen.MousePointer = vbHourglass cmdStop.Enabled = False tmrReceiveSms.Enabled = False On Error GoTo errHandle Dim keyword Dim phoneNumber Dim i As String As String As Integer Dim objGsmIn Dim objConstants Dim cmd As ASmsCtrl.GsmIn As ASmsCtrl.Constants As cCommand

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 conn.BeginTrans End If If i Mod 10 = 0 Then conn.CommitTrans DoEvents cmd.Execute cmd.SetText 1, phoneNumber cmd.SetText 2, keyword cmd.SetDate 3, Format(Now, "yyyy/MM/dd") cmd.SetTime 4, Format(Now, "hh:mm:ss") i = 1 While .LastError = 0 phoneNumber = rep0to62(.MessageSender) keyword = .MessageData strSql = "INSERT INTO sms_in (phone_number, sms_keyword, date_in, time_in) VALUES (?, ?, ?, ?)" Set cmd = conn.CreateCommand(strSql) conn.BeginTrans If .LastError = 0 Or .LastError = 23140 Then 'baca sms sukses .GetFirstMessage .Storage = cmbStorage.ItemData(cmbStorage.ListIndex) .DeleteAfterReceive = True 'hapus sms jika sudah dibaca .Receive With objGsmIn .Activate SERIAL_NUMBER .device = cmbPORT.Text .DeviceSpeed = 0

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 81 Exit Sub tmrReceiveSms.Enabled = True 80 errHandle: 82 End Sub tmrReceiveSms.Enabled = True cmdStop.Enabled = True Screen.MousePointer = vbDefault If cekSMSIn Then Call sendSMS Else Call Wait(5000) End If End If End With Set objGsmIn = Nothing conn.CommitTrans Set cmd = Nothing .GetNextMessage Wend i = i + 1

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.
1 Private Function cekSMSIn() As Boolean

2 3 4 5 6 7 8

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

9 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.
01 Private Sub sendSMS() 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 objGsmOut.Activate SERIAL_NUMBER objGsmOut.device = cmbPORT.Text '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 On Error GoTo errHandle Dim phoneNumber Dim keyword Dim smsBalasan As String As String As String Dim objGsmOut Dim objConstants As ASmsCtrl.GsmOut As ASmsCtrl.Constants Dim rsSend Dim cmd As cRecordset As cCommand

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

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 (?, ?, ?, ?)" 57 Set cmd = conn.CreateCommand(strSql) 58 59 With cmd .SetText 1, phoneNumber

60 61 62 63 64 65 66 67 68 69 70

.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 72 status smsnya diupdate menjadi 1 73 strSql = "UPDATE sms_in SET status = ?, no_ref = ? " & _ 71 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 Exit Sub Loop Set objConstants = Nothing Set objGsmOut = Nothing End If rsSend.MoveNext Call Wait(5000) .Execute End With Set cmd = Nothing End If With cmd .SetInt32 1, 1 .SetInt32 2, objGsmOut.MessageReference .SetInt32 3, rsSend("id").Value "WHERE id = ?" Set cmd = conn.CreateCommand(strSql)

95 errHandle: 96 Resume Next 97 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.
1 Public Function rep0to62(ByVal phoneNumber As String) As String 2 3 4 rep0to62 = phoneNumber If Left(phoneNumber, 1) = "0" Then rep0to62 = "+62" & Right(phoneNumber, 5 Len(phoneNumber) - 1) 6 End Function 'fungsi untuk mengganti prefix 0 -> +62

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.
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 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" Dim tha Dim semester As String As String Dim prefix Dim nilai Dim nama As String As String As String Public Function getBalasanSms(ByVal keywordSms As String, ByVal phoneNumber As String) As String Dim rs Dim param1 Dim arrKeyword() As cRecordset As String As String

018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 Else Else Else

Exit Function

'do nothing End If

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

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>", 052 phoneNumber): Exit Function 053 End If 054 055 056 057 058 059 060 061 062 063 064 065 066 '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 & "'" strSql = "SELECT UPPER(nama) FROM siswa WHERE nis = '" & param1 nama = CStr(dbGetValue(strSql, ""))

nilai = nilai & rs("matapelajaran_kode").Value & "=" & rs("nilai").Value & ", " 067 rs.MoveNext 068 069 070 071 072 073 074 075 076 Else If Len(nilai) > 0 Then nilai = Left(nilai, Len(nilai) - 2) getBalasanSms = "Nilai tugas (" & nama & ") : " & nilai Loop End If

getBalasanSms = "Nilai tugas (" & nama & ") sedang dalam proses pendataan" 077 End If 078 079 080 Case "UH"

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

083 084 085 086

'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>", 087 phoneNumber): Exit Function 088 089 090 091 092 093 094 095 096 'mulai proses pencarian nilai strSql = "SELECT matapelajaran_kode, nilai " & _ "FROM nilai_ulangan " & _ & "'" strSql = "SELECT UPPER(nama) FROM siswa WHERE nis = '" & param1 nama = CStr(dbGetValue(strSql, "")) End If

"WHERE siswa_nis = '" & param1 & "' AND tahun_ajaran = '" & tha & "' AND semester = " & semester & " " & _ 097 "ORDER BY matapelajaran_kode" 098 099 100 Set rs = conn.OpenRecordset(strSql) If Not rs.EOF Then

Do While Not rs.EOF nilai = nilai & rs("matapelajaran_kode").Value & "=" & 101 rs("nilai").Value & ", " 102 103 104 105 106 107 108 109 110 111 112 113 114 Case Else Else getBalasanSms = "Nilai ulangan (" & nama & ") sedang dalam proses pendataan" End If If Len(nilai) > 0 Then nilai = Left(nilai, Len(nilai) - 2) getBalasanSms = "Nilai ulangan (" & nama & ") : " & nilai Loop End If rs.MoveNext

115 116 117 End Function

getBalasanSms = "Keyword sms salah" End Select

Anda mungkin juga menyukai