Sistem Pengendalian Proses Unduh Menggunakan Telepon Genggam Berbasis Layanan SMS.

(1)

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

E-mail

...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

e-mail

... 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());

// Email

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