Membuat sms gateway itu gampang, jangan dipersulit !!!
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
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
| 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 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| 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 |
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.
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
| 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 |
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.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
80
81
82
| 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 |
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
2
3
4
5
6
7
8
9
| 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 |
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
| 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 |
1
2
3
4
5
6
| 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 |
Terakhir fungsi untuk memproses keyword sms yang masuk dan sekaligus sebagai balasan untuk sms keluar.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
| 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
http://coding4ever.wordpress.com/2010/07/12/membuat-sms-gateway-itu-gampang-jangan-dipersulit/
Tidak ada komentar:
Posting Komentar