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 di
sini kemudian bagaimana mengaksesnya dari aplikasi juga sudah saya bahasa di
sini.
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 | Dim objGsmIn As ASmsCtrl.GsmIn |
04 | Set objGsmIn = New ASmsCtrl.GsmIn |
06 | .Activate "XXX-XXXX-XXXX-XXXXX" |
11 | .DeleteAfterReceive = True |
14 | If .LastError = 0 Or .LastError = 23140 Then |
18 | Debug.Print "Pengirim : " & .MessageSender |
19 | Debug.Print "Isi SMS : " & .MessageData |
27 | Set objGsmIn = Nothing |
2. Mengirim sms
01 | Private Sub cmdKirimSMS_Click() |
02 | Dim objGsmOut As ASmsCtrl.GsmOut |
03 | Dim objConstants As ASmsCtrl.Constants |
05 | Set objGsmOut = New ASmsCtrl.GsmOut |
06 | Set objConstants = New ASmsCtrl.Constants |
09 | .Activate "XXX-XXXX-XXXX-XXXXX" |
12 | .RequestStatusReport = False |
14 | .MessageType = objConstants.asMESSAGETYPE_TEXT |
17 | .MessageRecipient = "nomor tujuan" |
18 | .MessageData = "isi pesan" |
22 | Set objConstants = Nothing |
23 | Set objGsmOut = Nothing |
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 | Dim objGsm As ASmsCtrl.GsmOut |
03 | Dim manufaktur As String |
05 | On Error GoTo errHandle |
07 | Set objGsm = New ASmsCtrl.GsmOut |
09 | .Activate SERIAL_NUMBER |
12 | manufaktur = .SendCommand( "AT+CGMI" , 500) |
13 | manufaktur = Replace$(manufaktur, vbCrLf, "" ) |
14 | manufaktur = Replace$(manufaktur, "OK" , "" ) |
15 | manufaktur = Replace$(manufaktur, "ERROR" , "" ) |
16 | manufaktur = Replace$(manufaktur, "AT+CGMI" , "" ) |
20 | If Len(manufaktur) > 0 Then |
21 | txtModem.Text = manufaktur |
22 | connectToDevice = True |
27 | connectToDevice = False |
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.
02 | Dim objGsmIn As ASmsCtrl.GsmIn |
03 | Dim objConstants As ASmsCtrl.Constants |
07 | Dim phoneNumber As String |
10 | On Error GoTo errHandle |
12 | Screen.MousePointer = vbHourglass |
13 | cmdStop.Enabled = False |
14 | tmrReceiveSms.Enabled = False |
18 | Set objGsmIn = New ASmsCtrl.GsmIn |
19 | Set objConstants = New ASmsCtrl.Constants |
22 | .Activate SERIAL_NUMBER |
23 | .device = cmbPORT.Text |
26 | .Storage = cmbStorage.ItemData(cmbStorage.ListIndex) |
27 | .DeleteAfterReceive = True |
30 | If .LastError = 0 Or .LastError = 23140 Then |
33 | strSql = "INSERT INTO sms_in (phone_number, sms_keyword, date_in, time_in) VALUES (?, ?, ?, ?)" |
34 | Set cmd = conn.CreateCommand(strSql) |
39 | phoneNumber = rep0to62(.MessageSender) |
40 | keyword = .MessageData |
42 | cmd.SetText 1, phoneNumber |
43 | cmd.SetText 2, keyword |
44 | cmd.SetDate 3, Format(Now, "yyyy/MM/dd" ) |
45 | cmd.SetTime 4, Format(Now, "hh:mm:ss" ) |
66 | Set objGsmIn = Nothing |
74 | cmdStop.Enabled = True |
75 | Screen.MousePointer = vbDefault |
77 | tmrReceiveSms.Enabled = True |
81 | tmrReceiveSms.Enabled = True |
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 |
4 | strSql = "SELECT COUNT(*) FROM sms_in WHERE status = 0" |
5 | ret = CInt (dbGetValue(strSql, 0)) |
Prosedur cekSMSIn dibutuhkan oleh prosedur readSMS, jadi dengan adanya prosedur cekSMSIn ini program akan mengetahui kapan waktu yg tepat untuk memanggil prosedur sendSMS.
02 | Dim rsSend As cRecordset |
05 | Dim objGsmOut As ASmsCtrl.GsmOut |
06 | Dim objConstants As ASmsCtrl.Constants |
08 | Dim phoneNumber As String |
10 | Dim smsBalasan As String |
12 | On Error GoTo errHandle |
15 | strSql = "SELECT id, phone_number, sms_keyword " & _ |
17 | "WHERE status = 0 " & _ |
19 | Set rsSend = conn.OpenRecordset(strSql) |
20 | If Not rsSend.EOF Then |
21 | Set objGsmOut = New ASmsCtrl.GsmOut |
22 | Set objConstants = New ASmsCtrl.Constants |
24 | objGsmOut.Activate SERIAL_NUMBER |
25 | objGsmOut.device = cmbPORT.Text |
26 | objGsmOut.DeviceSpeed = 0 |
27 | objGsmOut.RequestStatusReport = False |
28 | objGsmOut.MessageType = objConstants.asMESSAGETYPE_TEXT_MULTIPART |
30 | Do While Not rsSend.EOF |
32 | phoneNumber = rep0to62( "" & rsSend( "phone_number" ).Value) |
33 | keyword = rsSend( "sms_keyword" ).Value |
35 | smsBalasan = getBalasanSms(keyword, phoneNumber) |
37 | objGsmOut.MessageRecipient = phoneNumber |
38 | objGsmOut.MessageData = smsBalasan |
41 | If objGsmOut.LastError = 0 Or objGsmOut.LastError = 23140 Then |
43 | strSql = "UPDATE sms_in SET status = ?, no_ref = ? " & _ |
45 | Set cmd = conn.CreateCommand(strSql) |
48 | .SetInt32 2, objGsmOut.MessageReference |
49 | .SetInt32 3, rsSend( "id" ).Value |
56 | strSql = "INSERT INTO sms_out (phone_number, replay_msg, date_out, time_out) VALUES (?, ?, ?, ?)" |
57 | Set cmd = conn.CreateCommand(strSql) |
59 | .SetText 1, phoneNumber |
60 | .SetText 2, smsBalasan |
61 | .SetDate 3, Format(Now, "yyyy/MM/dd" ) |
62 | .SetTime 4, Format(Now, "hh:mm:ss" ) |
73 | strSql = "UPDATE sms_in SET status = ?, no_ref = ? " & _ |
75 | Set cmd = conn.CreateCommand(strSql) |
78 | .SetInt32 2, objGsmOut.MessageReference |
79 | .SetInt32 3, rsSend( "id" ).Value |
90 | Set objConstants = Nothing |
91 | Set objGsmOut = Nothing |
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 |
5 | If Left(phoneNumber, 1) = "0" Then rep0to62 = "+62" & Right(phoneNumber, Len(phoneNumber) - 1) |
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 | Public Function getBalasanSms( ByVal keywordSms As String , ByVal phoneNumber As String ) As String |
004 | Dim arrKeyword() As String |
011 | Dim semester As String |
013 | If Len(keywordSms) > 0 Then |
014 | If InStr(1, keywordSms, "#" ) > 0 Then |
015 | arrKeyword = Split(keywordSms, "#" ) |
016 | If Not (Len(arrKeyword(0)) > 0) Then |
017 | getBalasanSms = "Keyword sms salah" |
026 | arrKeyword(0) = keywordSms |
030 | getBalasanSms = "Keyword sms salah" |
034 | prefix = arrKeyword(0) |
035 | prefix = UCase$(prefix) |
037 | If UBound(arrKeyword) > 0 Then param1 = arrKeyword(1) |
046 | If Not isValidNIS(param1) Then getBalasanSms = Replace(NIS_SALAH, "<nis>" , param1): Exit Function |
050 | If Not isValidHPSiswa(param1, phoneNumber) Then |
051 | getBalasanSms = Replace(HP_UNREG, "<nama_sekolah>" , "SMA Negeri Yogyakarta" ) |
052 | getBalasanSms = Replace(getBalasanSms, "<no_hp>" , phoneNumber): Exit Function |
055 | strSql = "SELECT UPPER(nama) FROM siswa WHERE nis = '" & param1 & "'" |
056 | nama = CStr (dbGetValue(strSql, "" )) |
059 | strSql = "SELECT matapelajaran_kode, nilai " & _ |
060 | "FROM nilai_tugas " & _ |
061 | "WHERE siswa_nis = '" & param1 & "' AND tahun_ajaran = '" & tha & "' AND semester = " & semester & " " & _ |
062 | "ORDER BY matapelajaran_kode" |
063 | Set rs = conn.OpenRecordset(strSql) |
066 | nilai = nilai & rs( "matapelajaran_kode" ).Value & "=" & rs( "nilai" ).Value & ", " |
071 | If Len(nilai) > 0 Then |
072 | nilai = Left(nilai, Len(nilai) - 2) |
073 | getBalasanSms = "Nilai tugas (" & nama & ") : " & nilai |
076 | getBalasanSms = "Nilai tugas (" & nama & ") sedang dalam proses pendataan" |
081 | If Not isValidNIS(param1) Then getBalasanSms = Replace(NIS_SALAH, "<nis>" , param1): Exit Function |
085 | If Not isValidHPSiswa(param1, phoneNumber) Then |
086 | getBalasanSms = Replace(HP_UNREG, "<nama_sekolah>" , "SMA Negeri Yogyakarta" ) |
087 | getBalasanSms = Replace(getBalasanSms, "<no_hp>" , phoneNumber): Exit Function |
090 | strSql = "SELECT UPPER(nama) FROM siswa WHERE nis = '" & param1 & "'" |
091 | nama = CStr (dbGetValue(strSql, "" )) |
094 | strSql = "SELECT matapelajaran_kode, nilai " & _ |
095 | "FROM nilai_ulangan " & _ |
096 | "WHERE siswa_nis = '" & param1 & "' AND tahun_ajaran = '" & tha & "' AND semester = " & semester & " " & _ |
097 | "ORDER BY matapelajaran_kode" |
098 | Set rs = conn.OpenRecordset(strSql) |
101 | nilai = nilai & rs( "matapelajaran_kode" ).Value & "=" & rs( "nilai" ).Value & ", " |
106 | If Len(nilai) > 0 Then |
107 | nilai = Left(nilai, Len(nilai) - 2) |
108 | getBalasanSms = "Nilai ulangan (" & nama & ") : " & nilai |
111 | getBalasanSms = "Nilai ulangan (" & nama & ") sedang dalam proses pendataan" |
115 | getBalasanSms = "Keyword sms salah" |

Untuk mengetahui daftar hp/modem apa saja yang didukung, jangan sungkan dan malu-malu untuk mengklik link
ini.
Source : http://coding4ever.wordpress.com/
Anda ingin mencari refrensi dan contoh program lengkap ? Kami ada. Sekarang Anda bisa mencari SMS Gateway PHP di situs ini : http://www.bunafitkomputer.com. Koleksi program lengkap di sana, proyek PHP dan MySQL, juga jQuery dan Framework. Bukunya juga ada.
No comments:
Post a Comment