Terkadang sistem yang kita inginkan membutuhkan respon yang cepat begitu ada SMS masuk. Sistem ini biasanya terdapat pada sistem kontroler berbasis SMS. Contoh mudahnya, bila kita ingin menghidupkan atau mematikan mobil/motor menggunakan SMS tentunya saat itu juga mobil/motor kita harus hidup/mati sesuai isi SMS. Nah, sesuai ilustrasi yang saya berikan, untuk sistem ini paling cocok menggunakan teknik ‘live/real time’ dalam proses handling SMS yang masuk. Jadi begitu ada SMS masuk, SMS tersebut langsung diproses, dibaca isinya, dicocokkan dengan keyword yang sudah kita tentukan dan langsung take action sesuai dengan kata kunci.
Berikut ini adalah tutorial sederhana tentang bagaimana caranya melakukan handling SMS yang masuk dengan cara ‘live’, menggunakan program Delphi. Untuk teknik membaca SMS dengan cara polling dapat Anda baca pada artikel saya sebelumnya. Program ini ditulis menggunakan bahasa Delphi 7, komponen untuk handling SMS yang digunakan adalah CPORT (versi 310) dan modem yang digunakan adalah merk SpeedUp 8100 (USB modem 3G/HSDPA). Mengapa saya memilih modem 3G ketimbang modem GPRS atau handphone, dapat Anda baca – baca di artikel terdahulu.
Baiklah, sekarang mari kita coba membuat program sederhana untuk proses handling SMS secara live. Program ini akan menyalakan LED virtual (ComLED) jika SMS berisi keyword ‘LED ON’ dan akan mematikan LED jika keyword SMS adalah ‘LED OFF’. Dari contoh program ini saya harapkan dapat lebih memantapkan pemahaman Anda tentang teknik handling SMS secara ‘live’ dan dapat membandingkannya dengan teknik ‘polling’.
Buatlah project baru dalam Delphi 7, kemudian ambil komponen Button (2 buah), Memo (1 buah),  ComPort (1 buah) dan komponen ComLED (1 buah). Aturlah komponen – komponen tersebut ke dalam form hingga tampilannya seperti pada gambar di bawah.
Sebelumnya,tambahkan script berikut untuk handling data serial yang masuk melalui ComPort di event OnRxchar
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
memo1.clear;
ComPort1.ReadStr(Str, Count);
Memo1.Text := Memo1.Text + Str;
end;
Kemudian double click tombol yang bertuliskan ‘Setting’ dan isikan dengan baris program sebagai berikut:
procedure TForm1.Button1Click(Sender: TObject);
begin
comport1.ShowSetupDialog;
end;
Baris program comport1.ShowSetupDialog; adalah untuk menampilkan jendela pengaturan modem meliputi nomor COM port, baudarate, flow control, parity dan start – stop bits secara runtime. Mengenai identifikasi nomor COM port dari USB modem dapat Anda pelajari pada artikel saya terdahulu.
Double click tombol tulisan ‘Open’ dan isikan baris program sebagai berikut :
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);
end;
end;
Baris program di atas digunakan untuk membuka koneksi dengan modem (ComPort1.Open;) dan sekaligus untuk melakukan inisialisasi modem ke mode teks (ComPort1.WriteStr(‘at+cmgf=1’+#13#10); ), mengatur memori penyimpanan SMS di Simcard (ComPort1.WriteStr(‘at+cpms=”SM”‘+#13#10);) dan mengatur karakter set ke ‘GSM’ agar bisa terbaca oleh kita (ComPort1.WriteStr(‘at+cscs=”GSM”‘+#13#10);).
Kemudian double click komponen memo hingga Anda masuk ke event memochange, dan isikan beberapa baris program sebagai berikut :
procedure TForm1.Memo1Change(Sender: TObject);
var a,b,c,d,e:integer;
s: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
if posex (‘LED ON’,memo1.Text,d+1) <> 0 then ComLed1.State:=LsOn;
if posex (‘LED OFF’,memo1.Text,d+1) <> 0 then ComLed1.State:=LsOff;
end;
end;
Sebelumnya tambahkan unit StrUtils, dideklarasi unit (di bawah interface), karena function posex berada dalam unit StrUtils
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, CPort, CPortCtl, StrUtils;
Baris program dalam event memochange inilah sebenarnya inti dari program terima dan baca SMS secara real time, karena begitu ada SMS masuk (diindikasikan dengan unsolicited code ‘+CMTI’), data dari COM Port akan masuk ke kotak memo melalui komponen CPORT, dan begitu kotak memo berubah datanya (berubah=change), maka event OnChange (memochange) akan ter-trigger dan akan mengeksekusi baris program yang ada di dalamnya. Berikut ini adalah flowchart dan penjelasan dari program yang ada di event memochange
Berikut ini adalah implementasi flowchart di atas dalam bentuk program:
Ada SMS masuk ? (point 1). Jika ada SMS masuk, indikatornya adalah +CMTI:”SM”,0 akan muncul di kotak memo, dengan ‘+CMTI’ adalah unsolicited code jika ada SMS masuk, ‘SM’ menunjukkan SMS ada di Simcard, dan ‘0’ menunjukkan indeks memori nomor ‘0’ di SIMcard. Baris programnya adalah a:=pos (‘+CMTI’,memo1.Text);
Baca SMS-nya (point 2). Untuk membaca isi SMS, kita harus tahu di indeks berapa SMS itu berada. Caranya adalah mencari indeks tersebut setelah karakter ‘SM’ tadi (contoh di bawah, indeks SMS akan disimpan di variable string ‘s’).
b:=posex (‘,’,memo1.Text,a+1);
c:=posex (#13#10,memo1.Text,b+1);
s:=copy (memo1.Text,b+1,c-b-1);
Catatan : penjelasan mengenai sintaks function ‘pos’ dan ‘posex’ dapat Anda baca di menu ‘Help’ Delphi (inti dari function ini adalah untuk mencari karakter tertentu dalam variabel string)
Dan begitu indeks SMS di dapat, langsung dibaca isinya menggunakan at command ‘at+cmgr=indeks’. Baris programnya adalah : ComPort1.WriteStr(‘at+cmgr=’+s+#13#10);
Baca keyword (point 3 s/d 6). Setelah isi SMS berhasil dibaca, langkah selanjutnya adalah mencocokkan keyword yang sudah ditentukan, yakni jika isi SMS adalah ‘LED ON’ akan menghidupkan Led, dan jika   keyword adalah ‘LED OFF’ akan mematikan Led. Berikut adalah baris programnya.
d:=pos (‘+CMGR’,memo1.Text);
if d <> 0 then
begin
if posex (‘LED ON’,memo1.Text,d+1) <> 0 then ComLed1.State:=LsOn;
if posex (‘LED OFF’,memo1.Text,d+1) <> 0 then ComLed1.State:=LsOff;
end;
Setelah itu cobalah running program yang telah Anda buat tadi, dan lihatlah hasilnya. Setelah Anda setting modem (klik tombol ‘Setting’) dan buka koneksinya (klik tombol Open), cobalah mengirim SMS dengan keyword ‘LED ON’ ke nomor yang ada di dalm modem. Perhatikan apakah LED di atas kotak memo menyala atau tidak. Dan jika Anda mengirim SMS ‘LED OFF’, harusnya LED akan padam.
Demikian sedikit tutorial singkat tentang handling SMS dengan Delphi, semoga ada manfaatnya buat Anda. Jika ada pertanyaan bisa mengisi komentar di bawah atau hubungi saya di YM:saptaji2011 atau email: [email protected]
a Technopreneur – writer – Enthusiastic about learning AI, IoT, Robotics, Raspberry Pi, Arduino, ESP8266, Delphi, Python, Javascript, PHP, etc. Founder of startup Indomaker.com
maaf maz _
kl misalkan mw menghubungkan langsung pada hardwarenya “LED beneran” gimana maz ?
bisa menggunakan paralel port utk menghidupkan led. utk dasar2 interfacing paralel port bisa dibaca-baca di sini.
maaf mas, saya tanya lagi,
saya sudah mengikuti langkah demi langkah seperti di atas
waktu saya run ..
saya tekan setting, lalu tekan open
di memo keluar tulisan OK
tetapi saat saya coba kirim sms ke nomer yg saya gunakan di modem
memo tiba tiba kosong dan tidak muncul apa apa setelah saya tunggu 5 menit
bagaimana solusinya ?
coba baris program ini dihilangkan dulu
d:=pos (‘+CMGR’,memo1.Text);
if d 0 then
begin
if posex (‘LED ON’,memo1.Text,d+1) 0 then ComLed1.State:=LsOn;
if posex (‘LED OFF’,memo1.Text,d+1) 0 then ComLed1.State:=LsOff;
end;
hasilnya apa?
Wah, bagus bgt tutorial na mas, sangat membantu, terus berkarya. hehe.. 😀
Gan, mau tanya nie,…
Gmana ya mesisahkan isi pesan dan nomor pengirim nya?
Agar bisa di simpan di Database secara terpisah antara isi pesan dan SMS…. 😀
Mohon pencerahan na gan… Terimakasih.. Thank you… ;D
terima kasih mas.
Bisa dibaca disini http://saptaji.com/2011/07/03/menyimpan-sms-ke-database-mysql-dengan-delphi-bagian-2/ atau http://saptaji.com/2011/07/19/membuat-software-autoreply-sms-dengan-delphi/
Maaf mas mau tanya, sy udah coba bikin seperti yg dicontohkan di atas,
tp ketika d run, stelah tekan tombol setting dan lalu tekan open,
d memo keluar tulisan OK,
setelah itu sy coba kirim sms LED ON, tp g ada respon apa2, bahkan setelah dikirim sms, programny sama sekali g masuk ke event onRxChar (jd seolah2 comportny g nyadar ada sms masuk),
d memo t2p aj tulisanny OK (g ada prubahan),
maaf, gmana solusiny y mas?
Mks byk mas…
coba mas troubleshoot menggunakan hyperterminal. Masukkan at command-nya satu-satu
http://saptaji.com/2011/09/13/troubleshoot-koneksi-modem-dengan-hyperterminal/
Pagi Mas, Alhamdulillah td sy sudah coba pk hyperterminal, sy coba masukin at command sbb : ================================================= at+cgmi hslny => huawei OK at+cmgf=1 hslny => OK at+cpms=”SM” hslny => CPMS: 5,50,5,50,5,50 OK at+cscs=”GSM” hslny => OK ================================================= Alhamdulillah smuany bjalan mas, maaf langkah selanjutny apa lg y mas? O iy mks byk atas tutor2ny, sebelumny sy sudah bhasil mjalankan tutorial cara mengirim sms dari mas ajie, tp sedikit d modif berupa : – Connect k database SQL Server 2000, – ngambil data dari DB tsb, – kmudian data-nya dikirim ke 10 no hp. Jd kira2 masalah yg sy hadapi apa… Read more »
coba dalam posisi konek ke hyperterminal, kirim ke SMS ke modem. Terus perhatikan muncul karakter ‘+CMTI:xx’ (xx menunjukkan index sms). Kalo tidak muncul coba ketikkan at+cnmi=1,1,0,0,0. Itu utk mengaktifkan karakter cmti jika ada sms masuk
T2p g jalan mas,
setelah d masukin at+cnmi=1,1,0,0,0 jg t2p g ada respon apa2 d hyperterminalny,
sy jg udah nyoba pk nilai yg lain, seperti :
at+cnmi=2,1,0,0,0
at+cnmi=2,1,2,2,0 tp t2p cmti ny g mau muncul ktika ada sms baru.
Oiy sy pk modem Vodafone K3765 dari Huawei.
Mks byk mas.
waduh…gelap, mas 🙂 paling bisanya coba mode polling http://saptaji.com/2011/06/04/program-membaca-sms-dengan-delphi/
O iy gpp mas, Mks byk nih udah bantu.
Sy lg trus nyari cara supaya cmti ny bisa aktif.
O iy mas kt ny cara ngaktifin cmti bisa beda2 tgantung modemny, bnr g sih?
Mas punya dokumentasi at command yg lengkap tp berbahasa Indonesia g?
Mks byk y mas.
Jazakallah Khairan Katsiro…
Assalamu’alaikum…
intinya sama, mas. Cuma kadang fitur modemnya kadang lain. Coba ketikkan at+cnmi=? ntar keliatan fiturnya.
utk at command ntar sy upload, tp yg bhs indonesia ga ada mas 🙂
default save location for received SMS set ke SIM mas pada Seting Connect Manager nya, saya pernah ngalamin yang mirip kaya gitu, ternyata karena default save location for received SMS di set Ke PC
thx, mas. Mas moslem silahkan dicoba tips dr mas taufik ini
Askum bang ji,,,, mksh bwt share ilmunya…
langsung saja aku punya kendala bgni:
ketika dapet sms masuk, tampilan smsnya berupa kode (isinya tidak seperti isi sms)
padahal dah aku kasih:
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);
mohon pencerahannya
kodenya seperti apa, mas? bisa di-reply disini? Sepertinya sih kode PDU. Ini artinya modemnya tidak support mode teks. Bisa dicek dengan command at_cmgf? ntar lihat jawabannya jika cuma ‘0’ berarti cuma support mode PDU, jika (0,1) berarti support mode PDU dan ‘teks’
siang mas, saya mau tanya ni mas..
bukannya listing program delphi yang d atas cuman support mode Text ya??
bagaimana dengan format PDU??
ada saran mas sebaiknya gimana?
soalnya saya terkendala di hp yang saya gunakan cuman bisa mode PDU..
thx mas.. 🙂
saran saya, kalo pengin mudah, ganti pake hp/modem yg support mode teks he he he. Tp kalo masih pengin tetap coba mode PDU, cara termudah adalah mencari/download di internet procedure/function pdu2text. Dengan function ini, mas bima tidak susah2 lagi mengkonversi sintaks sms teks menjadi PDU, cukup panggil function aja
mas.
aku pake modem smartfren, pada memo cuma muncul ok
waktu tak coba sms,
sms kiriman ku cuma masuk di firmware modem tapi gak mau masuk di software delphi nya
minta tolong penyelesaiiannya mas?
,,
oh ya, mas pake modem seri apa ya?
terima kasih
saya pake modem GSM, utk modem CDMA msh belum berhasil
Ass.. Mas..! klw eror (enable to open com port (eror:5)) itu apa mas..???
kemungkinan ada software lain yg sdg mengakses com tersebut, misalnya software bawaan modem.
saya juga ada kendala seperti yang diatas mas, kalau sms nya cuma 1 pesan ga masalah keluar teks nya, tp klo lebih dari 1 pesan (sms bersambung), munculnya kode angka dan huruf. mohon pencerahannya mas 🙂
maksudnya sms bersambung gmn mas? apakah long sms atau sms broadcast?
MAS MAU TANYA KALO MISALNYA KIRIM SMS BEBERAPA NOMOR SATU KALI PROSES ITU YANG SAYA COBA KOK MASUK SATU NOMER SAJA, YANG NOMOR LAINNYA TIDAK MASUK, MOHON BANTUAN NYA MAS
coba kasih delay antar pengiriman sms minimal 5 detik
mas maaf mas saya mau nanya masalah function ‘pos’ dan ‘posex’ itu fungsinya untuk apamas? bisa di kasik contohnya mas,
kurang lebihnya untuk mencar string tertentu dalam variabel teks. lebih detail bisa dibaca di http://saptaji.com/2013/08/30/lebih-dalam-tentang-function-pos-posex-dan-copy-di-delphi/ dan http://saptaji.com/2013/11/21/lebih-dalam-tentang-function-pos-posex-dan-copy-di-delphi-jilid-2/
makasih jawabannya mas!! yang saya pakai delphi 6 td sy coba eror, sya akan coba menggunakan delphi 7
mas mau nanya
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;
ketika program sy jalankan sy tekan F5 ternyata saya cek a=0 sehingga tidak memproses syntak d bawahnya dia keluar dari if a 0 then
apakah ada yang salah dari syntak tsb
terus di memo cuma ada tulisan ok
tapi kalo sy tekan tombol all di memo keluar semua yang sms masuk
mohon petunjuknya mas
madsudnya if a tidak sama dengan 0
begin
xxx
xxx
xxx
end;
ternyatak sy cek F5 a=0 sehingga tidak melewati proses xxxx
mohon petunjuk nya mas
kl a = o artinya stringnya ga ketemu mas
assalam
mas saya ada problem dalam parsing data mungkin mas mengerti tolong bantuannya
saya ingin memparsing data dari micro
misalnya datanya
123A234B345D
yang ingin saya tampilkan adalah nilai angka pada fort edit bagaimana caranya
saya menggunakan delphi 7
wass wb. yg pertama phyisical layer hrs sdh bener dulu. Physical layer = koneksi kabel (atau bisa jg pake bluetooth/wifi) yg kedua, naik ke layer berikutnya, yakni data transport. Yg perlu diperhatikan di layer ini adalah protokol yg digunakan. Krn menggunakan protokol serial, maka perhatikan parameter serialnya (serial asinkron) udah sama belum antar device? yg ketiga, naik lg ke layer berikutnya, yakni data presentation alias penampilan data. Kalo udah nyampe layer ini erat hubungannya dengan aplikasi yg digunakan. Katakanlah menggunakan delphi, maka gimana caranya delphi bisa mengakses serial port utk mengambil data –> gunakan komponen comport, dst yg keempat, layer… Read more »
Permisi mas, saya mau tanya ne tentang aplikasi sms gateway dari delphi yang bisa terhubung dengan arduino. jadi ketika saya mengirim sms,, data sms tersebut dapat di proses ke arduino (untuk mengatur relay). terima kasih
bisa aja mas. Topologinya gini ya modem – komputer – arduino? Kalo benar begitu, berarti setidaknya dibutuhkan 2 port USB. Yg satu terhubung modem, yang kedua terhubung arduino. Kedua port USB diemulasi sbg port serial dg component cport/comport di delphi. Kalo terima SMS caranya seperti di artikel di atas, kalo merintahin relay yg di arduino caranya relatif sama, yakni kirim command melalui port serial yg mengemulasi port USB yg terhubung Arduino (Uno). Ntar di arduino dibikin script handler utk menangani command dari delphi
benar mas,, memang menggunakan 2 USB,, dan aplikasi untuk menerima sms nya juga sudah bisa, nah,, untuk coding supaya sms itu bisa di baca oleh arduino nya gimana mas ?
dari sisi delphi kirim data melalui serial port pake command comport.writestr(), sisi arduino pake function Serial.read()
if posex (‘ON’,memo1.Text,d+1) 0 then Comport2.WriteStr(‘1’);
itu contoh punya saya,, comport2 nya berasa dari usb arduino nya..
tapi tetap tidak bisa..
sisi arduinonya udah ada script handler-nya belum mas?
sudah ada.
saya kira seperti ini
void loop() {
if( Serial.available() >0 )
{
val = Serial.read();
Serial.println(val);
}
if( val == ‘1’ )
{
digitalWrite(K1,HIGH);
}
apa ada yang salah dari coding di atas ?
variabel ‘val’ tipenya apa?
saya krang taw, karna saya baru2 di bidang arduino ini, tapi saya baca2 untuk pendeklarasian di arduino nya memang menggunakan Val
oya,, tipe nya “char”
sepertinya sisi arduino sdh benar mas, kecuali yg Serial.available()>0 itu yg sy ragu. Kmd yg sisi delphi dipastikan udah bisa nangkep isi sms-nya atau blm. Mungkin bisa dibaca artikel sy yg ini http://saptaji.com/2014/03/25/interfacing-arduino-dengan-delphi/ , mungkin bisa membantu buat troubleshoot
saya sudah dapat permasalahannya, karena coding memang sudah benar..
saya memiliki modul bluetooth hc05 di arduino nya, sehingga arduino tidak mau menerima perintah dari luar.. apakah ada solusi untuk ini ? ketika kabel tx dan rx dari bluetooth nya saya lepas,, kendali relay lewat sms saya bisa bekerja,
kalo pin rx dan tx bluetooth konek ke pin 0 dan 1 ya memang ga bisa, karena akan konflik dengan port usb. Solusinya pake SOftwareSerial buat mengemulasi pin digital Arduino lain menjadi pin serial
Mas, untuk mengirim pesan kan pake perintah at+CMGS=no. tujuan.
nah di no. tujuan ini di buat otomatis bisa gx mas,,. contoh nya ngambil no. yang barusan sms..
bisa aja, contohnya di sini –> http://saptaji.com/2011/07/19/membuat-software-autoreply-sms-dengan-delphi/
mas maaf mau tanya,agak keluar dari tema tapi mungkin ada sedikit keterkaitan.
Cara mengakses multisensor dengan delphi gimanan ya mas?,saya masih bungung bagaimana cara memisahkan antara data satu dengan yang lain. trimakasih atas bantuannya.
gpp mas.
bingungnya masih di level hardware atau software mas? Karena pada intinya software (delphi) akan mengikuti hardware untuk cara mengaksesnya. Jadi cara yg satu bisa jd berbeda utk sensor yg lain. minta tolong pertanyaannya lebih spesifik lagi
mas kalo sms berformat untuk merubah database di arduino seperti apa
format sms bisa apa aja mas, yg penting arduino bisa memprosesnya (parsing data harus benar), kemudian dimasukkan ke database (ini maksudnya eeprom bukan?)
bukan eeprom mas jadi sms berformat merubah database delphi7 gitu mas
misal database nya jumlah barang kita sms #sabun3
maka di database berkurang 3
oh, di delphi….soalnya di pertanyaan sblmny kok ada kata2 ‘arduino’, makanya sy juga bingung :). Intinya gini mas, delphinya harus bisa baca sms dulu, kalo udah bisa baru masuk tahap parsing isi sms, kalo udah bisa parsing baru dimasukkan ke database sesuai keyword. Jadi bertahap gitu ya mas, biar mudah troubleshootnya
makasih mas