SMS Gateway dengan Delphi

Inilah contoh program SMS gateway sederhana menggunakan Delphi 2007.

Program sederhana ini sudah bisa mengirim dan menerima SMS melalui modem GSM yang terhubung ke serial Port. Modem GSM yang digunakan haruslah modem yang support SMS dengan format teks, saya menggunakan Evaluation board SIM700.

Akses ke port serial, seperti biasa menggunakan ApdComport. Com number dipilih sesuai dengan koneksi modem GSM, begitu juga dengan baud ratenya harus disesuaikan dengan baud rate modem.

Jika modem menerima SMS, maka secara otomatis program akan membaca dan menampilkannya ke memo, berikut dengan no pengirim dan tanggal sms. Tentu saja modem juga harus mendukung New Message Indication (AT+CNMI).

Disediakan juga sebuah edit untuk mengirim AT command ke modem, dan sebuah memo yang menunjukan data yang dikirim dan diterima dari modem.

Source code bisa diunduh di sini.

Programnya masih sangat sederhana, jadi masih banyak kekurangannya. Yang penting program sudah bisa mengirim dan menerima SMS.

Semoga bermanfaat.

84 Responses

  1. kang, dibahas dong aplikasi sms menggunakan MCS51, kayak matiin/ngidupin lampu pake sms dll…
    tengkyu gan…

  2. mas itu utk sms gateway pakai “ApdComport.” yah?
    bisa minta tutor lengkap dg sms massal g mas? terima kasih

  3. iya sms ke banyak nomor, tutor lengkap donk

    • klo isi smsnya sama, tinggal masukin aja nomor yang akan dikirimin ke listbox atau table, terus kirimin smsnya…

  4. pak bisa dijelaskan maksud ini “AT command ke modem dan baud rate modem”

    oiya ada referensi yang mudah dicerna untuk bisa autorespond sms gatewaynya dengan yang masih pakai komponen ApdComport.? terima kasih

    • AT command maksudnya perintah-perintah yang dikirimkan ke modem untuk mengendalikan modem, misal mengirim SMS atau menerima SMS, dalam bentuk karakter ASCII. Perintah ini selalu di awali dengan “AT”, misal ATE0, AT+CMGR dll. Semua modem sekarang sudah support AT command. AT command untuk fungsi khusus berbeda antara yang satu dengan yang lain. Misal AT command untuk fungsi TCP/IP modem SIM300 akan berbeda dengan modem wavecom, dan tidak semua modem support TCP/IP.

      Baud rate adalah kecepatan transfer data, karena komunikasi ke modem biasanya menggunakan interface serial/UART maka kecepatan datanya dinyatakan dengan baud rate, misal 9600 bit per second (bps).

  5. pak saya coba pakai modem sierra tapi pas saya kirim sms muncul eror “AT+CMGS=”085642152984″
    AT+CMGS=”085642152984″

    +CMS ERROR: 304” ini salah perintah at command atau gmn?

    • +CMS ERROR: 304, artinya Invalid PDU mode. Kemungkinan modem masih dalam PDU mode.
      Untuk itu set dulu modem ke mode teks
      menggunakan AT command berikut..
      AT+CMGF=1.
      Dan coba lagi
      AT+CMGS=”…..”

  6. pak saya coba buka source code diatas saya sudah instal apdcomportnya, tapi kok eror gini pak
    “invalid resource file:error reading file”
    “error creating form:error reading file”
    kemudian ada pesan panjang, saya ok lagi dengan ignore, ternyata delphi saya tidak menemukan OoMisc.dcu, dan adport.dcu

  7. pak saya coba buka source code diatas saya sudah instal apdcomportnya, tapi kok eror gini pak
    “invalid resource file:error reading file”
    “error creating form:error reading file”
    kemudian ada pesan panjang, saya ok lagi dengan ignore, ternyata delphi saya tidak menemukan OoMisc.dcu, dan adport.dcu

    apa ada yang kurang dari instalasi saya?

  8. sourceX tidak bisa kedownload,padahal ini pas ama skripsiku sms gateway mas.

    tolongin dong mas sekalian komponen tambahannya pendukungX kirim via email aja = asrul_07@ymai.com.

    thanks sebelmnya…

    salam kenal
    ~asrul~

  9. salam kenal, saya stanley, saat ini saya sedang skripsi mengenai sms gateway dngan delphi 7, mau nanya langkah-langkah pembuatan sms gateway dari awal. thx u.

    • salam kenal juga mas stanley…

      silakan, di download aja source code program di atas..

  10. Salam kenal, saya mirza saat ini saya punya tugas teknik antar muka dan mau buat smart home dengan sms gateway, tapi punya hambatan di komponen OoMisc.dcu dengan adport.dcu..boleh minta nggak ..?

  11. siiip, sudah saya coba dan berhasil

  12. salam kenal mas nama saya mokhamad yunus n saya baru belajar delphi 7 n pingin tau banyak tentang sms gateway, n saya minta ijin untuk buka website anda tiap hari untuk belajar. karena saya pemula mohon bimbingan n rahasia-rahasia bikin sms gateway karena buat tugas akhir aku juga

  13. makasih gan bermanfaat untuk seminar pkl saya gan

  14. Assalamu’alaykum Kang U-2 man,untuk Tutor diatas saya sudah praktekan dan Alhamdullillah sudah berhasil,namun untuk yang auto respond kira-kira seperti gimana ya kang source codenya?

  15. assalamualaikum pa saya ada kendala untuk mengirim sms kebanyak nomor gimana caranya ia? apa pake AT+CMMS? trus gimana perintah yg harus ditulis di delfhinya? mohon bantuannya

    • klo isi smsnya sama mendingan tetep pakai AT+CMGS yang diulang

      misal

      for i:=0 to jumlah_no-1 do
      send_sms(nomor[i], sms_text);

  16. comport1.WriteStr(‘at+cmgs=”‘+edit1.Text+'”‘+#13#10);
    comport1.WriteStr(edit1.text);
    comport1.WriteStr(#26);
    end;

    nah pak kemarin udah nyoba kaya gini .ini untuk 1 sms.nah kalo misalnya kebnyak kan pake perulangan diatas.gimana contoh codingannya.?

    • pertama no2 yg akan dikirimi simpan aja di string list, atau listbox, sedangkan isi text yang akan dikirim disimpan di edit1.

      Tinggal pakai prosedure looping aja, misal pakai for

      for i:=0 to listbox1.item.count-1 do
      begin
      comport1.WriteStr(‘at+cmgs=”‘+listbox1.item[i]+’”‘+#13#10);
      comport1.WriteStr(edit1.text);
      comport1.WriteStr(#26);
      sleep(5000);
      end

      sleep(5000) digunakan untuk menunggu agar modem selesai mengirim sms.

  17. kalo i nya harus dideklarasikan ga?
    var
    i= apa pa?

  18. udah di coba yg itu pak..di program delphi nya tidak error.tapi dikirim ke no tujuan tidak nyampe..mungkin masalah dari listbox nya gitu pak,pada saat memasukan nomernya pada item list box gimna caranya?

    • sebenarnya tidak perlu pakai listbox, pakai memo atau editx5 juga nga masalah…ini kan hanya contoh…

      klo pakai memo, ya tinggal for nya diganti menjadi memo1.line.count…

  19. assalamualaikum kang..

    kang kalau mau bikin satu tombol untuk connect 2/lebih port gimana ya?jadi misal di pc ada 2 modem wavecom terus ketika di klik button’a,2 modem tersebut langsung terkoneksi semua..aku udah coba bikin prosedure percabangan.tapi error terus..gimana ya prosedurnya kang?

    • waalaikum salam

      percabangannya gimana?

      Sebenarnya klau untuk konek ke 2 modem harusnya nga ada masalah…sediakan aja 2 komponen port serial (apdcomport dll), lalu asign com no untuk masing2 modem…tinggal open deh kedua komponen tersebut…kalau mau ngirim atau mau baca data, tinggal pilih ke modem mana

      • begin
        if comport1.Connected then
        begin
        comport1.Close;
        button1.Caption:=’Open’;
        end
        else
        begin
        Memo1.Clear;
        ComPort1.Open;
        button1.Caption:=’Close’;
        ComPort1.WriteStr(‘at+cmgf=1’+#13#10);
        ComPort1.WriteStr(‘at+cscs=”GSM”‘+#13#10);
        ComPort1.WriteStr(‘AT+CGMR’+#13#10);
        end;
        end;

        script diatas untuk koneksi comport1 dan tapil di memo1 dan udah jalan dengan bagus,nah biar comport2 bisa jalan dan hasil perintahnya tampil di memo2 dengan klik button1 gimana ya kang?

        singkatnya sekali klik button1 comport1 dan comport2 jalan.

        terima kasih sebelumnya…

      • Tinggal ditambahin aja..

        begin
        //Comport1
        if comport1.Connected then
        begin
        comport1.Close;
        button1.Caption:=’Open’;
        end
        else
        begin
        Memo1.Clear;
        ComPort1.Open;
        button1.Caption:=’Close’;
        ComPort1.WriteStr(‘at+cmgf=1′+#13#10);
        ComPort1.WriteStr(‘at+cscs=”GSM”‘+#13#10);
        ComPort1.WriteStr(‘AT+CGMR’+#13#10);
        end;

        //Comport2
        if comport2.Connected then
        begin
        comport2.Close;
        button1.Caption:=’Open’;
        end
        else
        begin
        Memo2.Clear;
        ComPort2.Open;
        button1.Caption:=’Close’;
        ComPort2.WriteStr(‘at+cmgf=1′+#13#10);
        ComPort2.WriteStr(‘at+cscs=”GSM”‘+#13#10);
        ComPort2.WriteStr(‘AT+CGMR’+#13#10);
        end;

        end;

      • Solved.
        Tokcer kang..makasih banyak.moga sukses terus kang…

  20. klo untuk mengetahui modem sedang mengeksekusi perintah gmn y?
    misalnya jika sedang memproses pembacaan sms, kita ingin mengecek jg sisa pulsa misalnya, atau juga ingin mengirim sms baru.

    karna memang modem hrs mengekesusi perintah itu secara bergantian. Jika dipaksa mengeksekusi juga mka akan terjadi error.

    • Sebenarnya modem kan sifatnya pasif, jadi semuanya tergantung kita yang mengendalikan…membaca SMS juga kan kita yang merintah, modem memang secara otomatis akan menerima sms, dan tergantung seting modem juga akan ngasih notifikasi bahwa dia menerima SMS, +CMTI. Untuk mengecek pulsa juga menggunakan AT command:
      misal untuk ngecek pulsa suatu operator dengan kode *888#, maka at commandnya bisa menggunakan

      AT+CUSD=1,”*888#”

      Untuk mengirim SMS baru, sebaiknya menunggu dulu apabila sebelumnya ada perintah untuk kirim SMS, misalnya menunggu +CMGS

      • iy betul, sya mengerti hal it…
        yg sya msh bingung adlh setiap modem kan mempunyai kcepatan sendiri untuk merespon peritah. misal modem A bisa mengeksekusi perintah CMGS dlm 3 detik, sedangkan modem B mungkin 5 detik dan modem C mungkin lebih dr 5 detik utk mengirim tiap SMS. Jd bagaimana y mengatasi hal sperti ini…?
        yang sya pengn adalah pengulangan d tiap pengiriman perintah (misal pengirimn SMS) it tidak tergantung pada nilai sleep(n) yg kita berikan. Sbagaimana dlm conth diberikan sleep(5) yg artinya perintah SMS akn selesai tidak selesai hrs selesai dlm waktu 5 detik kemudian kode berikutnya dieksekusi.
        Mohon bantuanya…. trima kasih.

      • Kalau begitu pelajari AT Commandnya dan juga apa replynya…nah agar tidak tergantung pada delay maka setiap kali mengirim AT Command maka PC harus menunggu reply yang sesuai dengan AT command tersebut.

        Misal setelah ngirim command SMS, maka modem akan mengirim OK kemudian +CMGS, nah inilah yang harus ditunggu oleh PC.

        Kadang-kadang modem juga akan mereply ERROR kalau at command yang dikirim salah, atau pada saat ngirim SMS, pulsanya tidak ada, maka modem akan reply ERROR. Ini juga harus diperhatikan.

        Selain itu harus ada timeoutnya juga, agar saat PC tidak mendapatkan jawaban yang sesuai atau jawaban ERROR, program tidak hang. Misalnya sesaat setelah ngirim AT command, tiba-tiba modemnya mati.

  21. Kang kalau mau munculin Serial number di Edittext gimana ya? jadi pas click button,imeinya langsung ada di Edittext tersebut..aku coba begini
    Edit1.Text:=’ComPort1.read(AT+CGSN+#13#10)’;

    yang keluar di box =ComPort1.read(AT+CGSN+#13#10)

    maturnuhun sebelumnya.

    • perintah Edit1.Text:=’ComPort1.read(AT+CGSN+#13#10)’; artinya mengisi Edit1 dengan ’ComPort1.read(AT+CGSN+#13#10)’;

      “Pelajari dulu bagaimana mengirim dan membaca data serial menggunakan COMPORT”

      untuk membaca imei AT command yang digunakan sudah benar yaitu AT+CGSN, tinggal bagaimana mengirm AT command ini ke modem dengan menggunakan comport

      Comport1.Output:=’AT+CGSN’+#13#10

      tunggu beberapa saat sebelum membaca data yang dikirim dari modem

      sleep(200);

      baru baca datanya..silakan cari sendiri bagaimana cara membaca data dari comport.

  22. Boss Usman, saya ingin 1 colokan usb yang di komputer bisa untuk 6 kartu telephone. Masing-masing kartu mengirim ke nomor berbeda dan teks juga berbeda.

    Bagaiman Boss ?

    • Pakai multiplex gan…1 modem, nanti interface ke SIM Cardnya di multiplex jadi nanti bisa milih…multiplexnya bisa pakai relay atau mungkin IC 4066…

  23. kang, moho dijelasin donk function getTimeOut it buat ap c?
    =========================
    function TForm1.GetTimeOut(TimeOut: integer): boolean;
    begin
    Result := False;
    while TimeOut>0 do
    begin
    Sleep(1);
    Application.ProcessMessages;
    //if Command_Status then break;
    dec(TimeOut);
    end;
    Result:=Command_Status;
    end;
    =========================

    misalnya GetTimeOut(500)
    artinya ap it?

    • Ini fungsi untuk nunggu jawaban dari modem…
      GetTimeOut(500) artinya nunggu jawaban dari modem, kalau selama 500 mS tidak ada reply dari modem maka timeout

  24. pagi kang…
    mau nanya lgi nih,
    klo misal ada dua modem / lebih yang ingin dipakai untuk mengirim sms secara bersamaan, gmn yah untuk pengaturanya agar smua modem bisa mengirim scara bersamaan ?. benar tdk klo harus menggunakan konsep multithread untuk tiap modemnya?.

    misal (utk 1 modem):

    comport1.WriteStr(‘at+cmgs=”0894837483″‘+#13#10);
    comport1.WriteStr(‘testing sms’+#26);

    gmn yah klo penggunaanya jika ad comport2,comport3,comport4 dst…

    • iya aplikasinya harus menggunakan multi thread, kalau ada 4 modem maka buat 4 thread yang masing-masing mengakses ke 4 modem tersebut….
      Contoh multithread ada di blog saya

      Multi-Tasking di Delphi

      • klo misal untuk mengirim sms bisa g d gabung jd 1 perintah seperti ini :
        compport1.Output(’AT+CMGS=”’+[varPhoneNo]+'”‘+#13#10+’>’+[varIsiSMS]+#26
        atau sperti ini (tanpa tanda’>’) :
        compport1.Output(’AT+CMGS=”’+[varPhoneNo]+'”‘+#13#10+[varIsiSMS]+#26

      • Yang kedua yang benar (tanpa >). Karena karakter “>” modemlah yang akan ngirim…

      • o bgitu y, jd mmang tdk ad maslh y klo d jdkan satu atau tdk.
        trus karakter balasan dr modem ‘>’ itu sendiri menandakan ap y…?
        karna stelah sya gabung karakter balasan ‘>’ tetap muncul diikuti ‘ok’, apa tdk masalh…?

      • Sebenarnya seperti ini urutan2 ngirim SMS
        1. Kirim AT command AT+CMGS
        2. Tunggu balasan dari modem, yaitu karakter ‘>”
        3. Kirim text atau content sms
        4. Kirim CTRL+Z atau #26
        5. Tunggu balasan +CMGS, yang artinya sms telah terkirim
        Jadi karakter ‘>’ tidak perlu diperhatikan…yang penting kita yakin bahwa pengiriman conten sms dilakukan setelah modem ngirim karakter tersebut, bisa kita tunggu, artinya karakter ‘>’ dibaca, atau setelah ngirim AT+CMGS kasih delay dulu baru kirim conten..

      • wah…
        membantu bgt kang U-2 Man ni, makasih kang…
        🙂

  25. kang, kalau untuk cdma apa y? pke windows nh os nya

  26. mas, mau tanya.. waktu dibuka project Deplhinya pesan Error reading StatusBar1.ExplisitTop: Property ExplicitTop does not exist.
    kira-kira yang salah apanya? Terima kasih

  27. mas sy mohon pencerahannya aplikasinya dah aku coba namun kalo untuk menerima pesan selalu eror, salah satu diantaranya yaitu buffer1:string;
    thechar :char; //yang ini masalah//
    PhoneNumber, MsgDate:string;
    i,j:integer;
    begin
    for i :=1 to count do
    begin
    thechar:=ApdComPort1.GetChar;//dengan listing ini//
    pasti tidak bisa tercompile.

    saya mohon mas pencerahannya.trims ^_^

    • Errornya apa?

      • sy buka source nya mas…sy menggunakan delphi 2009.komponen dah lengkap tapi pas aku compile ga bisa..yang letak erornya menuju ke “thechar:=apdcomport1.getchar; pesan erornya “[DCC Fatal Error] SMSGateway.dpr(5): F2063 Could not compile used unit ‘uSMSGateway.pas'”.ngirim sms dah bisa tinggal nerima sms nya mas…sy kepengen skali jalankan aplikasi ini maklum masih newbe mas di pemrograman..makasih sebelumnya…sukses slalu buat mas

  28. Bang klo error nya seperti ini
    +CMGS: 230

    OK

    +CMGS: 43

    OK

    +CMGS: 124

    OK

    +CMGS: 161

    OK

    +CMGS: 5

    OK

    +CMGS: 89

    OK

    mohon pencerahan nya bang trima kasih

  29. AT
    OK

    AT+CMGS=”085732520160″
    +CMS ERROR: 304

    UPI

    ini maksudnya apa kang??maaf saya masih awam.tapi pngn blajar tntang program anda.saya tertariksm programnya

  30. sewaktu modem saya colokkan, g bisa buka COM nya.send AT jg g bisa.
    apa mungkin faktor modemnya yg g support kang?
    saya pake modem prolink.
    mohon penjelasannya kang

  31. kang punya saya muncul kotak dialog “modem no reply or command error” gt gmn solusinya kang?

  32. Mas kalo mau cek baudrate modem kita gimana?
    trus waktu open comport modem saya pake program mas, ko ga bisa yah.. trus muncul dialog CAN NOT OPEN COM

    • Kalau mau cek baud rate sih ya liat datasheet/spesifikai modemnya…:)
      Pada dasarnya semua modem bisa di set di baud rate berapa aja (selama dia support), cuma yang jadi pertanyaan berapa default baud ratenya? Nah ini yang beda-beda harus liat datasheet…

      Tapi ada juga modem, atau mungkin semua modem, yang support auto baud rate (modem baru). Untuk modem yang auto baud rate, kita bisa kirim AT command dengan baud rate berapa aja. Misal kita kirim AT di baud rate 9600 bps, maka modem akan berada di baud rate 9600 bps.
      Untuk seting baud rate kita bisa menggunakan AT command berikut
      AT+IPR=9600, menset modem di baud rate 9600 bps. Nah supaya seting disimpan permanen kita pakai AT command
      AT&W…

      CAN NOT OPEN COM, terjadi karena COM tersebut tidak ada atau lagi dipakai oleh aplikasi lain….

  33. kalau detect port modem secara otomatis bisa gak ?
    jadi misal modem di port 13 program bisa otomatis detect + baca nama modem

  34. hallo… link download yang di ziddu kok berubah jadi exe yaa? dan oleh avira terdeteksi sebagai virus. apakah bisa diupload ulang?
    terima kasih sebelumnya.

  35. Kang U-2 Man…
    kalo baca SMS dengan AT Command…respon baliknya muncul banyak karakter…gimana cara misah2ini antar Nomor pengirim, Isi SMS dan Tanggal kirimnya ya…? Tks..

  36. Gan,,,, kalau,,, menggunakan Multi Modem gimana caranya???

  37. Salam Kenal,

    Sy menggunakan Delphi 7 dan akan Instalasi Component/Package ApdComport dari AsyncPro tidak berjalan sempurna, mohon pencerahannya, ada keterangan “A406_R70.bpl” corrupt, bantuannya, nuhun Kang

  38. Mas, mau tanya
    Klo pas run ada pesan error : [DCC Fatal Error] SMSGateway.dpr(5): F2063 Could not compile used unit ‘uSMSGateway.pas’

    Itu kenapa ya? padahal itu blm saya apa2in (baru buka project trus run). Saya pake XE2 mas

    • [DCC Error] uSMSGateway.pas(72): E2010 Incompatible types: ‘Char’ and ‘AnsiChar’
      [DCC Error] uSMSGateway.pas(89): E2003 Undeclared identifier: ‘Memo3’
      [DCC Error] uSMSGateway.pas(131): E2003 Undeclared identifier: ‘Edit3’
      [DCC Error] uSMSGateway.pas(132): E2003 Undeclared identifier: ‘Edit4’
      [DCC Warning] uSMSGateway.pas(180): W1058 Implicit string cast with potential data loss from ‘TCaption’ to ‘AnsiString’
      [DCC Error] uSMSGateway.pas(197): E2003 Undeclared identifier: ‘Edit2’
      [DCC Error] uSMSGateway.pas(197): E2014 Statement expected, but expression of type ‘TCaption’ found
      [DCC Error] uSMSGateway.pas(202): E2066 Missing operator or semicolon
      [DCC Error] uSMSGateway.pas(212): E2029 ‘.’ expected but ‘;’ found
      [DCC Warning] uSMSGateway.pas(309): W1058 Implicit string cast with potential data loss from ‘string’ to ‘AnsiString’
      [DCC Fatal Error] SMSGateway.dpr(5): F2063 Could not compile used unit ‘uSMSGateway.pas’

  39. misi mas mau tanya .. saya coba kirim sms lebih dari 160 karakter kok respon dari modemnya “ERROR” ya mas .. setelah itu saya coba kirim kurang dari 160 karakter baru mau .. tolong pencerahannya mas .. trims ..

    • SMS maksimal 162 karakter. Kalau lebih dari itu dipecah aja jadi beberapa SMS.
      Tapi ada juga sih modem yg otomatis akan memecah menjadi 2 sms

Leave a reply to asrul Cancel reply