Membuat Software Autoreply SMS dengan Delphi

Yang pada mau bikin software autoreply SMS dengan Delphi, yuk kita belajar bareng. Kegunaan sistem autoreply ini ada banyak sekali tergantung implementasinya, tapi intinya adalah untuk memberikan respon secepat mungkin kepada pengirim SMS  sesuai dengan keyword SMS yang diberikan. Pada artikel kali ini saya ingin member contoh, bagaimana membuat software autoreply SMS, yang fungsinya memudahkan pemilik kendaraan bermotor yang ingin mengetahui kapan masa berlaku STNK-nya habis. Cukup dengan mengirimkan keyword nomor polisi STNK Anda ke nomor hotline SMS, maka Anda akan langsung mendapat reply masa berlaku STNK Anda.

Siapkan database MySQL dengan nama ‘dbnopol’ dan tabel dengan nama ‘tabnopol’. Define tabel ‘tabnopol’ dengan  dua field, yakni ‘nopol’ dan ‘deadline’. Field ‘nopol’ nanti akan kita isi dengan nomor-nomor STNK dan field ‘deadline’ akan berisi data masa berlakunya. Intinya, tabel ‘tabnopol’ akan menyimpan seluruh data nomor polisi/STNK beserta masa berlakunya. Bagaimana cara instalasi database MySQL dan koneksinya dengan Delphi, dapat Anda baca disini.

Sebelum kita membuat sebuah program, alangkah baiknya jika mendefinisikan fungsi/tujuan dibuatnya program ini. Kira-kira program yang nanti kita buat, fungsinya adalah “Jika ada SMS masuk dengan keyword tertentu, ceklah di database ‘dbnopol’. Jika ada data yang dimaksud, reply data tersebut kepada pengirim SMS’. Kalau statement ini kita buat flowchart-nya, kurang lebih seperti pada gambar di bawah.

flowchart autoreply sms

Mari kita coba implementasikan flowchart di atas dalam program Delphi. Buat form baru, dan siapkan komponen beserta properties-nya sebagai berikut :

Component Properties Value
Button1 Caption Setting
Button2 Caption Open COM
Button3 Caption Open db
Memo1
Comport1
DBGrid1 DataSource DataSource1
DBNavigator1 DataSource DataSource1
ZConnection1 Database dbnopol
Protocol Mysql-5
Hostname localhost
User root
ZQuery1 Connection ZConnection1
SQL Select * from tabnopol
DataSource1 DataSet DataSource1

Atur tata letak komponen seperti pada gambar di bawah:

Kemudian masukkan source code berikut, berturut-turut untuk button1, button2 dan button3

procedure TForm1.Button1Click(Sender: TObject);
begin
 comport1.ShowSetupDialog;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if ComPort1.Connected then
 begin
  ComPort1.Close;
  button2.Caption:='Open';
 end
 else
 begin
  ComPort1.Open;
  button2.Caption:='Close';
  ComPort1.WriteStr('at+cmgf=1'+#13#10);
  ComPort1.WriteStr('at+cpms="SM"'+#13#10);
  ComPort1.WriteStr('at+cscs="GSM"'+#13#10);
  ComPort1.WriteStr('at+cnmi=1,1,2,1,0'+#13);
 end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 zquery1.Open;
end;

Button1 berfungsi untuk pengaturan parameter serial (COM) port, Button2 berguna untuk inisialisasi koneksi dengan modem/handphone melalui virtual serial port dan Button3 adalah untuk membuka koneksi dengan database MySQL.
Kemudian masukkan source code berikut di event OnRxChar milik komponen ComPort1. Source code ini berfungsi untuk handling event SMS masuk dan keluar.

procedureTForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
varStr: String;
begin
 memo1.clear;ComPort1.ReadStr(Str, Count);
 Memo1.Text := Memo1.Text + Str;
end; 

Dan terakhir, masukkan source code berikut ke dalam event OnChange milik komponen Memo1. Source code inilah yang sebenarnya berfungsi sebagai program utama dalam program autoreply SMS ini.

procedure TForm1.Memo1Change(Sender: TObject);
var a,b,c,d:integer;kar_awal,kar_akhir:integer;
    s,status,pengirim,tanggal,waktu,isi:string;
begin
 a:=pos ('+CMTI',memo1.Text);
 if  a <> 0 then
 begin
  b:=posex (',',memo1.Text,a+1);
  c:=posex (#13#10,memo1.Text,b+1);
  s:=copy (memo1.Text,b+1,c-b-1);
  ComPort1.WriteStr('at+cmgr='+s+#13#10);
 end;

 d:=pos ('+CMGR',memo1.Text);
 if  d <> 0 then
 begin
  kar_awal:=pos ('"',memo1.Text);
  kar_akhir:=posex ('"',memo1.Text,kar_awal+1);
  status:=copy(memo1.Text,kar_awal+1,kar_akhir-kar_awal-1);
  
  kar_awal:=posex ('"',memo1.Text,kar_akhir+1);
  kar_akhir:=posex ('"',memo1.Text,kar_awal+1);
  pengirim:=copy(memo1.Text,kar_awal+1,kar_akhir-kar_awal-1);

  kar_awal:=posex ('"',memo1.Text,kar_akhir+1);
  kar_akhir:=posex (',',memo1.Text,kar_awal+1);
  tanggal:=copy(memo1.Text,kar_awal+1,kar_akhir-kar_awal-1);

  kar_awal:=kar_akhir;
  kar_akhir:=posex ('"',memo1.Text,kar_awal+1);
  waktu:=copy(memo1.Text,kar_awal+1,kar_akhir-kar_awal-1);
  
  kar_awal:=posex (#13#10,memo1.Text,kar_akhir+1);
  kar_akhir:=posex (#13#10,memo1.Text,kar_awal+1);
  isi:=copy(memo1.Text,kar_awal+2,kar_akhir-kar_awal-2);
  
  zquery1.SQL.Text:='select deadline from tabnopol where nopol="'+isi+'"';
  zquery1.ExecSQL;
  zquery1.Open;
  zquery1.Refresh;

  try
   ComPort1.WriteStr('at+cmgs="'+pengirim+'"'+#13#10);
   ComPort1.WriteStr(zquery1.FieldValues['deadline']);
   ComPort1.WriteStr(#26);
  except
   on E: Evarianttypecasterror do

  begin
   ComPort1.WriteStr('at+cmgs="'+pengirim+'"'+#13#10);
   ComPort1.WriteStr('Maaf nopol Anda tidak terdaftar');
   ComPort1.WriteStr(#26);
  end;
end;
end;
end;

Penjelasan source code di atas :

Potongan kode di bawah dimaksudkan untuk mengetahui jika ada SMS masuk yang diindikasikan dengan munculnya karakter ‘+CMTI’

a:=pos ('+CMTI',memo1.Text);
if  a <> 0 then
begin
 b:=posex (',',memo1.Text,a+1);
 c:=posex (#13#10,memo1.Text,b+1);
 s:=copy (memo1.Text,b+1,c-b-1);
 ComPort1.WriteStr('at+cmgr='+s+#13#10);
end;

Potongan kode di bawah dimaksudkan untuk me-‘render’ informasi yang ada dalam SMS yang masuk ke modem/handphone. Informasi yang bisa didapatkan antara lain : status SMS, nomor pengirim, tanggal dan waktu diterima SMS, dan yang terakhir adalah isi SMS itu sendiri.

d:=pos ('+CMGR',memo1.Text);if  d <> 0 then
begin
 kar_awal:=pos ('"',memo1.Text);
 kar_akhir:=posex ('"',memo1.Text,kar_awal+1);
 status:=copy(memo1.Text,kar_awal+1,kar_akhir-kar_awal-1); 

 kar_awal:=posex ('"',memo1.Text,kar_akhir+1);
 kar_akhir:=posex ('"',memo1.Text,kar_awal+1);
 pengirim:=copy(memo1.Text,kar_awal+1,kar_akhir-kar_awal-1);

 kar_awal:=posex ('"',memo1.Text,kar_akhir+1);
 kar_akhir:=posex (',',memo1.Text,kar_awal+1);
 tanggal:=copy(memo1.Text,kar_awal+1,kar_akhir-kar_awal-1);

 kar_awal:=kar_akhir;
 kar_akhir:=posex ('"',memo1.Text,kar_awal+1);
 waktu:=copy(memo1.Text,kar_awal+1,kar_akhir-kar_awal-1);

 kar_awal:=posex (#13#10,memo1.Text,kar_akhir+1);
 kar_akhir:=posex (#13#10,memo1.Text,kar_awal+1);
 isi:=copy(memo1.Text,kar_awal+2,kar_akhir-kar_awal-2);

Kalau yang ini, Anda tentunya sudah bisa menduganya sendiri, kan? Potongan source kode di bawah dimaksudkan untuk mengecek apakah keyword SMS sesuai dengan data di database atau tidak. Jika ada data yang dimaksud akan di-reply data masa berlaku nopol STNK, sedang jika tidak ada data yang dimaksud akan di-reply ‘Maaf nopol Anda tidak terdaftar’.

zquery1.SQL.Text:='select deadline from tabnopol where nopol="'+isi+'"';
zquery1.ExecSQL;zquery1.Open;
zquery1.Refresh;
try
 ComPort1.WriteStr('at+cmgs="'+pengirim+'"'+#13#10);
 ComPort1.WriteStr(zquery1.FieldValues['deadline']);
 ComPort1.WriteStr(#26);

except
on E: Evarianttypecasterror do

begin
 ComPort1.WriteStr('at+cmgs="'+pengirim+'"'+#13#10);
 ComPort1.WriteStr('Maaf nopol Anda tidak terdaftar');
 ComPort1.WriteStr(#26);
end;

end;

Running-lah program yang telah Anda buat tadi, dan coba koneksikan dengan modem yang terhubung ke computer dengan menekan tombol ‘Setting’ dan ‘Open COM’. Jangan lupa tekan tombol ‘Open db’ untuk membuka koneksi dengan database MySQL. Jika program Anda benar, seharusnya akan muncul tampilan sebagai berikut.

Keterangan : untuk data tabel di atas diisi secara manual, untuk percobaan (misal: nopol K7777JB, deadline 7/30/2011).

Sekarang coba Anda SMS dengan isi SMS ‘K7777JB’ ke nomor ‘hotline’ (nomor di dalam modem yang terhubung computer), dan perhatikan apakah Anda sudah mendapat reply dari nomor hotline. Coba variasikan isi SMS dengan keyword lain, untuk menguji program ini.

Jika ada yang ingin didiskusikan, bisa mengisi komentar di bawah. Kalo ada yang mau pesan program sama saya juga boleh 🙂 Happy programming 🙂

0 0 votes
Article Rating

Leave a Reply

89 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
UDE

Mas Ajie kalau saya mo minta source prog nya geimana atau prog nya sudah di buat buku ?

senthot

mas.. sy udah buat seperti dscript di atas. tapi ndak isa reply. setiap abis terima sms. bisa kebaca tapi pas ngirim balik tidak ada pesen error atau apa. trims.

hilmi

kalau bikin script kirim smsnya terpisah dengan menaruhnya di tombol tersendiri bukannya sama saja dong mas proses kirim dengan cara manual? bukan secara autoreply. jelasin dong mas maksudnya gimana.

telingabulan

mas, pada command ‘at+cpms=”SM”‘+#13#10 dan ‘at+cscs=”GSM”‘+#13#10 terjadi error. apakah penulisan saya salah? terimakasih.

jay

slamat mlem mas. .
mas,sya udah coba program di atas, tapi ketika ada sms masuk bkannya langsung di reply tapi malah kluar pesan source file not found:ZsqlStrings.pas. .
slahnya di mana mas ya,mohon bantuannya. .
terima kasih. .

jay

pgi mas,klo mslah yg d atas udh bsa d atasi tp skrg mslahnya, ktika sms masuk mlah ada tulisan error d memonya,,knp mas ya?
mhon bntuannya. .
terima kasih. .

jay

sore mas. .
sebelumnya,saya minta maaf ya kalo banyak bertanya. .
yang mau sya tanyain,ketika ada pesan masuk tetapi isi pesannya tidak sesuai yg ditentukan, kan harusnya mengirim pesan kalo data yg diminta tidak ada ke pengirim, tapi di program yang sya buat mlah muncul pesan kesalahan seperti ini :
project project1.exe raised exception class EvariantTypeCasterror with message ‘could not convert variant of type (null) into type (string)’.
padahal klo sms yg msuk sesuai dan data yang diminta ada d database,langsung mengirim data yang diminta. .
mohon pencerahannya. .
terima kasih. .

jay

slmat sore mas, , ,
udah pke exception kyk di contoh artikel yang mas bkin tp tetp aj seperti itu salahnya mas. .
kira2 knp ya mas?

Edwin

program ini pake Delphi versi brp.?

Kurniawan

Maaf Mas aji, saya mau nanya…
Field nopol dan deadline apa type nya?

Beri

mas, ijin tanya ni, saya coba buat scriptnya, tpi pas di run ada errornya. keterangan errornya [Error] USMS.pas(91): Undeclared identifier: ‘posex’
itu kenapa ya mas…mohon petunjuknya, thanks!

Beri

Ok, sudah bisa mas…!
mantap, thanks ilmunya ni mas. insya Allah berkah…he..he..he.

hilmi

mas aji, saya sudah coba membuat programnya berdasarkan source code yg mas tuliskan dan sudah berhasil jalan programnya. tapi ketika saya coba mengirimkan sms, program hanya bisa membaca smsnya saja tapi saya tidak mendapatkan balasan smsnya. kira-kira kenapa ya mas?

budi

mas posex yang ditulis discript itu fungsinya untuk apa ya?

kurniawan

Mas…apa modem Wavecom bisa?

kurniawan

Ok, segera saya coba, nanti klo ada kendala mohon dibantu ya bang…

cun

mas ajie, saya mw bertanya, ad sedikit masalah ketika auto replynya,
ketika pesan sudah dibaca dan dipisah2 kan, kemudian proses mengirimnya gagal, padahal saya yakin program untuk mengirimnya nya dah jlan, ap ad masalah dengan modem yang tidak bisa mengirim langsung setelah menerima, tq

Zulfahmi Alif Abdi

Asslmlkum mas aji,,
ini karakter yang dibaca hape saya untuk variabel isi . . .

Ä%Ífƒ

kenapa bisa begitu ya mas . .??
adakah cara menanggulanginya???
trims

Zulfahmi Alif Abdi

kalo ndak keberatan , kasi tau cara capture nya dong mas . . .biar karakter nya bisa normal lagi . . .

terima kasih sebelumnya mas

itonk

bang ane mw tx pass ane jln kn program d tkn tmbol opencom qo ad error y…??’unable to open com port (win error code:2)’…

john

mas mw share ne kenapa pas saya kirim sms ad error ‘tabel unknown’ pada sql-nya??

guz

mas ajie…mhon bntuannya……….untuk sms auto forward….source codenya gmn………

jawabannya ditunggu segera…….
terimakasih sblumnya

guz

sy udah punya bukunya….tapi sy seidkit bingung,,,krn saat running…proogram tidak meneruskan sms ke nomor yg sudah ditentukan……

gmn ya???

guz

mas ajie.,….sy udah temuin kesalahan saya….programnya udah running……

Nah..sy maw nanya…bisa gak, kalau auto reply dan auto forward…disatukan dalam satu source code…jadi…logika nya//
program …akan menforward sms jika benar…tpi salah akan merply kenomor user…

tolong bantuinnya ya,,,massssss…Urgentt..
terimakasih seblumnya atas bantuannya..>

fahmi

misi mas,saya ingin menanyakan,saya udah ikutin tutorialnya tapi ada kendala pas di compile, malah muncul notif Error : Undeclared identifier : “posex” padahal udah di pasang di interfacenya StrUtils, saya menggunakan Delphi 6 mas, mohon bantuannya?

fahmi

Mas saya udah install delphi 7 nya nih, dan sudah bisa.
tapi bagaimana ya untuk ngebaca pas di bales autoreply ada notifikasi sms terkirim ?

Saya dapat caranya kaya gini
AT+CSMP = 49,167,0,242
AT+CNMI = 1,0,0,1,0

terus pas di coba hasilnya kaya gini mas :
+CMGS: 54
+CDSI: “SR”,53

Mohon bantuannya ya

cadexs

mas setelah saya coba run terjadi error unable to open com port (error 5) solusinya bagaimana…
makasih sebelumnya

Singgih

Kasus yang sama, cuma saya lebih beruntung, karena kadang mau konek tapi kadang tidak konek padahal tidak ada software yang memakai port modem, sepertinya tidak ada conflik. Emmm ndak tahu juga kalau ada software yang tidak dapat saya deteksi, caranya bagaimana bang untuk mendeteksi software tersembunyi tersebut?

coe

sama nih mentog disini,,,project1.exe raised exception class EvariantTypeCasterror with message ‘could not convert variant of type (null) into type (string)’.

udah plototin script dr mas ajie berjam-jam gak ada yg beda alias disamain sepersisnya,masih kendalanya sama huftt,,,mohon pencerahaannya mas ajie,,
apakah script diatas husus utk sql,saya pake access databse nya dan koneksinya mnggunakan adoconnection dan adoquery,berjalan normal kalo cek yg ada di database,tp kl yg tdk ada mncul error ky diatas,,bingung

Yatna

Mas kalau sms yang masuk tidak muncul di TMemo kenapa ya tp malah masuk di inbox modem? Padahal semua koneksi sudah OK (baik modem dan database), saya coba tambahkan fitur kirim sms manual dari PC ke ponsel tujuan sudah berfungsi dengan baik.

ghani

mas, ini pake gammu jg ga mas?trus kalo pake modem smartfren bs juga kah?
makasih sebelumnya mas

mulyo

langsung aja nih ga bisa banyak basa basi pengen iku gabung untuk belajar apa bisa di terima …terima kasih

rendy

mas.. koq setelah saya kirim pesan,, malah mncul
error data kosong di bagian untuk mengirim pesan..
pada data tersebut sudah saya isi di database..
sama percis seperti yang di atas..
zquery1.SQL.Text:=’select * from lampu where kode_lampu=”’+isi+””;
zquery1.ExecSQL;
zquery1.Open;
zquery1.Refresh;

try
ComPort1.WriteStr(‘at+cmgs=”‘+pengirim+'”‘+#13#10);
ComPort1.WriteStr(zquery1.FieldValues[‘pesan’]);
ComPort1.WriteStr(#26);

nah di fieldValues[pesan] nya itu selalu muncul pesan error kalau data nya ksosong.

rendy

untuk masalah di atas sudah selesai,.
kalau boleh tau saya run aplikasi ini,, bleh gx saya run juga modem nya ? karena kalau tidak seperti tidak ada respon dari modem.

engkab

mas mau tanya,kalau membuat autoreply menggunakan accsess bagaimana merubah listingnya..

efendi

setiap pesan masuk, sistem akan muncul error invalid column name ‘K7770JB”
saya mengunakan adoquery dan adoconnection

efendi

masalah invalid column name sudah di atasi,
pak,saya ingin bereksperimen, jika dia buat reg (spasi) nopol, bagaimana caranya ?
terima kasih,

efendi

could not convert variant of type(null) into type (string) , ini kenapa ya mas ? kok pada saat saya mencoba mengirim format ya salah maka akan muncul error ini.

efendi

sudah saya coba dan mengunakan function if, tetap tidak bisa.
kalau logika program jika format pesan = salah maka sistem akan mengirim sms yang berisi bahwa format salah.
setiap error itu terjadi, malah modem tidak ke detect, gmana solusinya tanpa harus menrestart sistem operasi agar modem bs di deteksi kembali ? terima kasih, maaf kalau banyak bertanya.

alif mukti arifuddin

mas.. sy udah buat seperti dscript di atas. tapi ndak isa reply. setiap habis terima sms. bisa kebaca tapi pas ngirim balik tidak ada pesen error atau apa. kesalahannya dimana ya mas. terima kasih

Fangky Suwito

selamat pagi mas. gini mas sy mau bertanya di buku “membuat sms gateway dengan delphi 7” ada dibahas tentang sms autoreply cek nomor STNK. dalam materi tersebut dibahas hanya untuk satu eksekusi dengan mengirim format no STNK. nah jika sy menambahkan format registrasi pelanggan. nah di bagian memochange di sisipkan koding untuk format No STNK. untuk format Reg pelanggan disisipkan dimana mas? karna klo untuk format No STNK hanya 1 kali eksekusi. sy sdh buatkan koding untuk regis pelanggannya. mohon pencerahannya mas. Terima Kasih.

rizkiana

mas tanya, saya kan membuat sms autoreplay dan sms kurangi stok dalam satu form gimana caranya agar saya bisa mengakses dua-duanya soalnya bisanya cuma 1 proses.
contoh : saya kirim SMS ke modem format (Jual#KD001#10) terus aku parse ke edit dan terus simpan untuk update stok. terus saya kirim SMS lagi dengan format (KD001) baut ngecek stok. biar semuanya jalan source code nya gimana mas. apa dikasih kondisi IF then else.?

rizkiana

kalau if pos(“KD001”,memo1.text)0 untuk “KD001” itu kan beda-beda mas sesuai dengan kode barang yang akan di lihat jumlah stoknya. . gimana caranya mas agar “KD001” sesuai dengan yang di smsin ke sistem.?

rizkiana

mas, maaf mau tanya lagi. setiap mau ngirim mbalik ke pengirim kenapa selalu eror di FormUtama.ComPort1.WriteStr(dm.mySQLbarang.FieldValues[‘stok’]);. kenapa ya mas. .
contoh : Stok.KD001 kemudian aku parse ke edit. edit1.text: stok, edit2.text:KD001.
if pos(‘Stok’,memo1.Text)0 then
begin
dm.mySQLbarang.SQL.Text:=’select stok from tb_barang where kode_barang=”‘+QuotedStr(sEdit2.Text)+'”‘;
dm.mySQLbarang.ExecSQL;
dm.mySQLbarang.Open;
dm.mySQLbarang.Refresh;
try
FormUtama.ComPort1.WriteStr(‘at+cmgs=”‘+pengirim+'”‘+#13#10);
FormUtama.ComPort1.WriteStr(dm.mySQLbarang.FieldValues[‘stok’]);
FormUtama.ComPort1.WriteStr(#26);
syntax di atas mana yang salah ya mas, tipa kali mau ngirim ulang masti error. . mohon pencerahan.

rizkiana

could not convert variant of type(null) into type (string) . .
tipe data stok double mas.

Alief

mohon maaf mas, mau tanya lagi
1. 1 comport digunakan untuk beberapa proses dan berbeda form bisa enggax mas?
2. maksud dari ComPort1.WriteStr(‘at+cnmi=1,1,2,1,0’+#13) ; ComPort1.WriteStr(‘at+cnmi=1,1,0,0,0’+#13#10); mas.?

mukti arif

perintah ini (if FormUtama.ComPort1.Connected then dst ) kan saya taruh di form show mas, saat saya akan masuk form tersebut di memo nya kok kadang muncul tulisan ini > at+cmgf=1at+cpms=”SM”at+cscs=”GSM”at+cnmi=1,1,2,1,0at+cnmi=1,1,0,0,0 (tidak bisa menerima sms) dan kadang muncul at+cmgf=1 OK (dapat menerima sms). itu yang salah dimana ya mas.?

alief mukti

mas, kenapa ya kok kadang2 bisa di parse smsnya dan kadang2 enggax bisa di parse sms nya.? kesalahan nya dimana ya mas. .

rizkiana

padahal di dalam database ada datanya mas, tapi pas mau ngirim auto reply eror di bagian itu terus. . solusinya apa ya mas.?
tapi pas WHERE `tb_barang`.`kode_barang`=’+QuotedStr(sEdit1.Text); diganti WHERE `tb_barang`.`kode_barang`=”‘+isi+'”‘; bisa autoreply mas. . gimana ya mas solusinya.? tinggal ini aja mas yang belum bisa-bisa. .

Muhammad Mukhrodi

mas itu kok nmr hp nya nggak berubah jadi nama pengirim cara ngubahnya gimana itu mas?

89
0
Would love your thoughts, please comment.x
()
x