SOFTWARE

BAHAGIAN PERISIAN

            Dalam projek ini, kami menggunakan program C (Turbo C) untuk mengawal controller 8255A ( Programmable Input/ Output Adapter. Program yang ditulis dengan program Delphi 3.0 Client Server Suite adalah bahagian program yang paling penting dan utama untuk menjayakan projek ini. Projek ini secara keseluruhannya menggunakan konsep pengawalan perkakasan melalui IP address sesebuah server yang dipasangkan dengan hardware (peralatan elektrik yang hendak dikawal). Pengawalan hardware dilaksanakan oleh bahagian client di mana dengan pelaksanaan program client.exe, client tersebut akan dapat mengawal hardware pada bahagian server yang memiliki program yang dikenali sebagai windll.exe.

            Ini adalah berdasarkan konsep remote control dari hubungan client-server melalui Internet yang dipraktikkan oleh kebanyakan perisian misalnya NetbusPro, GirlFriend 1.35, BackOrifice dan sebagainya.

 

BAHAGIAN PENGATURCARAAN C

Aturcara-aturcara di bawah digunakan untuk berantaramuka dengan controller 8255 yang seterusnya membolehkan pengawalan ke atas peralatan-peralatan elektrik 240V. Setiap aturcara ini dibiarkan pendek dan mudah untuk menyenangkan pengaplikasiannya ke dalam prosedur-prosedur dalam unit main.pas bagi program client.exe (Delphi 3). Sila rujuk unit main.pas untuk memerhatikan panggilan fail-fail .exe untuk program C bagi melaksanakan kawalan hardware.

 

INIT.C

#include <stdio.h>

#include <dos.h>

#include <conio.h>

int main(void)

{

/* Untuk initialize control register port 1 bagi penggunaan port 1A, 1B dan 1C */

outportb(435,128); /* Data 128 bagi ‘initialize’kan control port beralamat 435 */

outportb(432,255);

outportb(432,0);

}

 

ON1.C

#include <stdio.h>

#include <dos.h>

#include <conio.h>

main(void){

/*ALAT 1 ON*/

outportb(432,255); /* Data 255 untuk ONkan port 1A beralamat 432 */

}

 

OFF1.C

#include <stdio.h>

#include <dos.h>

#include <conio.h>

main(void){

/* ALAT 1 OFF */

outportb(432,0); /* Data 0 untuk OFFkan port 1A */

}

 

ON2.C

#include <stdio.h>

#include <dos.h>

#include <conio.h>

main(void){

/* ALAT 2 ON */

outportb(433,255); /* Data 255 untuk ONkan port 1B beralamat 433 */

}

 

OFF2.C

#include <stdio.h>

#include <dos.h>

#include <conio.h>

main(void){

/* ALAT 2 OFF */

outportb(433,0); /* Data 0 untuk OFFkan port 1B */

}

 

ON3.C

#include <stdio.h>

#include <dos.h>

#include <conio.h>

main(void){

/* ALAT 3 ON */

outportb(434,255); /* Data 255 untuk ONkan port 1C beralamat 434 */

}

 

OFF3.C

#include <stdio.h>

#include <dos.h>

#include <conio.h>

main(void){

/* ALAT 3 OFF */

outportb(434,0); /* Data 0 untuk OFFkan port 1C */

}

 

OFFALL.C

#include <stdio.h>

#include <dos.h>

#include <conio.h>

main(void){

/* Memadamkan semua port iaitu 1A, 1B dan 1C */

outportb(432,0);

outportb(433,0);

outportb(434,0);

}

 

* Sila rujuk helaian manual yang disertakan bersama bagi menentukan alamat port yang digunakan untuk port-port berkenaan. Gunakan alamat berbentuk desimal dalam program.(ditukar dari bentuk HEX seperti yang ditunjukkan).

 

 

KONSEP YANG DIAPLIKASIKAN DALAM PROGRAM CLIENT

Dalam projek ini, kami telah menggunakan konsep pengawalan perkakasan melalui IP address sesebuah server yang dipasangkan dengan hardware (peralatan elektrik yang hendak dikawal) seperti dalam program Girl Friend v1.35 yang ditunjukkan seperti paparan di bawah:-

 

Dengan ini, kami telah memperolehi suatu konsep hubungan client-server yang perlu diterapkan dalam projek kami. Maka, kami telah menggunakan prosedur-prosedur tertentu yang diperlukan sahaja dalam program client kami.

Selepas penerokaan program ini buat jangkamasa yang lama, kami telah memperolehi suatu program yang bersesuaian dengan objektif kami tanpa menggunakan semua prosedur seperti dalam GF di atas; misalnya melalui pengabaian bahagian-bahagian Show passes, Send message, File manager, Reset Password List, About, Change dan Server’s Answer. Maka paparan yang lebih ringkas untuk program client yang terhasil:-

 

Satu-satu bahagian yang kami praktikkan dengan lebih lanjut untuk penghasilan fungsian yang kami perlukan adalah bahagian Custom untuk perlaksanaan fail .exe secara terus melalui Internet.

Misalnya bagi GF, ia adalah seperti berikut:-

; dimana arahan {U}+ABC.exe perlu dimasukkan untuk melaksanakan fail ABC.exe tetapi bagi program yang kami hasilkan, ia akan melaksanakan fail .exe tertentu secara automatik setelah button itu ditekankan.

 

 

BAHAGIAN PROGRAM CLIENT DENGAN PERISIAN DELPHI 3.0 CLIENT SERVER SUITE.

Bahagian ini merupakan bahagian paling utama untuk menghasilkan program client.exe yang membolehkan pengguna di bahagian client melaksanakan fail-fail .exe (program C) di bahagian server melalui Internet dengan adanya fail windll.exe di bahagian server terlebih dahulu.

Program client.dpr (delphi project file) akan menggunakan unit utama main.pas untuk melaksanakan semua prosedur-prosedur bagi pengawalan hardware melalui form yang diwujudkan dengan perisian Delphi.

Setiap projek Delphi mengandungi kod sumber Object Pascal yang dikompil oleh Delphi kepada satu aplikasi akhir atau ‘dynamic-link library’. Bahagian utama bagi kod sumber projek ialah ‘project file’. Delphi akan memperbaharui fail ini sepanjang perkembangan projek yang ini dihasilkan. Apabila projek dikompil atau dilaksanakan, pengkompil Delphi menghasilkan sama ada fail boleh laksana atau dll dengan nama yang sama dengan ‘project file’, tetapi dengan extension .EXE atau .DLL.

Melalui ‘view the project file’, unit-unit dan form-form utama yang membentuk projek boleh dikenalpastikan. Jika terdapat penambahan form atau unit-unit pada projek, Delphi akan memperbaharui kod sumber projek secara automatik. (Klik pada Project Manager dan View Project Source).

 

 

CLIENT.DPR

program client; {mendeklarasikan pencam project}

uses {menunjukkan unit-unit yang digunakan oleh project}

Forms, {pencam standard unit…termasuk unit-unit jenis "non-form"}

main in 'main.pas' {ClientForm}; {dan unit-unit jenis form iaitu main.pas}

{$R *.RES} {link ke fail-fail sumber atau resource file}

begin {memulakan blok utama program}

Application.Initialize;

Application.Title := 'Internet House Controller'; {Tajuk pada aplikasi}

Application.CreateForm (TClientForm, ClientForm); {Hasilkan secara automatik}

{form pertama}

Application.Run; {laksanakan aplikasi}

end. {tamatnya blok utama program}

 

Form merupakan bahagian penting dalam kebanyakan projek Delphi. Biasanya ia direkacipta dengan visual tool Delphi, dan Delphi menyimpan deskripsi binari form tersebut di dalam form files. Setiap form bagi projek Delphi mempunyai satu unit yang berkenaan (associated unit). Unit ini mengandungi kod sumber untuk mana-mana ‘event handlers’ yang diletakkan pada event untuk form. Ia juga dikenali sebagai form unit.

 

MAIN.PAS

// Unit ini merupakan unit utama untuk program "client"

unit main; {pencam unit}

interface

uses

Windows, SysUtils, Classes, Forms, StdCtrls, Buttons, ScktComp,

ComCtrls, Controls; // Senarai unit yang digunakan

type

TClientForm = class(TForm) {deklarasi class}

stbStatus: TStatusBar;

ClientSocket: TClientSocket;

sbConnect: TSpeedButton;

sbExit: TSpeedButton;

Label1: TLabel;

Label2: TLabel;

ilWin: TImageList;

IP: TComboBox;

portvalue: TComboBox;

KIPAS: TLabel;

Label3: TLabel;

Label4: TLabel;

Off1: TBitBtn;

On1: TSpeedButton;

On2: TBitBtn;

Off2: TBitBtn;

On3: TBitBtn;

Off3: TBitBtn;

Enable: TBitBtn;

// Terdapat 12 procedure yang dicipta dalam unit ini.

procedure ClientSocketConnect (Sender: TObject;

Socket: TCustomWinSocket);

procedure ClientSocketError (Sender: TObject; Socket: TCustomWinSocket;

ErrorEvent: TErrorEvent; var ErrorCode: Integer);

procedure FormClose (Sender: TObject; var Action: TCloseAction);

procedure sbConnectClick (Sender: TObject);

procedure sbExitClick (Sender: TObject);

procedure EnableClick (Sender: TObject);

procedure On1Click (Sender: TObject);

procedure Off1Click (Sender: TObject);

procedure On2Click (Sender: TObject);

procedure Off2Click (Sender: TObject);

procedure On3Click (Sender: TObject);

procedure Off3Click (Sender: TObject);

protected

IsServer: Boolean;

end;

var

ClientForm: TClientForm;

Server: String;

implementation {Bahagian implementasi}

type iptype = record

ipcount, pcount:integer;

ip:array[0..99] of string[25];

port:array [0..99] of integer;

end;

var

Fl: FILE of IPType;

scanning : boolean;

Connection, ServerAnswer : boolean;

CurrIP: string;

CurrPort : integer;

{$R *.DFM} {direktif pengkompil untuk link form file main.dfm}

// Prosedur untuk button yang berupaya untuk menghubungkan alamat IP

procedure TClientForm.sbConnectClick(Sender: TObject);

var strtos:string;

begin

strtos:='C:\PROJEK\OFFALL.EXE'; // fail OFFALL.EXE yang digunakan

clientsocket.socket.SendText ('{U}'+strtos); // bagi memadamkan alatan semua port

if sbConnect.caption='Disconnect' then

begin

ilWin.GetIcon (0, ClientForm.Icon); // Bahagian untuk mendeklarasikan

sbConnect.caption:='Connect'; // pelaksanaan semua button ketika

On1.Enabled:=false; // button disconnect ditekan

Off1.Enabled:=false;

On2.Enabled:=false; // Semua button adalah tidak aktif semasa

Off2.Enabled:=false; // mula-mula melaksanakan CONNECT

On3.Enabled:=false;

Off3.Enabled:=false;

Enable.Enabled:=false;

clientsocket.socket.SendText('Quiting..');

clientsocket.Close;

stbStatus.Panels[0].Text := 'Disconnected';

exit;

end;

if (Length(IP.Text)>0) then

begin

if portvalue.text>'' then ClientSocket.Port:=strtoint(portvalue.Text) else

begin

ClientSocket.Port:=21554;

PortValue.Text:=inttostr (ClientSocket.Port);

end;

CurrPort:=ClientSocket.Port;

if Pos('+', IP.Text)=0 then

begin

scanning:=false;

CurrIP:=IP.Text;

with ClientSocket do

begin

Address := IP.Text;

Open;

end

end

end;

end;

 

// Procedure untuk membolehkan hubungan antara client dengan server

procedure TClientForm.ClientSocketConnect(Sender: TObject;

Socket: TCustomWinSocket);

var

i:integer;

a, b:boolean;

sound:string;

begin

a:=false;

b:=false;

sound:='C:\PROJEK\11.WAV';

clientsocket.Socket.sendtext ('{S}'+sound);

for i:=0 to ip.items.count+1 do if ip.Items[i]=clientsocket.address then a:=true;

for i:=0 to portvalue.items.count+1 do if

portvalue.Items[i]=inttostr(clientsocket.port) then b:=true;

if a<>true then ip.items.Add(clientsocket.address);

if b<>true then portvalue.items.Add(inttostr(clientsocket.port));

ServerAnswer:=true;

Connection:=true;

ilWin.GetIcon (1, ClientForm.Icon);

sbConnect.caption:='Disconnect';

stbStatus.Panels[0].Text := 'Connected to: ' + Socket.RemoteAddress;

clientsocket.socket.SendText ('ver');

ClientSocket.Socket.SendText ('time');

On1.Enabled:=true;

Off1.Enabled:=false;

On2.Enabled:=true; // Hanya button untuk ONkan alat-alat yang aktif sahaja

Off2.Enabled:=false; // apabila client-server dihubungkan

On3.Enabled:=true;

Off3.Enabled:=false;

Enable.Enabled:=true;

end;

// Procedure untuk menunjukkan hubungan client-server tidak dapat dilaksanakan

procedure TClientForm.ClientSocketError(Sender: TObject;

Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;

var ErrorCode: Integer);

begin

if not(scanning) then

stbStatus.Panels[0].Text := 'Error connecting to : ' + CurrIP

else

begin

ServerAnswer:=true;

Connection:=false;

end;

ErrorCode := 0;

end;

// Procedure untuk enable semua port 8255

procedure TClientForm.EnableClick(Sender: TObject);

var strtos,sound:string;

begin

strtos:='C:\PROJEK\INIT.EXE';

sound:='C:\PROJEK\111.WAV';

clientsocket.socket.SendText ('{U}'+strtos);

clientsocket.socket.SendText ('{S}'+sound);

Enable.Enabled:=false;

end;

procedure AnswerF12 (KC : Word);

var TMS : string;

begin

if KC=VK_F12 then

begin

TMS:='Internet House Controller';

if ClientForm.ClientSocket.Socket.Connected then

TMS:=TMS+'. Connected with '+ClientForm.ClientSocket.Address;

ClientForm.Hide;

end;

end;

 

// Procedure untuk button menghidupkan lampu atau alat 1

procedure TClientForm.On1Click(Sender: TObject);

var strtos,sound:string;

begin

strtos:='C:\PROJEK\ON1.exe';

sound:='C:\PROJEK\1.WAV';

clientsocket.socket.SendText ('{U}'+strtos);

clientsocket.socket.SendText ('{S}'+sound);

On1.Enabled:=false;

Off1.Enabled:=true;

end;

// Procedure untuk button memadamkan lampu atau alat 1

procedure TClientForm.Off1Click(Sender: TObject);

var off,sound:string;

begin

off:='C:\PROJEK\OFF1.exe';

sound:='C:\PROJEK\0.WAV';

clientsocket.Socket.sendtext('{U}'+off);

clientsocket.Socket.sendtext('{S}'+sound);

On1.Enabled:=true;

Off1.Enabled:=false;

end;

// Procedure untuk button menghidupkan kipas atau alat 2

procedure TClientForm.On2Click(Sender: TObject);

var strtos,sound:string;

begin

strtos:='C:\PROJEK\ON2.exe';

sound:='C:\PROJEK\1.WAV';

clientsocket.socket.SendText ('{U}'+strtos);

clientsocket.socket.SendText ('{S}'+sound);

On2.Enabled:=false;

Off2.Enabled:=true;

end;

// Procedure untuk button memadamkan kipas atau alat 2

procedure TClientForm.Off2Click(Sender: TObject);

var off,sound:string;

begin

off:='PROJEK\OFF2.exe';

sound:='C:\PROJEK\0.WAV';

clientsocket.Socket.sendtext('{U}'+off);

clientsocket.Socket.sendtext('{S}'+sound);

On2.Enabled:=true;

Off2.Enabled:=false;

end;

 

// Procedure untuk button menghidupkan radio atau alat 3

procedure TClientForm.On3Click(Sender: TObject);

var strtos,sound:string;

begin

strtos:='C:\PROJEK\ON3.EXE';

sound:='C:\PROJEK\1.WAV';

clientsocket.socket.SendText ('{U}'+strtos);

clientsocket.socket.SendText ('{S}'+sound);

On3.Enabled:=false;

Off3.Enabled:=true;

end;

 

// Procedure untuk button memadamkan radio atau alat 3

procedure TClientForm.Off3Click(Sender: TObject);

var off,sound:string;

begin

off:='C:\PROJEK\OFF3.exe';

sound:='C:\PROJEK\0.WAV';

clientsocket.Socket.sendtext('{U}'+off);

clientsocket.Socket.sendtext('{S}'+sound);

On3.Enabled:=true;

Off3.Enabled:=false;

end;

 

// Procedure untuk keluar daripada program atau keluar dari FORM

procedure TClientForm.FormClose(Sender: TObject; var Action: TCloseAction);

var ipdata:iptype;

i:integer;

begin

AssignFile (fl, 'hosts.ip');

if fileexists ('hosts.ip') then reset (fl)

else rewrite (fl);

seek(fl,0);

for i:=0 to ip.items.Count-1 do ipdata.ip[i]:=ip.items[i];

for i:=0 to portvalue.items.Count-1 do ipdata.port[i]:=strtoint(portvalue.items[i]);

ipdata.pcount:=portvalue.items.count;

ipdata.ipcount:=ip.items.count;

write(fl,ipdata);

closefile(fl);

if clientsocket.Active then begin

clientSocket.Socket.SendText('Quiting..');

clientsocket.close;

end;

end;

// Procedure untuk button exit

procedure TClientForm.sbExitClick(Sender: TObject);

var strtos:string;

begin

strtos:='C:\PROJEK\OFFALL.EXE'; // fail untuk memadamkan semua button ON

clientsocket.socket.SendText ('{U}'+strtos);

clientsocket.Socket.SendText ('Quiting..');

if clientsocket.Active then clientsocket.close;

halt(0);

end;

end.

 

 

FAIL-FAIL .DCU dan .DFM

Pengkompil akan mengkompil kod sumber untuk setiap unit jika terdapat sebarang perubahan pada kod sumber bagi unit. Ini menghasilkan fail dengan extension .DCU (delphi compiled unit); bagi projek kami main.dcu terhasil. Delphi menyimpan form dan komponen-komponennya dalam fail-fail .DFM (delphi form file). Satu form file adalah perwakilan binari bagi ‘properties’ untuk sesuatu form dan komponen-komponennya. Dalam projek kami main.dfm mengandungi ‘properties’ bagi form utama yang dihasilkan bersama unit main.pas.

 

 

PEMBINAAN APLIKASI DELPHI

PENGHASILAN KOMPONEN/ OBJEK-OBJEK DALAM SESEBUAH FORM

Untuk membina ‘Delphi application’, letakkan komponen pada form baru, setkan properties bagi komponen itu dan sediakan kod bagi ‘event handler’ untuknya. Komponen-komponen boleh diperolehi dari Component pallette, (berdasarkan kumpulan perfungsiannya) dan juga dari Delphi Visual Component Library.

* Klikkan komponen yang dikehendaki dari component pallete, dan kemudian klikkan pada form tersebut.

 

 

* Atau pilihkan komponen dari Component List untuk ditambahkan ke form.

 

Bahagian properties bagi Object Inspector membolehkan "design-time properties" bagi komponen diset pada form yang ingin dibentuk. Kod sumber bagi "design-time properties" boleh ditulis di dalam event handlers. (merupakan fungsian yang ingin dijalankan bagi button/ komponen tertentu misalnya :-

Apabila button1 diklik, form bertukar warna ke hijau. Di bawah ialah kod event handler untuk event OnClick :-

procedure TForm1.Button1Click(Sender: TObject);

begin

Form1.Color := clGreen;

end;

            Maka, bahagian kod ini akan dimasukkan ke bahagian implementasi unit bagi form tersebut dan deklarasi type bagi prosedur ini akan diwujudkan secara automatik pada kod sumber dalam unit.

 

PELAKSANAAN PROGRAM INTERNET HOUSE CONTROLLER (CLIENT.EXE)

  1. Kedua-dua pihak perlu sentiasa online untuk membolehkan hubungan client-server dilaksanakan melalui Internet.
  2. Fail boleh laksana client.exe merupakan fail yang perlu dilaksanakan oleh bahagian client (bahagian yang akan mengawal hardware di bahagian server) melalui hubungan client-server.
  3. Capaian pada bahagian server boleh dilakukan dengan syarat:-

 

Kaedah alternatif sekiranya maklumat IP address server disembunyikan atau N/A ialah gunakan program yang boleh didownload dari Internet seperti Ipsniffer.exe dan sebagainya untuk mengenalpasti IP address tersebut.

 

 

 

 

 

 

 

 

  1. Semasa client.exe dilaksanakan, paparan di atas akan kelihatan pada skrin bahagian client tetapi tidak dapat dilihat oleh bahagian yang dikawal iaitu bahagian server.
  2. Untuk bahagian client, berikut merupakan langkah-langkah untuk mengawal hardware yang dipasangkan pada bahagian server:-
  1. Masukkan IP address server yang telah dikenalpasti terlebih dahulu ke kotak IP address.
  2. Alamat 21554 merupakan alamat default yang tidak perlu diubah untuk menghasilkan hubungan client-server bagi program ini.
  3. Klikkan pada butang Connect untuk berhubung dengan bahagian server tersebut. Ini boleh ditunjukkan pada pernyataan di bahagian bawah paparan.
  4. Klikkan pada butang enable untuk enablekan control port bagi port 1A, 1B dan 1C bagi controller 8255 yang digunakan.
  5. Kini, mana-mana peralatan elektrik yang ingin dikawal boleh dipilih dan untuk ONkan mana-mana satu, hanya perlu klikkan pada butang ON yang sedang aktif.
  6. Semasa alat tertentu sedang ON, butang OFF bagi alat itu akan aktif dan bersedia untuk diOFFkan pada bila-bila masa.
  7. Aplikasi ini dapat mengendalikan lebih dari satu peralatan pada satu masa di mana kesemua peralatan boleh berada dalam keadaan ON pada masa yang sama.
  8. Jika ingin memutuskan hubungan dengan bahagian server, hanya tekankan butang Disconnect dan semua peralatan akan OFF secara automatiknya. Ini dapat ditunjukkan pada pernyataan di bahagian bawah paparan.
  9. Untuk keluar dari aplikasi ini, tekankan butang exit.