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 initializekan 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 Servers 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)
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.