Sistem Pengendalian Proses Unduh Menggunakan Telepon Genggam Berbasis Layanan SMS.
SISTEM PENGENDALIAN PROSES UNDUH MENGGUNAKAN
TELEPON GENGGAM BERBASIS LAYANAN SMS
Jonathan Chandra / 0827007
Jurusan Sistem Komputer, Fakultas Teknik,
Universitas Kristen Maranatha
Jalan Prof. drg. Suria Sumantri, MPH. No 65
Bandung 40164, Indonesia
ABSTRAK
Semakin majunya teknologi informasi memudahkan manusia untuk mencari
dan mendapatkan informasi secara cepat tanpa memusingkan ruang dan waktu.
Untuk dapat mengakses sebuah informasi di suatu tempat, pengguna harus
mengambil datanya terlebih dahulu sebelum dapat menggunakannya. Hal ini
dikenal dengan proses unduh. Pada komputer proses ini dapat dengan mudah
dilaksanakan, cukup dengan memasukan alamat informasi yang akan diakses oleh
pengguna dan membiarkan komputer melakukan tugas sisanya.
Dalam hal pengoperasian proses unduh pada komputer terdapat salah satu
titik kelemahan, yaitu proses unduh harus dilakukan secara langsung oleh
pengguna (jarak dekat). Tentunya dari kelemahan ini proses unduh pada komputer
memiliki keterbatasan dengan jarak dan tidak dapat dilakukan secara jauh.
Dengan memanfaatkan teknologi komunikasi yang ada, khususnya layanan
SMS yang mampu mengirimkan pesan singkat / perintah dari pengguna kepada
komputer untuk melakukan proses unduh, maka titik kelemahan tersebut dapat
diatasi.
Agar komputer dapat memaksimalkan fungsinya dan juga menghemat energi
listrik, komputer dapat dikendalikan untuk menyalakan dan mematikan dirinya
sendiri sesuai dengan keinginan pengguna. Hal ini berguna apabila pengguna
menginginkan untuk mematikan komputer setelah proses unduh selesai ataupun
membutuhkan komputer pada saat-saat tertentu, dimana komputer dalam keadaan
hemat energi (padam). Selain proses unduh, komputer juga dilengkapi dengan
proses unggah berkas. Fungsi dari proses unggah tersebut hanyalah untuk
memaksimalkan fungsi komputer, ketika pengguna membutuhkan berkas yang
ada pada komputernya.
(2)
DOWNLOAD PROCESS CONTROLLER SYSTEM USING MOBILE PHONE
AND BASED ON SMS SERVICE
Jonathan Chandra / 0827007
Department of Computer Engineering, Faculty of Engineering,
Maranatha Christian University
Prof. drg. Suria Sumantri, MPH. No 65
Bandung 40164, Indonesia
ABSTRACT
Information technology has been advanced in these years, which in turn
enable people to look and get information much more instantly than ever. When
people want to get some information from an internet site, they must get the file
first before they can use or read it. This process is called download. Downloading
a file through a computer is a simple thing. User just types the file URL within the
downloader software, and then let the computer do the rest of it.
There is actually one disadvantage when user wants to download through a
computer. The disadvantage is user must do the download process within
computer I/O device cable length. By this fact, user couldn’t control download
process far away from computer.
Today, advanced telecommunication technology especially SMS service,
enable us to communicate far away between two people or devices. By using this
technology, we could cover download process limitation, by extending its range.
To adopt energy saving option, the computer must able to turn itself on and
off by user command. This feature is become helpful when user want to shutdown
the computer off after download process is completed or rather just turn it on
when user needed computer download function. This is proven to boost computer
energy saving efficiency. Another versatile feature inside the software is a
command that able to upload a file pointed by user then sent it into user email.
This feature became helpful when user need a file that lay inside his/her computer
drive.
(3)
DAFTAR ISI
ABSTRAK ...i
ABSTRACT
...ii
DAFTAR ISI ...iii
DAFTAR TABEL ...v
DAFTAR GAMBAR ...vi
BAB I PENDAHULUAN ...1
1.1.
Latar Belakang ...1
1.2.
Identifikasi Masalah ...2
1.3.
Tujuan Penelitian...2
1.4.
Pembatasan Masalah...2
1.5.
Sistematika Penulisan ...3
BAB II LANDASAN TEORI ...5
2.1.
Short Messaging Service
...5
2.2.
AT – Command ...6
2.2.1.
AT ...7
2.2.2.
ATE0 ...7
2.2.3.
AT+CPMS ...8
2.2.4.
AT+CNMI ...9
2.2.5.
+CMTI...9
2.2.6.
AT+CMGR...10
2.2.7.
AT+CMGS ...11
2.2.8.
AT+CMGD...12
2.3.
Standar RS-232...12
2.4.
Parallel Port
...14
2.5.
Mikrokontroller AT89C51...17
2.5.1.
Timer
...21
2.5.2.
Serial Port
...23
2.5.3.
Interrupt
...24
2.6.
IC TTL
74LS373...25
BAB III PERANCANGAN
HARDWARE
DAN
SOFTWARE
...27
3.1.
Hardware
...27
3.1.1.
Mobile Phone Device Translator
...28
3.1.1.1.
Pengaturan dan Inisialisasi...33
3.1.1.2.
Pengenalan dan Pengaturan Telepon Genggam..33
3.1.1.3.
Program Berulang / Rutinitas Program ...34
3.1.1.4.
Program
Interrupt
...39
3.1.2.
Secondary Controller
...40
3.1.2.1.
Konfigurasi dan Inisialisasi...43
3.1.2.2.
Pengecekan
Sensor
dan
Flag
...43
3.1.2.3.
Program Berulang / Rutinitas Program ...44
3.1.2.4.
Penyerahan Kendali Kepada Komputer ...46
3.1.2.5.
Computer Heartbeat Timeout
...47
(4)
3.1.3.
Telepon Genggam, Sony Ericsson, Model K300i ...49
3.2.
Software
...52
3.2.1.
Primary Controller
...52
3.2.1.1.
Fungsi - Fungsi Kendali
I/O Port
...61
3.2.1.2.
Fungsi - Fungsi Perintah
Hardware
...62
3.2.1.3.
Fungsi - Fungsi
Software
...64
3.2.1.4.
Fungsi - Fungsi Fitur
Download
...66
3.2.1.5.
Fungsi - Fungsi Fitur
...70
3.2.1.6.
Fungsi - Fungsi
Shortcut
...71
3.2.1.7.
Fungsi Lainnya...72
3.2.1.8.
Fungsi TTimer...74
3.2.2.
Software
“Download list builder”...85
3.3.
Blok Diagram dan
Flowchart
...93
3.3.1.
Blok Diagram Cara Kerja Sistem ...93
3.3.2.
Flowchart
M.P.D Translator
...94
3.3.3.
Flowchart Secondary Controller
...96
3.3.4.
Flowchart Software Primary Controller
...104
3.3.5.
Flowchart Software
“Download list builder”...107
BAB IV HASIL DAN PENGAMATAN...108
4.1.
Hasil Akhir
Hardware
...108
4.1.1.
Mobile Phone Device Translator
...109
4.1.2.
Secondary Controller
...112
4.2.
Hasil Akhir
Software
...115
4.2.1.
Primary Controller
...115
4.2.2.
Software
“Download list builder”...117
4.3.
Pengamatan Atas Uji Coba Perintah ...118
4.4.
Pengamatan Atas Proses Unduh...171
BAB V KESIMPULAN DAN SARAN ...172
5.1.
Kesimpulan ...172
5.2.
Saran ...172
DAFTAR PUSTAKA ...173
LAMPIRAN A
Listing
Program
Software Primary Controller
...A-1
LAMPIRAN B
Listing
Program
Hardware Secondary Controller
...B-1
LAMPIRAN C
Listing
Program
Hardware M.P.D Translator
...C-1
LAMPIRAN D
Listing
Program
Software
“Download list builder” ...D-1
(5)
DAFTAR TABEL
Tabel 2.1 Konfigurasi
pin
dan nama sinyal konektor
parallel
standar DB-25. .. 16
Tabel 2.2 Contoh alamat
port
parallel
, LPT1. ... 17
Tabel 4.1 Tabel uji coba proses unduh ... 171
(6)
DAFTAR GAMBAR
Gambar 2.1 Pengiriman huruf “A” tanpa bit paritas (
level
tegangan RS-232) ... 13
Gambar 2.2 Pengiriman huruf “A” tanpa bit paritas (
level
tegangan
TTL
) ... 14
Gambar 2.3 Gambar konektor DB-25 (
port
parallel
)... 14
Gambar 2.4 Konfigurasi slot DB-25
female
... 15
Gambar 2.5 Mikrokontroller AT89C51 ... 18
Gambar 2.6
Pin
Configurations
AT89C51 ... 19
Gambar 2.7
Connection
Diagram
DIP
(
Top
View
) ... 26
Gambar 2.8 Tabel Kebenaran
IC
74LS373... 26
Gambar 3.1 Gambar contoh modul
LCD
berukuran 16x2... 28
Gambar 3.2 Sinyal
rising
-
edge
/ menanjak naik ... 30
Gambar 3.3
Schematic
Diagram
,
Mobile Phone Device Translator
... 32
Gambar 3.4
Schematic Diagram, Serial Interface Adapter
... 40
Gambar 3.5
Schematic Diagram, Secondary Controller
... 42
Gambar 3.6 Contoh sinyal
falling
-
edge
... 48
Gambar 3.7 Sony Ericsson, K300i ... 49
Gambar 3.8 Konektor K300i ... 50
Gambar 3.9 Desain
layout
software
, frmMain ... 60
Gambar 3.10 Desain
layout
software
, frmConfigure (page 1 : "General")... 78
Gambar 3.11 Desain
layout
software
, frmConfigure (page 2 : "Log")... 79
Gambar 3.12 Desain
layout
software
, frmConfigure (page 3 : "Hardware")... 80
Gambar 3.13 Desain
layout
software
, frmConfigure (page 4 :
"Downloader") ... 81
Gambar 3.14 Desain
layout
software
, frmConfigure (page 5 : "E-mail") ... 82
Gambar 3.15 Desain
layout
software
, frmConfigure (page 6 : "Misc.") ... 83
Gambar 3.16 Desain
layout
software
, frmProgress ... 84
Gambar 3.17 Desain
layout
software
... 86
Gambar 3.18 Komponen TLabeledEdit : "txtURL" ... 87
Gambar 3.19 Komponen TListBox : "lbURL" ... 88
Gambar 3.20 Komponen TOpenDialog : " OpenDlg"... 89
Gambar 3.21 Komponen TSaveDialog : "SaveDlg" ... 89
Gambar 3.22 Komponen TCheckBox : "chkAutoOpen"... 90
Gambar 3.23 Komponen TButton : "btnNewList" ... 90
Gambar 3.24 Komponen TButton : "btnApply"... 90
Gambar 3.25 Komponen TButton : "btnDelete" ... 91
Gambar 3.26 Komponen TButton : "btnAdd"... 91
Gambar 3.27 Komponen TButton : "btnOpenList" ... 92
Gambar 3.28 Komponen TButton : "btnSaveList"... 92
Gambar 3.29 Komponen TButton : "btnSaveListAs" ... 93
Gambar 3.30 Blok diagram sistem ... 93
Gambar 3.31
M.P.D Translator flowchart
(Alur program secara garis besar) ... 94
Gambar 3.32
M.P.D Translator flowchart
, proses inisialisasi... 95
Gambar 3.33
Flowchart
Secondary Controller
, alur program secara garis
besar ... 96
(7)
Gambar 3.34
Flowchart Secondary Controller
, proses inisialisasi... 98
Gambar 3.35
Flowchart Secondary Controller
, langkah pertama ... 99
Gambar 3.36
Flowchart Secondary Controller
, langkah kedua (bagian 1)... 100
Gambar 3.37
Flowchart Secondary Controller
, langkah kedua (bagian 2)... 101
Gambar 3.38
Flowchart Secondary Controller
, langkah ketiga ... 102
Gambar 3.39
Flowchart Secondary Controller
, langkah keempat... 103
Gambar 3.40
Flowchart Software Primary Controller
, inisialisasi program ... 104
Gambar 3.41
Flowchart Software Primary Controller
, alur program secara
garis besar ... 106
Gambar 3.42
Flowchart Software
"Download list builder"... 107
Gambar 4.1 Hasil akhir
hardware
secara keseluruhan ... 108
Gambar 4.2 Tampilan pada layar
LCD
1 ... 109
Gambar 4.3 Tampilan pada layar
LCD
2 ... 109
Gambar 4.4 Tampilan pada layar
LCD
3 ... 109
Gambar 4.5 Tampilan pada layar
LCD
4 ... 110
Gambar 4.6 Tampilan pada layar
LCD
5 ... 110
Gambar 4.7 Tampilan pada layar
LCD
6 ... 110
Gambar 4.8 Tampilan pada layar
LCD
7 ... 111
Gambar 4.9 Tampilan pada layar
LCD
8 ... 111
Gambar 4.10 Hasil akhir alat
Secondary
Controller
... 112
Gambar 4.11 Alat ketika dalam keadaan inisialisasi ... 112
Gambar 4.12 Alat sedang mengirimkan pesan
SMS
... 113
Gambar 4.13 Pesan
SMS
yang diterima oleh pengguna ... 113
Gambar 4.14 Keadaan alat ketika membaca status dari
hardware
M.P.D
Translator
... 114
Gambar 4.15 Keadaan alat ketika menunggu jeda 5 detik... 114
Gambar 4.16 Hasil akhir
software
Primary
Controller
... 115
Gambar 4.17 Contoh tampilan dari
form
pengaturan yang sedang dijalankan ... 116
Gambar 4.18 Tampilan ketika
software
"Download list builder" sedang
digunakan ... 117
Gambar 4.19 Perintah yang dikirimkan oleh pengguna... 119
Gambar 4.20 Perintah diterima oleh
software
... 119
Gambar 4.21 Pesan
SMS
yang diterima oleh pengguna ... 120
Gambar 4.22 Perintah yang dikirimkan oleh pengguna... 121
Gambar 4.23
Software
"shutdown.exe" sedang berjalan ... 121
Gambar 4.24 Komputer dalam keadaan
shutdown
... 122
Gambar 4.25 Alat
Secondary
Controller
sedang mengirimkan pesan kepada
pengguna... 122
Gambar 4.26 Pesan yang diterima oleh pengguna ... 122
Gambar 4.27 Alat
Secondary
Controller
melakukan pengecekan pesan baru.... 123
Gambar 4.28 Pengguna mengirimkan pesan... 123
Gambar 4.29
Software
telah menerima perintah ... 124
Gambar 4.30 Pengguna menerima pertanyaan dari
software
... 124
Gambar 4.31 Pengguna mengirimkan jawabannya ... 124
Gambar 4.32 Jawaban diterima oleh
software
dan mengirimkan hasil dari
perintah ... 124
(8)
Gambar 4.33 Hasil perintah yang diterima oleh pengguna... 125
Gambar 4.34 Pengguna mengirimkan pesan... 126
Gambar 4.35
Software
menerima perintah dan memberikan pertanyaan ... 126
Gambar 4.36 Pertanyaan diterima oleh pengguna... 126
Gambar 4.37 Pengguna mengirimkan jawabannya ... 127
Gambar 4.38
Software
menerima jawaban dan mengkonfirmasinya melalui
pesan... 127
Gambar 4.39 Pesan berisi konfirmasi diterima oleh pengguna... 127
Gambar 4.40 Pengguna mengirimkan konfirmasinya ... 128
Gambar 4.41
Software
menerima konfirmasi dan memulai proses
pengiriman
... 128
Gambar 4.42 Pernyataan yang dikirimkan oleh
software
nya ... 129
Gambar 4.43 Pengguna mengirimkan perintah ... 130
Gambar 4.44 Pesan yang dikirimkan oleh
software
kepada pengguna ... 130
Gambar 4.45 Pesan yang dikirimkan oleh
software
kepada pengguna ... 131
Gambar 4.46 Pengguna mengirimkan alamat
URL
(bagian pertama)... 131
Gambar 4.47 Pengguna mengirimkan alamat
URL
(bagian kedua) ... 132
Gambar 4.48 Pengguna mengirimkan pesan bersisi kode "<done>" ... 132
Gambar 4.49
Software
telah menerima alamat
URL
dan sedang mengunduh
file
... 132
Gambar 4.50 Pesan yang dikirimkan oleh
software
setelah memulai proses
unduh ... 133
Gambar 4.51 Tampilan
software
ketika proses unduh telah selesai... 133
Gambar 4.52 Pesan yang dikirimkan oleh
software
setelah proses unduh
telah selesai... 134
Gambar 4.53 Perintah yang dikirimkan oleh pengguna... 134
Gambar 4.54 Tampilan
software
(
progress
) ketika proses unduh sedang
berlangsung... 135
Gambar 4.55 Hasil perintah berupa pesan
SMS
yang dikirimkan oleh
software
... 135
Gambar 4.56 Perintah yang dikirimkan oleh pengguna... 136
Gambar 4.57 Tampilan
software
setelah perintah dilaksanakan ... 137
Gambar 4.58 Tampilan
software
pada saat perintah dilaksanakan ... 137
Gambar 4.59 Pesan yang diterima oleh pengguna ... 137
Gambar 4.60 Perintah yang dikirimkan oleh pengguna... 138
Gambar 4.61 Tampilan
software
sebelum perintah dijalankan... 138
Gambar 4.62 Tampilan
software
ketika perintah sedang dijalankan... 139
Gambar 4.63 Pesan yang diterima oleh pengguna ... 139
Gambar 4.64 Perintah yang dikirimkan oleh pengguna... 140
Gambar 4.65 Tampilan
software
setelah perintah dijalankan ... 140
Gambar 4.66 Pesan yang diterima oleh pengguna dari
software
... 141
Gambar 4.67 Pesan yang dikirimkan oleh pengguna ... 141
Gambar 4.68 Tampilan
software
setelah perintah dilaksanakan ... 142
Gambar 4.69 Pesan pertama yang diterima oleh pengguna ... 142
Gambar 4.70 Pesan kedua yang diterima oleh pengguna ... 142
(9)
Gambar 4.72
Software
menerima perintah dah memulai proses unduh
berdasarkan daftar ... 143
Gambar 4.73 Pesan yang diterima oleh pengguna ... 144
Gambar 4.74 Tampilan
software
ketika selesai mengunduh seluruh daftar
dan sedang dalam proses pengiriman pesan ... 144
Gambar 4.75 Pesan yang diterima oleh pengguna ... 145
Gambar 4.76 Perintah yang dikirimkan oleh pengguna... 145
Gambar 4.77 Tampilan
software
(
progress
) ketika perintah ini dilaksanakan ... 146
Gambar 4.78 Pesan yang diterima oleh pengguna ... 146
Gambar 4.79 Perintah yang dikirimkan oleh pengguna... 147
Gambar 4.80 Tampilan
software
sebelum perintah dilaksanakan... 147
Gambar 4.81 Tampilan
software
setelah perintah dilaksanakan ... 148
Gambar 4.82 Pesan yang diterima oleh pengguna ... 148
Gambar 4.83 Perintah yang dikirimkan pengguna ... 149
Gambar 4.84 Tampilan
software
sebelum perintah dilaksanakan... 149
Gambar 4.85 Tampilan
software
setelah perintah dilaksanakan ... 150
Gambar 4.86 Pesan yang diterima oleh pengguna ... 150
Gambar 4.87 Perintah yang dikirimkan pengguna ... 151
Gambar 4.88 Tampilan
software
sebelum perintah dilaksanakan... 151
Gambar 4.89 Tampilan
software
setelah perintah dilaksanakan ... 152
Gambar 4.90 Pesan yang diterima oleh pengguna ... 152
Gambar 4.91 Perintah yang dikirimkan pengguna ... 153
Gambar 4.92 Tampilan
software
ketika perintah sedang dilaksanakan... 153
Gambar 4.93 Pesan pertama yang diterima oleh pengguna ... 154
Gambar 4.94 Pesan kedua yang diterima oleh pengguna ... 154
Gambar 4.95 Perintah yang dikirimkan pengguna ... 155
Gambar 4.96 Perintah diterima oleh
hardware
... 156
Gambar 4.97
Hardware
sedang mengirimkan pesan balasan ... 156
Gambar 4.98
Power
LED
komputer dalam keadaan mati ... 157
Gambar 4.99 Pesan yang diterima oleh pengguna (kondisi
Power
LED
mati)... 157
Gambar 4.100
Power
LED
komputer dalam keadaan menyala ... 157
Gambar 4.101 Pesan yang diterima oleh pengguna (kondisi
Power
LED
menyala) ... 158
Gambar 4.102 Perintah yang dikirimkan pengguna ... 159
Gambar 4.103 Perintah diterima oleh
hardware
... 159
Gambar 4.104
Relay
aktif selama 1 detik ... 159
Gambar 4.105 Kondisi
relay
setelah aktif 1 detik ... 160
Gambar 4.106 Komputer dalam keadaan menyala (
Power
LED
menyala) ... 160
Gambar 4.107 Pesan pertama yang diterima oleh pengguna ... 160
Gambar 4.108
Secondary
Controller
melepaskan kendalinya... 161
Gambar 4.109 Pesan kedua yang diterima oleh pengguna ... 161
Gambar 4.110 Tampilan komputer pada saat
booting
... 162
Gambar 4.111 Tampilan komputer setelah menjalankan
software
... 162
Gambar 4.112 Perintah yang dikirimkan oleh pengguna... 163
Gambar 4.113 Kondisi komputer (menyala) sebelum perintah dilaksanakan .... 163
(10)
Gambar 4.115 Kondisi
relay
setelah aktif selama 1 detik ... 164
Gambar 4.116 Pesan yang diterima oleh pengguna... 164
Gambar 4.117 Kondisi komputer setelah dijalankan perintah ... 165
Gambar 4.118 Perintah yang dikirimkan pengguna ... 165
Gambar 4.119 Kondisi komputer menyala, sebelum dijalankan perintah ini ... 166
Gambar 4.120
Relay
aktif selama 5 detik ... 166
Gambar 4.121 Kondisi
relay
setelah aktif 5 detik ... 166
Gambar 4.122 Pesan yang diterima oleh pengguna... 167
Gambar 4.123 Kondisi
Power
LED
setelah perintah dilaksanakan... 167
Gambar 4.124 Tampilan komputer setelah perintah dilaksanakan... 167
Gambar 4.125 Perintah yang dikirimkan pengguna ... 168
Gambar 4.126 Perintah diterima oleh
hardware
... 168
Gambar 4.127
Hardware
sedang mengirimkan pesannya kepada pengguna ... 169
Gambar 4.128 Pesan pertama yang diterima oleh pengguna ... 169
Gambar 4.129 Pesan kedua yang diterima oleh pengguna ... 169
Gambar 4.130 Tampilan
LCD
ketika
Secondary
Controller
telah
melepaskan kendalinya... 170
(11)
LAMPIRAN A
Listing
Program
Software Primary Controller
Form
utama program (frmMain)
A-1
Form
pengaturan program (frmConfigure)
A-50
(12)
//--- #include <stdlib.h>
#include <time.h> #include <fstream.h> #include <vcl.h> #pragma hdrstop
#include "code_frmMain.h" #include "code_frmConfigure.h" #include "code_frmProgress.h"
//--- #pragma package(smart_init)
#pragma resource "*.dfm" /*
[DEBUGGING PURPOSE] #define DATA_PORT 0x378 #define STATUS_PORT 0x379 #define CONTROL_PORT 0x37A */
TfrmMain *frmMain; /*
Prototype untuk fungsi yang ada di inpout32.dll
--- */
typedef short __stdcall (*InputDll) (short PortAddress);
typedef void __stdcall (*OutputDll) (short PortAddress, short data); //--- // ### Variables ###
HINSTANCE dll; short port; OutputDll Out32; InputDll Inp32;
bool port_open = false; bool general_usage = false; bool hardware_connected = false; //System Handler
String command; bool boot = true; int log_scroll_y = 0; int sys_errors; String sender_number; String sender_message;
int instruction_no = 0; // none
int command_level = 1; // 1 - instruction, 2 - parameter
bool confirmation = false; // variable for CommandHandler 2nd parameter int option; // variable for CommandHandler parameter value
bool listed = false; // 'List file' command execution result int available_file_option_max;
//Download Subsystem
int download_mode = 0; // default, 0=no-mode-running 1=single-download-mode 2=list-download-mode
HANDLE wget_hwnd; String downloaded_file; String URL;
char ** download_file_list; int download_list_count;
int downloading_index = -1; // default -1 //Email Subsystem
bool attach_file = true; String filename_2attach; //Shortcuts Subsystem bool enumerated = false;
(13)
char ** shortcuts; // file path
char ** files; // file title / filename int total_shortcuts;
String selected_shortcut;
//--- __fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner) {
}
//--- //--- // ========================================================================== // COMPUTER I/O PORT
// ========================================================================== bool TfrmMain::OpenPort()
{
//Open DB25 parallel I/O port connection bool result = true;
dll = LoadLibrary("inpout32.dll"); // Win32 API, load external library / DLL if(dll == NULL) {
MessageDlg( "inpout32.dll not found, error.",mtError,TMsgDlgButtons() << mbOK,0);
result = false; }
Inp32 = (InputDll) GetProcAddress(dll,"Inp32"); if(Inp32 == NULL) {
MessageDlg( "Function could'nt loaded!, ERROR.",mtError,TMsgDlgButtons() << mbOK,0);
result = false; }
Out32 = (OutputDll) GetProcAddress(dll,"Out32"); if(Out32 == NULL) {
MessageDlg( "Function could'nt loaded!, ERROR.",mtError,TMsgDlgButtons() << mbOK,0);
result = false; }
if(result == true) { port_open = true; SetPortAsOutput(); } else {
port_open = false; }
return result; }
//--- bool TfrmMain::ClosePort()
{
//Close DB25 parallel I/O port connection bool result;
result = FreeLibrary(dll); if(result == false) {
MessageDlg( "Couldn't close port, ERROR.",mtError,TMsgDlgButtons() << mbOK,0);
} else { }
return result; }
void TfrmMain::SetPortAsOutput() {
(14)
// clear bit C5 of control register // clear bit nC3 of control register: // r:1 -> turn-off 74LS373(IN) [DIRECT]
// r:0 -> turn-on 74LS373(OUT) [through inverter] unsigned char temp;
temp = Inp32(CONTROL_PORT); temp = temp & 0xD7 ; // 1101.0111 Out32(CONTROL_PORT, temp); }
void TfrmMain::SetPortAsInput() {
//Set DB25 Parallel data port to be input // set bit C5 of control register
// set bit nC3 of control register:
// r:1 -> turn-off 74LS373(OUT) [through inverter] // r:0 -> turn-on 74LS373(IN) [DIRECT]
unsigned char temp;
temp = Inp32(CONTROL_PORT); temp = temp | 0x28 ; // 0010.1000 Out32(CONTROL_PORT, temp); }
//--- // ========================================================================== // LOW LEVEL HARDWARE FUNCTIONS
// ========================================================================== /*
Data port - Communication lines / Communication port Control bit 0 - Clock
Control bit 1 - Exit-loop function (not used thought) Status bit 4 - Busy flag
*/
void TfrmMain::HWClock() {
// Give hardware a transition from High->Low->High (Falling+Rising Edge) // CONTROL PORT, BIT 0
unsigned char tmp; Sleep(20);
// Clear LOW
tmp = Inp32(CONTROL_PORT);
tmp = tmp & (0xFE); // 0b1111.1110 Out32(CONTROL_PORT, tmp);
Sleep(20); // Set HIGH
tmp = Inp32(CONTROL_PORT); tmp = tmp | 0x01; // 0b0000.0001 Out32(CONTROL_PORT, tmp); Sleep(20);
// Clear LOW
tmp = Inp32(CONTROL_PORT);
(15)
Out32(CONTROL_PORT, tmp); Sleep(20);
}
void TfrmMain::HWWaitBusy() {
unsigned char tmp; bool busy = true;
// Wait for hardware signal "busy" until it goes low while(busy == true) {
tmp = Inp32(STATUS_PORT); // S4 tmp = tmp & 0x10; // 0b0001.0000 if(tmp != 0x10) {
busy = false; }
Sleep(1);
frmMain->Update(); }
}
void TfrmMain::ToggleHeartbeat() {
// Send out different signal // CONTROL PORT, C2
unsigned int tmp;
tmp = Inp32(CONTROL_PORT); tmp = tmp & 0x04; // 0b0000.0100 if(tmp == 0x04) {
// Clearing C2
tmp = Inp32(CONTROL_PORT);
tmp = tmp & (!0x04); // 0b1111.1011 Out32(CONTROL_PORT, tmp);
} else {
// Setting C2
tmp = Inp32(CONTROL_PORT); tmp = tmp | 0x04; // 0b0000.0100 Out32(CONTROL_PORT, tmp); }
}
// ========================================================================== // HARDWARE "SOFTWARE" FUNCTIONS
// ========================================================================== void TfrmMain::HWClearStorages()
{
//Hardware clear recepient number phone and message unsigned char inst_code = 0x01;
// > set instruction code Out32(DATA_PORT,inst_code);
// > give clock, to confirm instruction code HWClock();
// > give clock, to confirm execution HWClock();
// > wait for hardware, until busy pin goes LOW HWWaitBusy();
// > give clock, to exit HWClock();
(16)
void TfrmMain::HWInputAscii(char ascii) {
//Computer input a message, char by char to the hardware unsigned char inst_code = 0x02;
// > set instruction code Out32(DATA_PORT,inst_code);
// > give clock, to confirm instruction code HWClock();
// > set parameter data Out32(DATA_PORT,ascii);
// > give clock, to confirm parameter data, ASCII HWClock();
// > give clock, to confirm execution HWClock();
// > wait for hardware, until busy pin goes LOW HWWaitBusy();
// > give clock, to exit HWClock();
}
void TfrmMain::HWInputNumber(char number) {
//Computer input recepient number, digit by digit to the hardware unsigned char inst_code = 0x03;
// > set instruction code Out32(DATA_PORT,inst_code);
// > give clock, to confirm instruction code HWClock();
// > set parameter data Out32(DATA_PORT,number);
// > give clock, to confirm parameter data, Number ASCII HWClock();
// > give clock, to confirm execution HWClock();
// > wait for hardware, until busy pin goes LOW HWWaitBusy();
// > give clock, to exit HWClock();
}
void TfrmMain::HWEncodeMessage(unsigned char mode) {
//Tell hardware to encode the message. unsigned char inst_code = 0x04; // > set instruction code Out32(DATA_PORT,inst_code);
// > give clock, to confirm instruction code HWClock();
// > set parameter data, PDU_Mode : 0x01 -- 7-bit | 0x02 -- 8-bit | 0x03 -- 16-bit
Out32(DATA_PORT, mode );
// > give clock, to confirm parameter data HWClock();
// > give clock, to confirm execution HWClock();
(17)
HWWaitBusy();
// > give clock, to exit HWClock();
}
void TfrmMain::HWDecodeMessage() {
//Tell hardware to fetch message from mobile phone, and decode it. unsigned char inst_code = 0x05;
// > set instruction code Out32(DATA_PORT,inst_code);
// > give clock, to confirm instruction code HWClock();
// > give clock, to confirm execution HWClock();
// > wait for hardware, until busy pin goes LOW HWWaitBusy();
// > give clock, to exit HWClock();
}
void TfrmMain::HWSendMessage() {
//Send the encoded message to mobile phone unsigned char inst_code = 0x06;
// > set instruction code Out32(DATA_PORT,inst_code);
// > give clock, to confirm instruction code HWClock();
// > give clock, to confirm execution HWClock();
// > wait for hardware, until busy pin goes LOW HWWaitBusy();
// > give clock, to exit HWClock();
}
void TfrmMain::HWReadMessage() {
//Read the decoded message from hardware char tmp;
unsigned char inst_code = 0x07; String number;
String message; unsigned char data;
unsigned char num_length = 0; unsigned char t_num;
unsigned char msg_length = 0; unsigned char t_msg;
number = ""; message = ""; SBar->Position = 0; SBar->Max = 0;
(18)
Out32(DATA_PORT,inst_code);
// > give clock, to confirm instruction code HWClock();
SetPortAsInput();
// > give clock, to confirm execution HWClock();
//============================= receving begin here ====== num_length = Inp32(DATA_PORT);
t_num = num_length; SBar->Max = (t_num * 2); Sleep(10);
// > give clock, confirm data, number_length HWClock();
while(num_length > 0) { // > get data from port! data = Inp32(DATA_PORT);
// accumulate to number variable number = number + String(char(data)); HWClock();
num_length--; frmMain->Update();
SBar->Position = SBar->Position + 1; }
msg_length = Inp32(DATA_PORT); t_msg = msg_length;
SBar->Max = (t_msg * 2); SBar->Position = (SBar->Max/2); Sleep(10);
// > give clock, confirm data, message_length HWClock();
while(msg_length > 0) { // > get data from port! data = Inp32(DATA_PORT);
// accumulate to message variable message = message + String(char(data)); HWClock();
msg_length--; frmMain->Update();
SBar->Position = SBar->Position + 1; }
//============================= receiving end here ======= // > give clock, to exit
HWClock();
SetPortAsOutput(); SBar->Position = 0; SBar->Max = 1;
(19)
sender_number = number; sender_message = message; }
void TfrmMain::HWDeleteLastMessage() {
//Tell hardware to delete last received message in mobile phone unsigned char inst_code = 0x08;
// > set instruction code Out32(DATA_PORT,inst_code);
// > give clock, to confirm instruction code HWClock();
// > give clock, to confirm execution HWClock();
// > wait for hardware, until busy pin goes LOW HWWaitBusy();
// > give clock, to exit HWClock();
}
char TfrmMain::HWGetMessage() {
//Get message from hardware by this instruction char msg;
unsigned char inst_code = 0x09; // > set instruction code Out32(DATA_PORT,inst_code);
// > give clock, to confirm instruction code HWClock();
// > Set port to (input-mode) SetPortAsInput();
// > give clock, to confirm execution HWClock();
// > wait for hardware, until busy pin goes LOW HWWaitBusy();
msg = Inp32(DATA_PORT);
// > give clock, to confirm data HWClock();
// > give clock, to exit HWClock();
// > set port to (output-mode) SetPortAsOutput();
return msg; }
void TfrmMain::HWKeepConnection() {
//Keep connection alive between M.P.D Translator and the mobile phone
//This ensure new message indication are sent properly to the M.P.D Translator unsigned char inst_code = 0x0B;
// > set instruction code Out32(DATA_PORT,inst_code);
(20)
HWClock();
// > give clock, to confirm execution HWClock();
// > wait for hardware, until busy pin goes LOW HWWaitBusy();
// > give clock, to exit HWClock();
}
//--- // ========================================================================== // MAIN PROGRAM HANDLER
// ========================================================================== //--- void TfrmMain::LoadConfig()
{
// Load user configuration files
String file_config = ExtractFilePath(Application->ExeName) + "\\" + "config.ini";
// Check for config file? exist or not?
// If exist then load it, else leave configuration at default values then save. if(FileExist(file_config) == false) {
// File Not exist
MessageBox(Handle,"User configuration not found!\nUsing default settings\n(Please configure it now!)","Warning",MB_OK|MB_ICONEXCLAMATION); DefaultConfig();
SaveConfig(); // save it for next settings } else {
// File exist, load it up.. char * retStr;
retStr = (char*) calloc( 201, sizeof(char)); memset(retStr,0,201);
// General
GetPrivateProfileString(
"General","Verbose","0",retStr,2,file_config.c_str());
frmConfigure->chkVerbose->Checked = StrToInt(String(retStr)); GetPrivateProfileString(
"General","Autostart","0",retStr,2,file_config.c_str());
frmConfigure->chkAutostart->Checked = StrToInt(String(retStr)); // Log
GetPrivateProfileString( "Log","Cleaner","",retStr,2,file_config.c_str()); frmConfigure->chkClearLog->Checked = StrToInt(String(retStr));
GetPrivateProfileString( "Log","Counter","",retStr,20,file_config.c_str()); frmConfigure->txtClearCount->Text = String(retStr);
GetPrivateProfileString( "Log","Save","",retStr,2,file_config.c_str()); frmConfigure->chkSaveLog->Checked = StrToInt(String(retStr));
GetPrivateProfileString( "Log","Path","",retStr,200,file_config.c_str()); frmConfigure->txtProgramLog->Text = String(retStr);
// Hardware
GetPrivateProfileString( "Hardware","Mode","",retStr,2,file_config.c_str()); frmConfigure->cmbPort->ItemIndex = StrToInt(String(retStr));
GetPrivateProfileString(
"Hardware","CustomPort","",retStr,10,file_config.c_str()); frmConfigure->txtCustomPort->Text = String(retStr); frmConfigure->cmbPortChange(frmMain);
// Downloader
GetPrivateProfileString(
(21)
frmConfigure->txtDownloaderProgramPath->Text = String(retStr); GetPrivateProfileString(
"Downloader","SavePath","",retStr,200,file_config.c_str()); frmConfigure->txtDownloaderSavePath->Text = String(retStr); GetPrivateProfileString(
"Downloader","LogPath","",retStr,200,file_config.c_str()); frmConfigure->txtDownloaderLogPath->Text = String(retStr); GetPrivateProfileString(
"Downloader","ListPath","",retStr,200,file_config.c_str()); frmConfigure->txtDownloadListPath->Text = String(retStr); // Email
GetPrivateProfileString(
"Email","ProgramPath","",retStr,200,file_config.c_str()); frmConfigure->txtEmailProgramPath->Text = String(retStr);
// We don't read any sensitive information, the one who responsible for this kind of information is emailer program (blat)
//GetPrivateProfileString(
"Email","Username","",retStr,200,file_config.c_str()); //frmConfigure->txtUsername->Text = String(retStr); //GetPrivateProfileString(
"Email","Password","",retStr,200,file_config.c_str()); //frmConfigure->txtPassword->Text = String(retStr); GetPrivateProfileString(
"Email","SMTPServer","",retStr,200,file_config.c_str()); frmConfigure->txtSMTPServer->Text = String(retStr); GetPrivateProfileString(
"Email","SSLPort","",retStr,20,file_config.c_str()); frmConfigure->txtSSLPort->Text = String(retStr); GetPrivateProfileString(
"Email","SenderAddress","",retStr,200,file_config.c_str()); frmConfigure->txtSenderAddress->Text = String(retStr); GetPrivateProfileString(
"Email","RecepientAddress","",retStr,200,file_config.c_str()); frmConfigure->txtRecepientAddress->Text = String(retStr); GetPrivateProfileString(
"Email","MailSubject","",retStr,200,file_config.c_str()); frmConfigure->txtMailSubject->Text = String(retStr); // Misc
GetPrivateProfileString(
"Misc","AuthorizedNumber","",retStr,14,file_config.c_str()); frmConfigure->txtAuthorizedNumber->Text = String(retStr); GetPrivateProfileString(
"Misc","PeriodicReport","",retStr,20,file_config.c_str());
frmConfigure->chkPeriodicReport->Checked = StrToInt(String(retStr)); GetPrivateProfileString(
"Misc","ReportInterval","",retStr,20,file_config.c_str()); frmConfigure->txtReportInterval->Text = String(retStr); GetPrivateProfileString(
"Misc","ShortcutsDirectory","",retStr,200,file_config.c_str()); frmConfigure->txtShortcutsDirPath->Text = String(retStr); }
}
void TfrmMain::DefaultConfig() {
// Revert all settings back into default values. // General
frmConfigure->chkVerbose->Checked = false; frmConfigure->chkAutostart->Checked = true; // Log
frmConfigure->chkClearLog->Checked = true; frmConfigure->txtClearCount->Text = "50"; frmConfigure->chkSaveLog->Checked = false;
(22)
frmConfigure->txtProgramLog->Text = ExtractFilePath(Application->ExeName) + "logs\\log_program.txt";
// Hardware
frmConfigure->cmbPort->ItemIndex = 0; frmConfigure->txtCustomPort->Text = ""; frmConfigure->cmbPortChange(frmMain); // Downloader
frmConfigure->txtDownloaderProgramPath->Text = "";
frmConfigure->txtDownloaderSavePath->Text = ExtractFilePath(Application->ExeName);
frmConfigure->txtDownloaderLogPath->Text = ExtractFilePath(Application->ExeName) + "logs\\log_download.txt";
frmConfigure->txtDownloadListPath->Text = ""; // Email
frmConfigure->txtEmailProgramPath->Text = ""; frmConfigure->txtUsername->Text = "";
frmConfigure->txtPassword->Text = ""; frmConfigure->txtSMTPServer->Text = ""; frmConfigure->txtSSLPort->Text = ""; frmConfigure->txtSenderAddress->Text = ""; frmConfigure->txtRecepientAddress->Text = ""; frmConfigure->txtMailSubject->Text = ""; // Security
frmConfigure->txtAuthorizedNumber->Text = ""; frmConfigure->chkPeriodicReport->Checked = true; frmConfigure->txtReportInterval->Text = "15"; frmConfigure->txtShortcutsDirPath->Text = ""; }
void TfrmMain::SaveConfig() {
// Save user configuration
String file_config = ExtractFilePath(Application->ExeName) + "\\" + "config.ini";
// Delete last configuration file DeleteFile(file_config);
// General
WritePrivateProfileString( "General","Verbose",String((int)frmConfigure->chkVerbose->Checked).c_str(),file_config.c_str());
WritePrivateProfileString( "General","Autostart",String((int)frmConfigure->chkAutostart->Checked).c_str(),file_config.c_str());
// Log
WritePrivateProfileString( "Log","Cleaner",String((int)frmConfigure->chkClearLog->Checked).c_str(),file_config.c_str());
WritePrivateProfileString( "Log","Counter",String(frmConfigure->txtClearCount->Text).c_str(),file_config.c_str());
WritePrivateProfileString( "Log","Save",String((int)frmConfigure->chkSaveLog->Checked).c_str(),file_config.c_str());
WritePrivateProfileString( "Log","Path",String(frmConfigure->txtProgramLog->Text).c_str(),file_config.c_str());
// Hardware
WritePrivateProfileString( "Hardware","Mode",String(frmConfigure->cmbPort->ItemIndex).c_str(),file_config.c_str());
WritePrivateProfileString( "Hardware","CustomPort",String(frmConfigure->txtCustomPort->Text).c_str(),file_config.c_str());
// Downloader
WritePrivateProfileString( "Downloader","ProgramPath",String(frmConfigure->txtDownloaderProgramPath->Text).c_str(),file_config.c_str());
WritePrivateProfileString( "Downloader","SavePath",String(frmConfigure->txtDownloaderSavePath->Text).c_str(),file_config.c_str());
(23)
WritePrivateProfileString( "Downloader","LogPath",String(frmConfigure->txtDownloaderLogPath->Text).c_str(),file_config.c_str());
WritePrivateProfileString( "Downloader","ListPath",String(frmConfigure->txtDownloadListPath->Text).c_str(),file_config.c_str());
WritePrivateProfileString( "Email","ProgramPath",String(frmConfigure->txtEmailProgramPath->Text).c_str(),file_config.c_str());
// We don't store any sensitive information, the one who responsible for this kind of information is emailer program (blat)
//WritePrivateProfileString( "Email","Username",String(frmConfigure->txtUsername->Text).c_str(),file_config.c_str());
//WritePrivateProfileString( "Email","Password",String(frmConfigure->txtPassword->Text).c_str(),file_config.c_str());
WritePrivateProfileString( "Email","SMTPServer",String(frmConfigure->txtSMTPServer->Text).c_str(),file_config.c_str());
WritePrivateProfileString( "Email","SSLPort",String(frmConfigure->txtSSLPort->Text).c_str(),file_config.c_str());
WritePrivateProfileString( "Email","SenderAddress",String(frmConfigure->txtSenderAddress->Text).c_str(),file_config.c_str());
WritePrivateProfileString( "Email","RecepientAddress",String(frmConfigure->txtRecepientAddress->Text).c_str(),file_config.c_str());
WritePrivateProfileString( "Email","MailSubject",String(frmConfigure->txtMailSubject->Text).c_str(),file_config.c_str());
// Misc
WritePrivateProfileString("Misc","AuthorizedNumber",String(frmConfigure->txtAuthorizedNumber->Text).c_str(),file_config.c_str());
WritePrivateProfileString("Misc","PeriodicReport",String((int)frmConfigure->chkPeriodicReport->Checked).c_str(),file_config.c_str());
WritePrivateProfileString("Misc","ReportInterval",String(frmConfigure->txtReportInterval->Text).c_str(),file_config.c_str());
WritePrivateProfileString("Misc","ShortcutsDirectory",String(frmConfigure->txtShortcutsDirPath->Text).c_str(),file_config.c_str());
// -- Outside data processes -- // Auto start at Windows Logon.
// save a key to registry HKCU\Software\Microsoft\Windows\CurrentVersion\Run if(frmConfigure->chkAutostart->Checked == true) {
// Create registry entry void * hKey;
String path = Application->ExeName;
if(RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\R un",0,KEY_ALL_ACCESS,&hKey) == ERROR_SUCCESS) {
if(RegSetValueEx( hKey, "CMS_SMS_SYS", 0, REG_SZ, path.c_str(), path.Length()) != ERROR_SUCCESS) {
// Add report
mmLog->Lines->Add("(!) Couldn't open registry, Autostart configuration feature error!");
log_scroll_y++; }
RegCloseKey(hKey); } else {
// Add report
mmLog->Lines->Add("(!) Couldn't open registry, Autostart configuration feature error!");
log_scroll_y++; }
} else {
// Delete registry entry void * hKey;
String path = Application->ExeName;
if(RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\R un",0,KEY_ALL_ACCESS,&hKey) == ERROR_SUCCESS) {
RegDeleteValue(hKey,"CMS_SMS_SYS"); RegCloseKey(hKey);
(24)
// Add report
mmLog->Lines->Add("(!) Couldn't open registry, Autostart configuration feature error!");
log_scroll_y++; }
} }
void __fastcall TfrmMain::FormActivate(TObject *Sender) {
if(boot == true) {
// Initialize variables and startup value for each controls mmLog->Clear(); // clear the log memobox
lblDownloaderStatus->Caption = "Inactive"; PBar->Position = 0; // zero
lblPercent->Caption = "-"; lblURL->Caption = "-";
lblCurrentTask->Caption = "-"; lblCompUptime->Caption = "--:--:--"; lblSysErrors->Caption = "0x"; btnAutoResponse->Caption = ""; sys_errors = 0;
SBar->Position = 0;
shortcuts = (char**) calloc(3,sizeof(char*)); files = (char **) calloc(3,sizeof(char*)); for(int i = 0; i < 3 ; i++) {
shortcuts[i] = (char *) calloc(260,sizeof(char)); memset(shortcuts[i],0,260);
files[i] = (char *) calloc(15,sizeof(char)); memset(files[i],0,15); // 14 char, 1 for null }
// Load user configurations LoadConfig();
// Wait for timer.. to continue Startup execution
// we don't use a loop, because the DoEvents function doesn't process WM_QUIT / Application->Terminate();
tmrStartup->Interval = 10000; // 10 sec. tmrStartup->Enabled = true;
mmLog->Lines->Add("(i) Click configure button to configure the software."); mmLog->Lines->Add("(i) Click close window button to use computer/'general-usage'");
mmLog->Lines->Add("");
mmLog->Lines->Add("(i) " + IntToStr(tmrStartup->Interval / 1000) + " seconds for user confirmation ...");
} }
void __fastcall TfrmMain::tmrStartupTimer(TObject *Sender) {
if(boot == true) { mmLog->Clear();
tmrStartup->Enabled = false; Startup();
} }
void TfrmMain::Startup() {
// WARNING: Beginning code section of this function, moved to FormActivate, // this because considering the 'general-usage' plan usage.
(25)
// Booting up complete so far, don't re-loop again. boot = false;
// Set GUI (CloseButton enable, disable CloseWindowButton) TBorderIcons tempBI = frmMain->BorderIcons;
tempBI >> biSystemMenu; frmMain->BorderIcons = tempBI;
btnConfigure->Enabled = false; // User cannot configure, once the system is activated!
btnAutoResponse->Enabled = true; btnCloseSoftware->Enabled = true; // set this program Always On Top
//mmLog->Lines->Add("DEBUG: Always On Top DISABLED"); //log_scroll_y++;
SetWindowPos(Application->Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
SetWindowPos(frmMain->Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); // Open computer I/O Port
// get settings first before open any port switch(frmConfigure->cmbPort->ItemIndex) { case 0:
DATA_PORT = 0x378; break;
case 1:
DATA_PORT = 0x278; break;
case 2:
//Custom Port
DATA_PORT = StrToIntDef(frmConfigure->txtCustomPort->Text,0x378); // wrong input, revert to 0x378
break; }
STATUS_PORT = DATA_PORT + 1; CONTROL_PORT = DATA_PORT + 2; // open now
OpenPort(); // Log entry
String time_str = String(Time()); String date_str = String(Date());
mmLog->Lines->Add("(System Started at " + date_str + " - " + time_str + ")");
mmLog->Lines->Add(""); log_scroll_y++; log_scroll_y++;
// Verbose: "[System Started]"
if(frmConfigure->chkVerbose->Checked == true) { SWSendMessage("(System Started)",""); }
// Give the 1st heartbeat // DEBUG, SKIP
//mmLog->Lines->Add("DEBUG: Startup heartbeat skipped"); //log_scroll_y++;
// Add report
mmLog->Lines->Add("(>) Sending startup-heartbeat"); log_scroll_y++;
tmrHWHeartbeatTimer(frmMain); // 1x frmMain->Update();
Sleep(1000);
tmrHWHeartbeatTimer(frmMain); // ..^ (part of) frmMain->Update();
(26)
tmrHWHeartbeatTimer(frmMain); // 2x frmMain->Update();
Sleep(1000);
tmrHWHeartbeatTimer(frmMain); // ..^ (part of) frmMain->Update();
Sleep(1000);
tmrHWHeartbeatTimer(frmMain); // 3x frmMain->Update();
Sleep(1000);
tmrHWHeartbeatTimer(frmMain); // ..^ (part of) frmMain->Update();
Sleep(1000);
tmrHWHeartbeatTimer(frmMain); // 4x frmMain->Update();
Sleep(1000);
tmrHWHeartbeatTimer(frmMain); // ..^ (part of) frmMain->Update();
Sleep(1000);
// Check for hardware availabillity // DEBUG, SKIP
//mmLog->Lines->Add("DEBUG: Hardware Check Skipped!"); //log_scroll_y++;
//hardware_connected = true;
SWHWCheck();
if(hardware_connected == false) { // Add report
mmLog->Lines->Add("(!) Hardware isn't connected!"); log_scroll_y++;
CloseSoftware(); }
// Only proceed, if hardware is connected if(hardware_connected == true) {
// Enumerate shortcuts first! // DEBUG, SKIP
//mmLog->Lines->Add("DEBUG: Enumeration Process Skipped!"); //log_scroll_y++;
EnumerateShortcuts();
// Turn on Self-Response-System tmrAutoResponse->Enabled = true; if(tmrAutoResponse->Enabled == true) {
btnAutoResponse->Caption = "Sys Auto Response : [ON]"; mmLog->Lines->Add("(>) Self Response System activated"); log_scroll_y++;
// Normal/Verbose: "(System Online)" SWSendMessage("(System Online)",""); } else {
btnAutoResponse->Caption = "Sys Auto Response : [OFF]";
mmLog->Lines->Add("(!) WARNING: Self Response System inactive!"); log_scroll_y++;
// Verbose: "(!) System couldn't start, malfunction!" if(frmConfigure->chkVerbose->Checked == true) {
SWSendMessage("(!) System couldn't start, malfunction!",""); }
}
// Turn on hardware Heartbeat generator tmrHWHeartbeat->Enabled = true;
// Check for periodic-report feature (ON/OFF)
if(frmConfigure->chkPeriodicReport->Checked == true) { // Add report
(27)
log_scroll_y++;
tmrPeriodicReport->Interval =
StrToIntDef(frmConfigure->txtReportInterval->Text,15) * 60 * 1000; // wrong input, revert to 15 min. tmrPeriodicReport->Enabled = true;
} else {
mmLog->Lines->Add("(>) Periodic report feature disabled!"); log_scroll_y++;
tmrPeriodicReport->Enabled = false; }
} }
void __fastcall TfrmMain::tmrAutoResponseTimer(TObject *Sender) {
// LED Indicator LED1->Color = clGreen; tmrLED1->Enabled = true;
// Keep connection alive between M.P.D Translator with Mobile Phone HWKeepConnection();
// Call Process AutoResponse(); }
void TfrmMain::AutoResponse() {
/*
SYSTEM AUTO RESPONSE
1. Checking for a new message by some time intervals 2. If new message are available, then
3. Decode it 4. Read it
5. Check for it's number first? authorized or not? 6. If authorized, then
7. Execute the message by system plans, call CommandHandler 8. Log message command
9. Delete that message */
bool unauthorized = false; if(HWGetMessage() == 0x01) {
HWClearStorages(); // keep our system clean. HWDecodeMessage();
HWReadMessage();
if(sender_number == frmConfigure->txtAuthorizedNumber->Text) { // Add a report
// Verbose: "Message received"
mmLog->Lines->Add("(i) New message received!"); log_scroll_y++;
// Authorized user // CommandHandler();
// ^ this function placed below, because we need complete this read process first!
// if we placed it here, when CloseSoftware called, it's gonna be a crash } else {
// UNAUTHORIZED USER!! // Add a report
mmLog->Lines->Add("(!) WARNING: Unauthorized message received!"); log_scroll_y++;
(28)
}
HWDeleteLastMessage(); // Clear last data on RAM HWClearStorages();
// Process the command . . . if(unauthorized == true) {
// Normal/Verbose: "WARNING: UNAUTHORIZED NUMBER!" SWSendMessage("(!) UNAUTHORIZED NUMBER!!",""); } else {
// Authorized user CommandHandler(); }
} }
void __fastcall TfrmMain::tmrPeriodicReportTimer(TObject *Sender) {
// Periodic report feature
// check if system is currently sending message, then skip this one. mmLog->Lines->Add("(i) -- Periodic report --");
log_scroll_y++;
SWSendMessage("(i) Periodic Report",""); }
void TfrmMain::CommandHandler() {
// Switch command /* HOW TO USE :
There are 2 level in this Command Handler mechanism. 1st level is for instruction/command names
2nd level is for parameters, owned by an instruction that been called on 1st level
n level (actually inside 2nd level) is for n parameters * Please place correctly, according to it's level used * if(sender_message == "") {
} */
if(command_level == 2) { // Parameter mode // Add report
mmLog->Lines->Add("\t(i) Parameter(s) data confirmed"); // Going back to instruction mode again. (by default) command_level = 1;
switch(instruction_no) { case 3:
// List file <index> listed = false;
SliceShortcuts(StrToIntDef(sender_message,-1)); // included with reply plans.
break; case 4:
// Get file <option> // Confirmation answer if(confirmation == true) { if(sender_message == "Y") { // Set selected shortcut
selected_shortcut = String(shortcuts[option-1]); // Add report
(29)
mmLog->Lines->Add("\t(i) Sending file: " + selected_shortcut); // String(files[option-1]));
log_scroll_y++; // Send Mail SendMail();
confirmation = false; } else {
if(sender_message == "N") { // Do nothing, don't send mail! selected_shortcut = ""; // reset
SWSendMessage("(i) File selection cancelled","\t"); // Add report
mmLog->Lines->Add("\t(i) File selection cancelled by user"); log_scroll_y++;
} else {
// Unrecognize input, try again! command_level = 2;
SWSendMessage("(?) Unknown confirmation, try again!","\t"); }
} } else {
// Get option value
option = StrToIntDef(sender_message,-1);
if((option > 0) && (option < available_file_option_max+1)) { // Add report
mmLog->Lines->Add("\t(i) File selected: " + String(files[option-1]));
log_scroll_y++;
String confirm = "File: " + String(files[option-1]) + "? (Y/N)"; SWSendMessage(confirm,"\t");
// Add report
mmLog->Lines->Add("\t(i) Waiting for user confirmation.."); log_scroll_y++;
confirmation = true;
command_level = 2; // get again the 2nd parameter, Y/N } else {
// Add report
mmLog->Lines->Add("\t(!) Error option, try again!"); log_scroll_y++;
SWSendMessage("(?) Error option, try again!","\t"); confirmation = false;
command_level = 2; // error, try again! }
} break; case 5:
// Download <url> /*
Extend if the last char is '<' Stop extend if the last char is '>'
Cancel download if the current parameter is "<cancel>" */
if(sender_message != "<cancel>") { if(sender_message != "<done>") { URL = URL + sender_message;
command_level = 2; // get other parts of the URL } else {
StartDownload(); }
(30)
} else {
// Cancel download URL = ""; // reset // Add report
mmLog->Lines->Add("(i) Download cancelled by user"); log_scroll_y++;
// Normal/Verbose:
SWSendMessage("(i) Download cancelled","\t"); }
break; }
}
if(command_level == 1) { // Instruction mode confirmation = false; // default
if(sender_message == "Attention") { // Get attention from software
lblCurrentTask->Caption = "Get Attention!"; // No parameter
// Add report
mmLog->Lines->Add("(i) User command: Get Attention"); log_scroll_y++;
instruction_no = 1; if(sys_errors > 0) {
SWSendMessage("(!) Sys errors detected, total " + IntToStr(sys_errors),"\t");
} else {
SWSendMessage("(i) System OK!","\t"); }
}
if(sender_message == "Power off") { // No parameter
lblCurrentTask->Caption = "Shutdown"; // Add report
mmLog->Lines->Add("(i) User command: Computer, Power off"); log_scroll_y++;
instruction_no = 2; CloseSoftware(); }
if(sender_message == "List file") { if(enumerated == true) {
// Parameter: <index>
lblCurrentTask->Caption = "Get file list"; // Add report
mmLog->Lines->Add("(i) User command: Get file list"); log_scroll_y++;
instruction_no = 3; command_level = 2;
int total = (total_shortcuts / 3); if((total_shortcuts % 3) > 0) { total++;
}
SWSendMessage("(?) Select index: 1-" + IntToStr(total),"\t"); // Add report
mmLog->Lines->Add("\t(i) Waiting for parameter(s) data..."); log_scroll_y++;
} else {
// Add report
(31)
log_scroll_y++;
SWSendMessage("(!) Shortcuts enumerator malfunction!","\t"); sys_errors++;
} }
if(sender_message == "Get file") { if(listed == true) {
// Parameter: <option>
lblCurrentTask->Caption = "Upload file"; // Add report
mmLog->Lines->Add("(i) User command: Get file/Upload file"); log_scroll_y++;
instruction_no = 4; command_level = 2; confirmation = false;
SWSendMessage("(?) Select option: 1-3 ?","\t"); // Add report
mmLog->Lines->Add("\t(i) Waiting for parameter(s) data..."); } else {
// Add report
mmLog->Lines->Add("\t(!) You haven't list the file!"); log_scroll_y++;
SWSendMessage("(!) You haven't list the file!","\t"); }
}
if(sender_message == "Download") { // Parameter: <index>
// Add report
mmLog->Lines->Add("(i) User command: Download"); log_scroll_y++;
URL = "";
instruction_no = 5; command_level = 2;
SWSendMessage("(?) Input URL now, if done send '<done>'","\t"); SWSendMessage("(?) Otherwise, '<cancel>'","\t");
// Add report
mmLog->Lines->Add("\t(i) Waiting for parameter(s) data..."); }
if(sender_message == "Download list") { // No parameter
instruction_no = 6; // Add report
mmLog->Lines->Add("(i) User command: Download list"); log_scroll_y++;
StartDownloadList(); }
if(sender_message == "Download progress") { // No parameter
// Add report
mmLog->Lines->Add("(i) User command: Get download progress"); log_scroll_y++;
instruction_no = 7;
// Send message about download progress if(tmrDownload->Enabled == true) {
lblCurrentTask->Caption = "Get progress"; String info;
info = "(i) Download progress " + lblPercent->Caption + " completed."; SWSendMessage(info,"\t");
} else {
mmLog->Lines->Add("\t(?) No download process running! - fail"); log_scroll_y++;
SWSendMessage("(?) No download process running! - fail","\t"); }
}
(32)
// No perameter // Add report
mmLog->Lines->Add("(i) User command: Abort download"); log_scroll_y++;
instruction_no = 8; StopDownload();
URL = ""; // delete last URL }
if(sender_message == "Pause download") { // No parameter
// Add report
mmLog->Lines->Add("(i) User command: Pause download"); log_scroll_y++;
instruction_no = 9; PauseDownload(); }
if(sender_message == "Resume download") { // No parameter
// Add report
mmLog->Lines->Add("(i) User command: Resume download"); log_scroll_y++;
instruction_no = 10; ResumeDownload(); }
if(sender_message == "Restart download") { // No parameter
// Add report
mmLog->Lines->Add("(i) User command: Restart download"); log_scroll_y++;
instruction_no = 11; RestartDownload(); }
if(sender_message == "Download list progress") { // No parameter
instruction_no = 12; // Add report
mmLog->Lines->Add("(i) User command: Download list progress"); log_scroll_y++;
if(tmrDownloadList->Enabled == true) { // Send progress
String msg = "(i) Download list progress " +
IntToStr(downloading_index+1) + "/" + IntToStr(download_list_count); SWSendMessage(msg,"\t");
// Add report
mmLog->Lines->Add("\t"+msg); log_scroll_y++;
} else {
// Add report
mmLog->Lines->Add("\t(!) 'Download list' process isn't running"); log_scroll_y++;
// Send warning
SWSendMessage("(!) 'Download list' process isn't running","\t"); }
}
if(sender_message == "Stop download list") { // No parameter
instruction_no = 13; // Add report
mmLog->Lines->Add("(i) User command: Stop download list"); log_scroll_y++;
StopDownloadList(); }
if(sender_message == "Restart download list") { // No parameter
(33)
instruction_no = 14; // Add report
mmLog->Lines->Add("(i) User command: Restart download list"); log_scroll_y++;
RestartDownloadList(); }
if(sender_message == "Pause download list") { // No parameter
instruction_no = 15; // Add report
mmLog->Lines->Add("(i) User command: Pause download list"); log_scroll_y++;
PauseDownloadList(); }
if(sender_message == "Resume download list") { // No parameter
instruction_no = 16; // Add report
mmLog->Lines->Add("(i) User command: Resume download list"); log_scroll_y++;
ResumeDownloadList(); }
sender_message = ""; sender_number = ""; }
}
void TfrmMain::CloseSoftware() {
if(general_usage == false) { // Verbose: "Closing software!"
if(frmConfigure->chkVerbose->Checked == true) { SWSendMessage("(i) Closing software!",""); }
// Close port first ClosePort();
// Shutdown computer (delayed) Shutdown();
// Add current time into log String time_str = String(Time()); String date_str = String(Date());
mmLog->Lines->Add("(i) Software closed at " + date_str + " - " + time_str); // Add computer_up_time to log
mmLog->Lines->Add("(i) Computer uptime: " + lblCompUptime->Caption); log_scroll_y++;
// Add system errors counter to log
mmLog->Lines->Add("(!) System errors count: " + IntToStr(sys_errors)); log_scroll_y++;
// Save mmLog data to a log file
// accumulate current logs data into mmAllLog mmAllLog->Lines->Add(mmLog->Text);
if(frmConfigure->chkSaveLog->Checked == true) { mmLog->Clear();
// check for existing log files
if(FileExist(frmConfigure->txtProgramLog->Text) == true) { mmLog->Lines->LoadFromFile(frmConfigure->txtProgramLog->Text); }
(34)
mmAllLog->Lines->Add("");
mmAllLog->Lines->Add(mmLog->Text);
mmAllLog->Lines->SaveToFile(frmConfigure->txtProgramLog->Text); }
} else {
// General computer usage.
// This mean that the computer is going to be used by user. // so dont process: Shutdown SaveLog, etc
MessageBox(Handle,"Computer general usage preferred. Closing software..","Acknowledged",MB_OK|MB_ICONINFORMATION);
if(port_open == true) { // port_open var actually useful for this kind of purpose
ClosePort(); }
}
// Freeing any used RAM/Memory variables if(download_list_count > 0) {
for(int i = 0 ; i < download_list_count ; i++) { free(download_file_list[i]);
}
free(download_file_list); }
for(int i = 0; i < 3 ; i++) { free(shortcuts[i]); free(files[i]); }
free(shortcuts); free(files);
// Terminate application Application->Terminate(); }
// ========================================================================== // DOWNLOAD SUBSYSTEM
// ========================================================================== void __fastcall TfrmMain::tmrDownloadListTimer(TObject *Sender)
{
download_mode = 2; // Set status as well
lblDownloadJob->Caption = IntToStr(downloading_index+1) + " / " + IntToStr(download_list_count);
// Monitor tmrDownload enable/disable if(tmrDownload->Enabled == false) {
// current downloading_file_index has been completed! / fail! / etc // Next file!
downloading_index++;
if(downloading_index < download_list_count) {
URL = String(download_file_list[downloading_index]); DownloadListPerFile();
} else {
// Turn off this timer tmrDownload->Enabled = false; tmrDownloadList->Enabled = false; // Add report
mmLog->Lines->Add("\t(i) Download list has been completed!"); log_scroll_y++;
// Send info
SWSendMessage("(i) Download list completed!","\t"); download_mode = 0;
(35)
} }
void TfrmMain::StartDownloadList() {
if(tmrDownloadList->Enabled == false) { // make sure downloader currently NOT downloading a job
if(download_list_count > 0) { // Freeing last used memory
for(int i = 0 ; i < download_list_count ; i++) { free(download_file_list[i]);
}
free(download_file_list); }
if(download_mode == 0) { // Open list file
String list_file = frmConfigure->txtDownloadListPath->Text; String temp;
if( FileExist(list_file) == true ) { char * retStr;
retStr = (char*) calloc( 3001, sizeof(char)); memset(retStr,0,3001);
// Load selected download list file // Get the count
GetPrivateProfileString(
"Properties","Count","0",retStr,3000,list_file.c_str());
download_list_count = StrToIntDef(String(retStr),0); // Allocate for variables
download_file_list = (char **) calloc( download_list_count , sizeof(char*));
for(int i = 0 ; i < download_list_count ; i++) {
download_file_list[i] = (char*) calloc( 3001, sizeof(char)); memset(download_file_list[i],0,3001);
}
// Get the list
for(int i = 0 ; i < download_list_count ; i++) { memset(retStr,0,3000);
temp = "Addr" + IntToStr(i); GetPrivateProfileString(
"List",temp.c_str(),"",retStr,3000,list_file.c_str()); URL = String(retStr);
strncpy(download_file_list[i],retStr,strlen(retStr)); }
free(retStr);
if(download_list_count > 0) { // Send info
SWSendMessage("(i) Downloading the list...","\t"); // Add report
mmLog->Lines->Add("\t(i) Downloading the list..."); log_scroll_y++;
lblCurrentTask->Caption = "Downloading the list"; // Setup download-list variables
downloading_index = 0;
// Set the 1st file, and download it URL = String(download_file_list[0]); DownloadListPerFile();
(36)
// Activate Download timer download_mode = 2;
tmrDownloadList->Enabled = true; } else {
// Add report
mmLog->Lines->Add("\t(!) URLs not found! - fail"); log_scroll_y++;
// Send warning
SWSendMessage("(!) URLs not found! - fail","\t"); sys_errors++;
} } else {
// Add report
mmLog->Lines->Add("\t(!) Download list not found!"); log_scroll_y++;
// Send warning
SWSendMessage("(!) Download list not found!","\t"); }
} else {
// Add report
mmLog->Lines->Add("\t(!) Download is currently running! - fail"); log_scroll_y++;
// Send warning
SWSendMessage("(!) Download is currently running! - fail","\t"); }
} else {
// Add report
mmLog->Lines->Add("\t(!) Currently downloading a list! - fail"); log_scroll_y++;
// Send warning
SWSendMessage("(!) Currently downloading a list! - fail","\t"); }
}
void TfrmMain::StopDownloadList() {
if((download_mode == 2) && (tmrDownloadList->Enabled == true)) { // Turn off download-log monitor
tmrDownloadList->Enabled = false; tmrDownload->Enabled = false; // Turn off download LED
imgLED->Picture = imgLEDoff->Picture; // Set the status
lblDownloaderStatus->Caption = "Aborted"; lblCurrentTask->Caption = "Stop download list"; // Close the downloader process
TerminateProcess(wget_hwnd,1); Sleep(1000); // 1 sec delay // Delete the log file!
DeleteFile(frmConfigure->txtDownloaderLogPath->Text); // Add report
mmLog->Lines->Add("\t(i) Download list stopped!"); log_scroll_y++;
// Send info
SWSendMessage("(i) Download list stopped!","\t"); download_mode = 0; // no mode is running
(1)
Universitas Kristen Maranatha 2
perangkat keras yang berfungsi untuk mendengarkan segala perintah yang diterima, dan mengirimkannya ke komputer untuk diproses lebih lanjut. Selain itu keunggulan lain yang ditawarkan oleh perangkat keras tersebut adalah dapat mengendalikan sistem tenaga listrik dalam komputer secara tepat, tujuan penggunaannya dimaksudkan agar listrik yang dipakai komputer tidak terbuang secara sia-sia, dan dapat dilakukan efisiensi apabila komputer tidak digunakan.
1.2 Identifikasi Masalah
Bagaimana membuat sistem pengendalian proses unduh menggunakan telepon genggam berbasis layanan SMS?
1.3 Tujuan Penelitian
Membuat sistem pengendalian proses unduh menggunakan telepon genggam berbasis layanan SMS.
1.4 Pembatasan Masalah
Sistem kendali komputer ini akan diimplementasikan berdasarkan tiga buah aplikasi.
1. Memantau dan mengontrol proses mengunduh file dari internet. 2. Menyalakan dan mematikan sistem tenaga listrik komputer.
3. Mengirim email dengan file yang telah disertakan (dan proses sebelumnya pengguna telah memilih file tersebut dari daftar file yang telah disediakan).
Secara perangkat lunak / software
1. Software dibuat, khusus untuk dijalankan pada sistem operasi Microsoft Windows XP 32-bit.
(2)
Universitas Kristen Maranatha 3
3. File yang akan diunggah, hanya dapat dipilih dari satu lokasi, yaitu direktori My Recent Documents pengguna komputer tersebut.
Secara perangkat keras / hardware
1. Menggunakan dua buah mikrokontroller berarsitektur 8051, seri AT89C51.
2. Program mikrokontroller dibuat dalam bahasa assembly.
3. Pesan yang dikirimkan oleh perangkat keras ini maksimum berjumlah 42 karakter ASCII. Karakter selain ASCII* yang didukung tidak disarankan.
4. Pesan Unicode yang dapat ditranslasikan oleh perangkat keras ini hanya mendukung penggunaan karakter ASCII yang didukung saja. 5. Komunikasi komputer dengan perangkat keras dilakukan melalui
port parallel.
6. Nomor pengguna yang memiliki otoritas hanya dapat diubah, dengan cara mengubah isi program hardware yang bersangkutan.
Software yang digunakan dalam tugas akhir ini antara lain : 1. Borland C++ Builder 6.
2. ASEM-51.
3. Jonathan Chandra Programmer [L]. 4. Blat.
5. Stunnel. 6. GNU Wget.
1.5 Sistematika Penulisan
BAB I PENDAHULUAN
Bab ini membahas tentang tujuan dan latar belakang mengenai proyek tugas akhir ini.
(3)
Universitas Kristen Maranatha 4
BAB II LANDASAN TEORI
Untuk memantapkan perancangan yang akan dilakukan pada proyek tugas akhir ini dilakukan pencarian terhadap teori – teori yang dapat mendukung berjalannya proyek tugas akhir ini, dan juga pengaplikasian ilmu yang didapat dari teori – teori tersebut.
BAB III PERANCANGAN PERANGKAT KERAS DAN LUNAK
Pada bab ini dibahas mengenai cara pembuatan dan perancangan perangkat lunak / software dan juga perangkat keras / hardware. Dalam bab ini juga dibahas alasan mengapa digunakan dua buah perangkat keras.
BAB IV HASIL DAN PENGAMATAN
Bab IV ini membahas tentang hasil percobaan dan pengamatan yang dilakukan atas proyek tugas akhir yang telah direncanakan pada bab sebelumnya.
BAB V KESIMPULAN DAN SARAN
Setelah melakukan percobaan dan juga pengamatan terhadap proyek tugas akhir yang telah dilakukan, dapat diambil beberapa kesimpulan dan juga saran yang mungkin dapat berguna dalam proses pengembangan kedepannya.
(4)
Universitas Kristen Maranatha 172
BAB V
KESIMPULAN DAN SARAN
5.1 Kesimpulan
Sistem pengendalian proses unduh secara jarak jauh, dengan menggunakan layanan SMS telah berhasil dilakukan. Pembuktiannya berdasarkan pengamatan akan perintah – perintah yang dikirim oleh pengguna dan dilaksanakan oleh sistem. Seluruh perintah yang dikirim telah dilaksanakan secara seluruhnya dan sesuai dengan apa yang diharapkan selama perancangan.
5.2 Saran
Untuk menghindari terjadinya SMS spoofing, disarankan untuk tidak mempublikasikan nomor telepon genggam yang digunakan oleh dua buah pihak (nomor pengguna dan juga nomor komputer).
Selain digunakan dalam hal pengendalian proses unduh, software ini dapat dikembangkan dengan menambahkan fitur – fitur lainnya, seperti menjalankan aplikasi secara spesifik, mengunggah file, melakukan transaksi data dengan pengguna (dengan pemanfaatan database / bank data), dan banyak lainnya.
(5)
173
DAFTAR PUSTAKA
ASUS Motherboard P4S533-X User Guide Datasheet 2N3904
Datasheet 2N3906 Datasheet 74LS373 Datasheet AT89C51
Datasheet LCD 16x2 JHD162A Datasheet LM339
Eberspächer, Jörg, Christian Bettstetter, Hans-Joerg Vögel, Christian Hartmann., GSM: architecture, protocols and services, 2009
Microsoft Corporation, “MSDN Library – January 2001”
Prasetia, Retna & Catur Edi Widodo., Teori dan Praktek Interfacing Port Paralel dan Port Serial Komputer dengan Visual Basic 6.0, Andi, Yogyakarta, 2005
Zukhri, Zainudin., Pemrograman Visual dengan C++ Builder, Graha Ilmu, Yogyakarta, 2005
http://atmel.com/dyn/resources/prod_documents/doc8016.pdf, 18 Agustus 2011 http://en.wikibooks.org/wiki/Serial_Programming/MAX232_Driver_Receiver, 14
Agustus 2011
http://en.wikipedia.org/wiki/GSM_03.38, 1 Juni 2011
http://en.wikipedia.org/wiki/Hayes_command_set, 16 Agustus 2011 http://en.wikipedia.org/wiki/SMS_spoofing, 20 Agustus 2011
http://levkov.net/Proekt/Common/8051TTRL/Tutorial/Class10.pdf, 16 Agustus 2011
http://mochalygin.ru/doc/dg_at_2004_r6b.pdf, 24 Febuari 2011
(6)
174 http://www.beyondlogic.org, 1 Maret 2011 http://www.dreamfabric.com/sms/ , 19 Mei 2011