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 :D.
Walaupun sudah banyak blog yang membahas tentang masalah ini, tapi kayaxnya tema “sms gateway” masih hangat dan saru eh… seru untuk dibahas :D, dan tentunya dengan adanya artikel ini saya berharap lebih banyak lagi yang tersesat ke blog ini :D.
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 requestnilai 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 :D, jadi diartikel ini saya menggunakan komponen pihak 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
12345678910111213141516171819202122232425262728
PrivateSubcmdBacaSMS_Click()DimobjGsmInAsASmsCtrl.GsmInSetobjGsmIn=NewASmsCtrl.GsmInWithobjGsmIn.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.ReceiveIf.LastError=0Or.LastError=23140Then' Success.GetFirstMessageWhile.LastError=0Debug.Print"Pengirim : "&.MessageSenderDebug.Print"Isi SMS : "&.MessageData'TODO : INSERT KE TABEL SMS_IN.GetNextMessageWendEndIfEndWithSetobjGsmIn=NothingEndSub
2. Mengirim sms
123456789101112131415161718192021222324
PrivateSubcmdKirimSMS_Click()DimobjGsmOutAsASmsCtrl.GsmOutDimobjConstantsAsASmsCtrl.ConstantsSetobjGsmOut=NewASmsCtrl.GsmOutSetobjConstants=NewASmsCtrl.ConstantsWithobjGsmOut.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'kirimEndWithSetobjConstants=NothingSetobjGsmOut=NothingEndSub
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
Berikut penjelasan ringkas beberapa cuplikan source code yang digunakan dalam pembuatan aplikasi sms gateway ini.
12345678910111213141516171819202122232425262728
PrivateFunctionconnectToDevice(ByValdeviceAsString)AsBooleanDimobjGsmAsASmsCtrl.GsmOutDimmanufakturAsStringOnErrorGoToerrHandleSetobjGsm=NewASmsCtrl.GsmOutWithobjGsm.ActivateSERIAL_NUMBER.device=devicemanufaktur=.SendCommand("AT+CGMI",500)'menampilkan informasi manufacturmanufaktur=Replace$(manufaktur,vbCrLf,"")manufaktur=Replace$(manufaktur,"OK","")manufaktur=Replace$(manufaktur,"ERROR","")manufaktur=Replace$(manufaktur,"AT+CGMI","")EndWithSetobjGsm=NothingIfLen(manufaktur)>0ThentxtModem.Text=manufakturconnectToDevice=TrueEndIfExitFunctionerrHandle:connectToDevice=FalseEndFunction
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.
PrivateSubreadSMS()DimobjGsmInAsASmsCtrl.GsmInDimobjConstantsAsASmsCtrl.ConstantsDimcmdAscCommandDimkeywordAsStringDimphoneNumberAsStringDimiAsIntegerOnErrorGoToerrHandleScreen.MousePointer=vbHourglasscmdStop.Enabled=FalsetmrReceiveSms.Enabled=FalseDoEventsSetobjGsmIn=NewASmsCtrl.GsmInSetobjConstants=NewASmsCtrl.ConstantsWithobjGsmIn.ActivateSERIAL_NUMBER.device=cmbPORT.Text.DeviceSpeed=0.Storage=cmbStorage.ItemData(cmbStorage.ListIndex).DeleteAfterReceive=True'hapus sms jika sudah dibaca.ReceiveIf.LastError=0Or.LastError=23140Then'baca sms sukses.GetFirstMessagestrSql="INSERT INTO sms_in (phone_number, sms_keyword, date_in, time_in) VALUES (?, ?, ?, ?)"Setcmd=conn.CreateCommand(strSql)conn.BeginTransi=1While.LastError=0phoneNumber=rep0to62(.MessageSender)keyword=.MessageDatacmd.SetText1,phoneNumbercmd.SetText2,keywordcmd.SetDate3,Format(Now,"yyyy/MM/dd")cmd.SetTime4,Format(Now,"hh:mm:ss")cmd.ExecuteIfiMod10=0Thenconn.CommitTransDoEventsconn.BeginTransEndIfi=i+1.GetNextMessageWendconn.CommitTransSetcmd=NothingEndIfEndWithSetobjGsmIn=NothingIfcekSMSInThenCallsendSMSElseCallWait(5000)EndIfcmdStop.Enabled=TrueScreen.MousePointer=vbDefaulttmrReceiveSms.Enabled=TrueExitSuberrHandle:tmrReceiveSms.Enabled=TrueEndSub
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.
123456789
PrivateFunctioncekSMSIn()AsBooleanDimretAsIntegerstrSql="SELECT COUNT(*) FROM sms_in WHERE status = 0"'jika status = 0 berarti sms masuk belum di prosesret=CInt(dbGetValue(strSql,0))Ifret>0Then'ada sms yg belum diprosescekSMSIn=TrueEndIfEndFunction
Prosedur cekSMSIn dibutuhkan oleh prosedur readSMS, jadi dengan adanya prosedur cekSMSIn ini program akan mengetahui kapan waktu yg tepat untuk memanggil prosedur sendSMS.
PrivateSubsendSMS()DimrsSendAscRecordsetDimcmdAscCommandDimobjGsmOutAsASmsCtrl.GsmOutDimobjConstantsAsASmsCtrl.ConstantsDimphoneNumberAsStringDimkeywordAsStringDimsmsBalasanAsStringOnErrorGoToerrHandle'cek sms yang belum di proses, ditandai dg status = 0strSql="SELECT id, phone_number, sms_keyword "&_"FROM sms_in "&_"WHERE status = 0 "&_"ORDER BY id"SetrsSend=conn.OpenRecordset(strSql)IfNotrsSend.EOFThenSetobjGsmOut=NewASmsCtrl.GsmOutSetobjConstants=NewASmsCtrl.ConstantsobjGsmOut.ActivateSERIAL_NUMBERobjGsmOut.device=cmbPORT.TextobjGsmOut.DeviceSpeed=0objGsmOut.RequestStatusReport=FalseobjGsmOut.MessageType=objConstants.asMESSAGETYPE_TEXT_MULTIPARTDoWhileNotrsSend.EOF'ganti prefix nomor hp 0 -> +62phoneNumber=rep0to62(""&rsSend("phone_number").Value)keyword=rsSend("sms_keyword").ValuesmsBalasan=getBalasanSms(keyword,phoneNumber)objGsmOut.MessageRecipient=phoneNumberobjGsmOut.MessageData=smsBalasanobjGsmOut.SendIfobjGsmOut.LastError=0OrobjGsmOut.LastError=23140Then'sms sukses dikirim'update status sms -> 1strSql="UPDATE sms_in SET status = ?, no_ref = ? "&_"WHERE id = ?"Setcmd=conn.CreateCommand(strSql)Withcmd.SetInt321,1.SetInt322,objGsmOut.MessageReference.SetInt323,rsSend("id").Value.ExecuteEndWithSetcmd=Nothing'insert ke tabel sms_out, untuk histori sms keluarstrSql="INSERT INTO sms_out (phone_number, replay_msg, date_out, time_out) VALUES (?, ?, ?, ?)"Setcmd=conn.CreateCommand(strSql)Withcmd.SetText1,phoneNumber.SetText2,smsBalasan.SetDate3,Format(Now,"yyyy/MM/dd").SetTime4,Format(Now,"hh:mm:ss").ExecuteEndWithSetcmd=NothingElse'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 1strSql="UPDATE sms_in SET status = ?, no_ref = ? "&_"WHERE id = ?"Setcmd=conn.CreateCommand(strSql)Withcmd.SetInt321,1.SetInt322,objGsmOut.MessageReference.SetInt323,rsSend("id").Value.ExecuteEndWithSetcmd=NothingEndIfCallWait(5000)rsSend.MoveNextLoopSetobjConstants=NothingSetobjGsmOut=NothingEndIfExitSuberrHandle:ResumeNextEndSub
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.
123456
PublicFunctionrep0to62(ByValphoneNumberAsString)AsString'fungsi untuk mengganti prefix 0 -> +62rep0to62=phoneNumberIfLeft(phoneNumber,1)="0"Thenrep0to62="+62"&Right(phoneNumber,Len(phoneNumber)-1)EndFunction
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.
PublicFunctiongetBalasanSms(ByValkeywordSmsAsString,ByValphoneNumberAsString)AsStringDimrsAscRecordsetDimparam1AsStringDimarrKeyword()AsStringDimprefixAsStringDimnilaiAsStringDimnamaAsStringDimthaAsStringDimsemesterAsStringIfLen(keywordSms)>0ThenIfInStr(1,keywordSms,"#")>0Then'karakter # -> separator keywordarrKeyword=Split(keywordSms,"#")IfNot(Len(arrKeyword(0))>0)ThengetBalasanSms="Keyword sms salah"ExitFunctionElse'do nothingEndIfElseReDimarrKeyword(0)arrKeyword(0)=keywordSmsEndIfElsegetBalasanSms="Keyword sms salah"ExitFunctionEndIfprefix=arrKeyword(0)prefix=UCase$(prefix)IfUBound(arrKeyword)>0Thenparam1=arrKeyword(1)'untuk contoh disini param1 bernilai nomor induk siswa'untuk pengembangan lebih lanjut tahun ajaran dan semester dibuat settingan tersendiritha="2009/2010"semester=2SelectCaseprefixCase"TGS"'validasi nis siswaIfNotisValidNIS(param1)ThengetBalasanSms=Replace(NIS_SALAH,"<nis>",param1):ExitFunction'validasinohpsiswa'nama sekolah sebaiknya disimpan didalam variabelIfNotisValidHPSiswa(param1,phoneNumber)ThengetBalasanSms=Replace(HP_UNREG,"<nama_sekolah>","SMA Negeri Yogyakarta")getBalasanSms=Replace(getBalasanSms,"<no_hp>",phoneNumber):ExitFunctionEndIfstrSql="SELECT UPPER(nama) FROM siswa WHERE nis = '"¶m1&"'"nama=CStr(dbGetValue(strSql,""))'mulai proses pencarian nilaistrSql="SELECT matapelajaran_kode, nilai "&_"FROM nilai_tugas "&_"WHERE siswa_nis = '"¶m1&"' AND tahun_ajaran = '"&tha&"' AND semester = "&semester&" "&_"ORDER BY matapelajaran_kode"Setrs=conn.OpenRecordset(strSql)IfNotrs.EOFThenDoWhileNotrs.EOFnilai=nilai&rs("matapelajaran_kode").Value&"="&rs("nilai").Value&", "rs.MoveNextLoopEndIfIfLen(nilai)>0Thennilai=Left(nilai,Len(nilai)-2)getBalasanSms="Nilai tugas ("&nama&") : "&nilaiElsegetBalasanSms="Nilai tugas ("&nama&") sedang dalam proses pendataan"EndIfCase"UH"'validasi nis siswaIfNotisValidNIS(param1)ThengetBalasanSms=Replace(NIS_SALAH,"<nis>",param1):ExitFunction'validasinohpsiswa'nama sekolah sebaiknya disimpan didalam variabelIfNotisValidHPSiswa(param1,phoneNumber)ThengetBalasanSms=Replace(HP_UNREG,"<nama_sekolah>","SMA Negeri Yogyakarta")getBalasanSms=Replace(getBalasanSms,"<no_hp>",phoneNumber):ExitFunctionEndIfstrSql="SELECT UPPER(nama) FROM siswa WHERE nis = '"¶m1&"'"nama=CStr(dbGetValue(strSql,""))'mulai proses pencarian nilaistrSql="SELECT matapelajaran_kode, nilai "&_"FROM nilai_ulangan "&_"WHERE siswa_nis = '"¶m1&"' AND tahun_ajaran = '"&tha&"' AND semester = "&semester&" "&_"ORDER BY matapelajaran_kode"Setrs=conn.OpenRecordset(strSql)IfNotrs.EOFThenDoWhileNotrs.EOFnilai=nilai&rs("matapelajaran_kode").Value&"="&rs("nilai").Value&", "rs.MoveNextLoopEndIfIfLen(nilai)>0Thennilai=Left(nilai,Len(nilai)-2)getBalasanSms="Nilai ulangan ("&nama&") : "&nilaiElsegetBalasanSms="Nilai ulangan ("&nama&") sedang dalam proses pendataan"EndIfCaseElsegetBalasanSms="Keyword sms salah"EndSelectEndFunction
Untuk mengetahui daftar hp/modem apa saja yang didukung, jangan sungkan dan malu-malu untuk mengklik link ini.