PA Dokumentation


Indholdsfortegnelse

Forord

Vi vil her forsøge at forklare hvordan lysstyring virker. Vi har valg at gøre det ved at gå i dybden med hvordan vores produkt virker. Fordi der findes så uendelige mange og komplekse metoder at lave lysstyring på. Derfor vil dette være en mellemting mellem besvarelsen af problem formulering og teknisk dokumentation af vores produkt, kort sagt fordi vi er nød til at minske kompleksisteten ved at gribe fat i et konkret eksempel.

For at kunne bruge denne dokumentation til at lave en server mange til vores skal man have grundlæggende forståelse for mange ting her i bland Unix/Linux, Debian/Ubuntu, raid opsætninger. Samt programmering i C, PHP, Bash og Javascript. Sidst men ikke mindst kræves et rimeligt kendskab til elektronik. Vi vil i ikke komme ind på forklaring af disse teknologier, fordi det ligger uden for vores rammer. Hvis ikke du har kendskab til disse teknologier vil vi anbefale de bøger og artikler vi har angivet i appendiks B.

Valg af server hardware

Det hardware vi brugte til dette projekt er, efterhånden, af ældre dato. Dette burde dog ikke gøre noget speciel forskel idet vores projekt ikke stiller nogle voldsomme krav til hardwaren. Vi har valgt at benytte en gammel Intel Celeron 400mhz processer, Et Asus server bundkort (plads til to processers), 384MB SD-ram, og 2 stk. 13GB, som blev sat i raid0. Som man tydelig kan se er det ikke prægende hardware vi har brugt. Vi valgte dette hardware af to grunde, dels fordi vi lige havde det ved hånden idet vi havde en masse forskellige komponenter liggende og dels fordi det ressourcemæssigt er mere end rigeligt til at udføre vores ønskede opgave.

Andre muligheder

Hvis vi skulle have lavet noget mere fornuftigt, hardwaremæssigt, skulle det klart være at have investeret i helt nyt server hardware, dette vil dog også forudsætte at den også skal bruges til andet end at tænde og slukke lys. Hvis vi skulle have investeret i nyt hardware ville budgettet blive enormt overskredet, men vi ville til gengæld have haft meget meget mere regnekraft, det usmarte ved at bruge nyt hardware i vores tilfælde er prisen og strømforbruget, det ville simpelthen blive alt for dyrt i længden. Havde vi valgt at invistere i en helt ny computer skal det også siges at vi vil have fået meget mere ydelse gennem f.eks. nyere teknologier, her kan nævnes SD og DDR-ram, hvor SD er single data og DDR er Dual Data Rate. DDR er altså teoretisk dobbelt så hurtig. En anden ting der ville være meget hurtigere i en ny computer ville være processeren, hvor vi ville kunne gå fra intels skrapede model "Celeron" til deres top model inden for server verdenen Xeon. Hastigheden på processeren er også helt en anden, hvor vi har en 400mhz kunne vi få fat i en 2,6-2,8ghz processer. Det er altså tydeligt at se der er sket meget og at der er meget power at hente i de nye maskiner. Men som tidligere sagt er vores opgave på ingen måde noget der er krævende for computeren.

Vi kunne også have valgt at bruge en VIA baseret computer, her tænkes på små computere med VIA processer, det smarte ved dem er det lave strømforbrug, de er forholdsvis billige og er meget små i forhold til almindelige computere, der eneste problem er at de er, efterhånden, lidt bagefter de nyeste teknologier. Det er altså mest henvendt til små og ældre computere at benytte sig af VIA, derfor er det heller ikke særligt udbredt. Grunden til vi ikke valgte et sådan system var faktisk ikke af økonomiske oversager, da de billigeste kan findes helt ned til 700-800kr for det meste af computeren. Vi valgte at springe over dette valg fordi vi havde noget liggende som vi lige så godt kunne bruge.

Valg af operativt system

Vi har valgt at benytte Ubuntu som operativt system på vores server. Ubuntu er en Linux distro, dvs. en version af GNU/Linux operativ systemet, som er frit tilgængelig for alle. Vi har slet ikke overvejet at benytte Microsoft Windows Server 2003, også selvom vi rent faktisk havde softwaren til rådighed. Forklaringen er at Windows er meget ustabilt, hvilket ikke kan anbefales til en "mission critial" applikation, man kan jo have at den begynder at tænde og slukke i tid og utide. Desuden er Windows ikke særligt sikkert og der er vist ingen der har lyst til at crackere tager kontrol over lysstyringssystemet.

Vi har kigget på flere forskellige *nix systemer f.eks: Solaris, Debian, SuSE, Fedora, CentOS og selvfølgelig Ubuntu. Valget faldt på Ubuntu fordi distributionen er helt igennem fri og der står et kæmpe community bag den. Disse ting gør Ubuntu til en attraktiv udviklingsplatform, fordi det er let og enkelt at finde hjælp til opsætning af Ubuntu. Desuden har Ubuntu arvet nogle stærke server værktøjer og er samtidig med på bølgen med den nyeste teknologi.

Installation af Ubuntu

Før du kan installere Ubuntu skal du have fat i en Ubuntu Installations cd. Du kan downloade et cd billede fra Ubuntu.com eller bestille den hjem med posten (gratis). Vi anbefaler at du benytter den seneste stabile version Ubuntu, vi benyttede Ubuntu Breezy 5.10.

Du starter med at boote op på installations cd'en og vælge Server installation lige efter boot. Det anbefales at benytte en Server installation så man ikke får nogen grafisk brugerflade på serveren, da den bare ville æde ressourcer. Hvis du ikke er bekendt med en almindelig *nix shell, bør du nok læse op på det, da vi ikke på noget tidpunkt har planer om at installere en grafisk brugerflade.

Under installationen skal du opsætte raid. Raid er en betegnelse for software der bruges til at sammensætte harddiske og partioner, så man ikke ikke mister data hvis en af harddiskene dør. Vores partions ser ud som følger: Billede:PA_Partionerstable.png

Hvis du ikke er bekendt med navne termanologierne under *nix så er Hda1 og Hda2 de 2 harddiske der er til koblet serveren. Som man kan ligger vores gule partion på 2 harddiske, dette er ikke fordi den så bliver dobbelt så stor, istedet ligger alle data både på Hda1 og Hda2. På den måde vil serveren kører videre selvom en af harddiskene skulle stå af ved døden.

Resten af installationen burde komme af sig selv, vi havde nogle problemer med at få netværket konfiguret. Husk altid at teste om din hardware virker. Netværket skal konfigures med en fast ip på 192.168.0.199.

Server intallation

Når du har installeret Ubuntu i server udgaven, skal du have installeret server softwaren. Denne del kræver en del kendskab shell kommandoer, da dette ikke er en idiot sikret punkt guide vil du ikke blive fortalt hvad du skal skrive, men hvad du skal gøre. Det anbefales at du læse et par bøger fra Appendiks B, hvis ikke du er bekendt med en *nix shell.

Før installation af software skal du opsætte apt op til at downloade fra samtlige Ubuntu repositories. Du kan opsætte apt repositories i filen /etc/apt/sources.list, vores liste ser sådan ud:

# deb cdrom:[Ubuntu 5.10 _Breezy Badger_ - Release i386 (20051012)]/ breezy main restricted


deb http://us.archive.ubuntu.com/ubuntu breezy main restricted
deb-src http://us.archive.ubuntu.com/ubuntu breezy main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://us.archive.ubuntu.com/ubuntu breezy-updates main restricted
deb-src http://us.archive.ubuntu.com/ubuntu breezy-updates main restricted

## Uncomment the following two lines to add software from the 'universe'
## repository.
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## universe WILL NOT receive any review or updates from the Ubuntu security
## team.
deb http://us.archive.ubuntu.com/ubuntu breezy universe
deb-src http://us.archive.ubuntu.com/ubuntu breezy universe

## Uncomment the following two lines to add software from the 'backports'
## repository.
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://us.archive.ubuntu.com/ubuntu breezy-backports main restricted universe multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu breezy-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu breezy-security main restricted
deb-src http://security.ubuntu.com/ubuntu breezy-security main restricted

deb http://security.ubuntu.com/ubuntu breezy-security universe
deb-src http://security.ubuntu.com/ubuntu breezy-security universe

Du kan evt. redigere filen med VIM (Vi IMproved) i terminalen. Nu mangler du bare at opdatere inden du begynder at installere software. Du kan opdatere program pakke listerne med kommandoen "apt-get update" og opgradere til nyeste software med kommandoen "apt-get upgrade".

Før vi går vidrer skal vi installere SSH serveren, så behøver du ikke taste resten af kommandoerne i hånden, SSH serveren kan installeres med:


  • apt-get install ssh openssh-server


Nu kan du logge på serveren via. SSH og kopire følgene kommado ind i terminalen:


  • apt-get install binutils cpp cpp-4.0 fetchmail flex gcc gcc-4.0 libarchive-zip-perl libc6-dev libcompress-zlib-perl libdb4.3-dev libpcre3 libpopt-dev linux-kernel-headers lynx m4 make ncftp nmap openssl perl perl-modules unzip zip zlib1g-dev autoconf automake1.9 libtool bison autotools-dev


Så har du installeret de vigtigeste programmer, herefter skal vi have installeret Apache og php, hvilket kan gøres med følgene kommandoer:


  • apt-get install apache2 apache2-common apache2-doc apache2-mpm-prefork apache2-utils libapr0 libexpat1 ssl-cert
  • apt-get install autoconf automake1.4 autotools-dev libapache2-mod-php4 libkrb53 php4 php4-common php4-dev php4-imagick php4-mcrypt php4-rrdtool php4-sqlite php4-curl php4-domxml php4-gd php4-imap php4-ldap php4-mcal php4-mhash php4-mysql php4-odbc php4-pear php4-xslt
  • /etc/init.d/apache2 force-reload


Derefter skal vi have installeret ftp server, det kan gøre med følgene kommandoer:

>> apt-get install proftpd proftpd-common ucf

Under installationen af proftpd vil du blive bedt om at vælge mellem standalone eller init drevent ftp server version, du skal installere en standalone server.

Nu mangler vi bare at installere programmet lptout, dette er et lille c program som vi har fundet et sted i cyberspace. Vi bruger programmer som en wapper omkring hardware fra php. Programmet ser sådan ud:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/io.h>

#define base 0x378

main(int argc, char **argv)
{
  int value;

  if (argc!=2)
    fprintf(stderr, "Error: Wrong number of arguments. This program needs one argument which is
                                                           number between 0 and 255.\n"), exit(1);
  if (sscanf(argv[1],"%i",&value)!=1)
    fprintf(stderr, "Error: Parameter is not a number.\n"), exit(1);
  if ((value<0) || (value>255))
    fprintf(stderr, "Error: Invalid numeric value. The parameter number must be between 0 
                                                                           and 255\n"), exit(1);
  if (ioperm(base,1,1))
    fprintf(stderr, "Error: Couldn't get the port at %x\n", base), exit(1);

   outb((unsigned char)value, base);
}

Skriv programmet i en fil kaldet der ligger i ~/lptout.c Du kan nu compliere filen med kommandoen "gcc -O lptout.c -o lptout", derefter skal du give programmet mulighed for at blive udført med administrator rettigheder hele tiden, gøre med følgende kommando "chmod +x lptout". Nu skal lptout bare installeres permanet, dette gøres ved at flytte den til /usr/sbin kan gøres med kommandoen "mv ~/lptout /usr/sbin/lptout".

Server opsætning

Når du har installleret serveren, skal du have instillet den korrekt. Alle http tilgængelige dokumenter ligger i /var/www/, det er den mappe du vil kende som /public_html/ eller www-root, altså roden af webapplikationen. Mappen ligger uden for /home/user/ hvilket betyder at du ikke har skrive rettigheder til mappen, du skal have skrive rettigheder for at kunne skrive til mappen fra ftp. Du kan opnå skrive rettigheder på følgende måde:

sudo su
chown ubuntu /var/www/
exit

Nu skulle du gerne have opnået skrive rettigheder, hvis ikke kan det være en god ide, såfremt "ubuntu" er det bruger navn du har valgt at benytte.


Når du har opnået skriverettigheder til /var/www/ er det på tide at få styr på parallel porten. Det gør vi ved at sikre os at alle porte er slukket og at /var/www/cgi-bin/status.txt er slettet ved hver reboot. Dette kan gøres med følgende script:

#!/bin/sh
/usr/sbin/lptout 0;
rm /var/www/cgi-bin/status.txt;
echo "Initialise ports for Light Control 2.00              [ OK ]";

Du skal gemme scriptet i /etc/init.d/startup.sh og gøre det rettigheder til at blive udført, samt sikre at det bliver kaldt ved hver opstart:

chmod -x  /etc/init.d/startup.sh
update-rc.d /etc/init.d/startup.sh defaults

Nu vil computeren starte med at slukke for alle porte og slette status.txt.

Vores software

Det man i princippet gør, er at når man trykker på tænd knappen bliver der sendt en anmodning via AJAX(Form for javascript) som gør det muligt at kommunikere med server-siden uden at skulle opfriske siden, i denne anmodnning står der informationer om hvilken port der skal tændes/slukkes, alt afhængig af hvilken status den har på det daværrende tidspunkt. AJAX forbinder sig så med serveren og køre filen Styring.php, denne fil er den som ændre status og holder styr på det hele. Styring.php er den hovedordnede fil til at skifte status, tænde og slukke for de forskellige porte. For at holde styr på hvilken status at portene har da anmodningen er sendt, har vi oprettet en fil til at indeholde disse informationer kaldt Satus.txt, i denne tekst fil står der 1'ere og 0'er sepereret med komma, i alt er der 8 tal, da vi har 8 porte og holde styr på. Styring.php kontakter sig så med status filen og oplagre informationerne i variabler, og sørger så for at få holde de porte der er tændte tændt og de andre skukkede. Styring.php går så ind og ændre status for den port der blev sendt anmodning om at få ændret og sørger for den bliver tændt. Dette er måden det hele fungere på i overordnede træk.

Forklaring til Styring.php

Det første som at der bliver gjort i Styring.php er at få hentet informationerne fra Status.txt, det der bliver gjort er at åbne filen med en "fopen()" funktion der gør det muligt at læse og og skrive i filen, det vi gør er at læse filen så vi kan få informationerne ud på. så sidder vi med en tekst der kunne være "0,0,1,0,0,0,0,0" for så at at få delt informationerne i variabler bruger vi en funktion der hedder "explode()" som deler Status.txt op i variabler der er skildt ved hvert komma. Nu da vi har status på alle portene kan vi gå igang med at se på hvilken en der skal ændres, denne information blev sendt via AJAX. Så går vi så ind og ændre statusen på den ønskede port, hvis vi nu sagde det var port 4 ville vi ud fra vores variabler med status på porte kunne se at den er slukket(0) så ændre vi så den til tændt(1). Det vi så gør er at vi skal have omskrevet vores binæretal(0,0,1,1,0,0,0,0) til arabiske tal(0-255), det gøres på følgende måde:

0*2^0 = 0
0*2^1 = 0
1*2^2 = 4
1*2^3 = 8
0*2^4 = 0
0*2^5 = 0
0*2^6 = 0
0*2^7 = 0
      = 12

Dette tal vi kommer frem til ved denne beregning er det tal der skal sendes vidre til vores C-program(lptout). Som derefter åbner de respektive porte. Nu da vi har gjort det vi faktisk skulle gøre med vores anmodning fra Index.html, skal vi bare have gemt vores nuværrende status i vores status.txt igen. Det gør vi bare ved at registrere statuserne og skrive dem ned, og derefter gemme dem.

Forklaring til Index.html

Dette kan forklares meget enkelt selvom det ikke er det i sig selv. Det denne fil er i stand til er at den kan sende requests til php filen via AJAX som er en form for java script der gør det muligt at kommunikere med serveren uden at opdatere siden. Serveren melder så tilbage på disse requests med en tekst, som java scriptet går ind og læser, denne tilbagemelding som så ændre billedet på ON/OFF knappen.

LightControl 2.00 Enheden

For at kunne få signalet ud af printer porten skal du bruge et printer kabel, du skal have fat i ledningerne til portene:

Når du har fået signalet ud, kan du evt. teste det med en lysdiode og en 1kohm modstand. Du skal derefter have forbundet kablet til følgende print:

Billede:PA_kredsløb.png

Til kredsløbet skal du benytte følgende:

  • En optokobler
  • Et 12VDC til 230 VAC relæ
  • En 12VDC strømforsyning
  • En 230VAC strømforsyning
  • En parallelport udgang
  • En 230VAC pære
Optokobler
En optokobler en en chip der indeholder en diode og en fototransistor. På vores diagram kan optokobleren 4 ben, 2 på hver side, disse to dele af chippen er elektrisk isoleret fra hinanden. Formålet med optokobleren er at lave en elektisk isolation af kredsløbet, så man ikke brænder printerporten af. Når du sender strøm ind i venstre side af optokobleren, der hvor dioden sidder, vil dioden start at lyse og lyset aktivere fototransistoren. Derfor er der ingen elektisk eller magnetisk kontakt mellem vores og computerens kredsløb.
Relæ
Fordi optokobleren ikke kan tåle store spændninger (230VAC), bliver vi nød til at sætte et relæ på kredsløbet. Vores relæ skal kunne aktiveres af 12VDC, uden at bruge en større strøm end optokobleren kan tåle. Relæet skal også kunne tåle 230VAC og en acceptabel effekt, det vil sige ca. 6 A.

Appendiks A - Ressourcer

Vi har brugt flere sites til finde information om hvordan produktet skulle skabes. Da vores produkt er meget kompliceret findes der ikke nogen specifik guide. Vi har derfor indsamlet information fra mange forskellige artikler og kombineret den med vores baggrundsviden (Se appendiks B).

hvis dette ikke kan forklare alle de ting vi laver, bør du kan det være en idé at kigge lidt på wikipedia.org eller benytte google.com.

Appendiks B - Bøger

Hvis du ikke er bekendt med Unix/Linux/*nix, Debian/Ubuntu, raid opsætninger, C, PHP, Bash og Javascript, vil vi anbefale at du læser følgene bøger samlinger før du begiver dig i kast med skabe et produkt i retningen af Light Control 2.00

Hvis ikke dette er nok kan du finde flere bøger på:

Appendiks C - lptout dokumentation

Dokumentation af lptout, kræver at programmet er korrekt installeret. Dette en er "fordansket" udgave af den dokumentation du ofte ville kunne finde i en man fil (hvis du ikke er bekendt med man begrebet så se appendiks B).

Navn
/usr/sbin/lptout
Syntakst
/usr/sbin/lptout -D
Beskrivelse
lptout er lille C-program der bruges til at sende kommandoer til parallel porten. Helt præcist hardware adressen 0x378, som er ofte er standart adressen for parallel porten.
Parametre
-D Data, de data du ønsker at sende til parallel porten, i hexa- eller decimaltal udgave, af det binære tal der repræsentere de porte som skal åbnes.
Formatering af -D
Det tal du sender som D parametret, skal være formateret efter det hexadecimale- eller arabisketalsystem. Tallet du sender skal i binær formatering have 8 bit, hvert bit repræsentere så en af de 8 porte du kan (de)aktivere med lptout. 0 indikere at porten er slukket og 1 at porten er tændt.
Fejl meldinger
Error: Wrong number of arguments. This program needs one argument which is number between 0 and 255
Forkert antal argumenter.
Error: Parameter is not a number
Argumentet er ikke et tal.
Error: Invalid numeric value. The parameter number must be between 0 and 255
Argumentet har en numerisk værdi uden for [0;255].
Error: Couldn't get the port at 0x378
Programmet kunne ikke tilgå porten 0x378, kontroller at den eksitere eller at den ikke er optaget af et andet program.
Eksempel
Hvis du f.eks. ønsker at tænde port nummer 0,2,3,4 og 6, vil du have et binært tal der ser sådan ud: 10111010. Du skal konventere dette til et hexadecimal- eller arabisktal:
Arabisk
186
Hexadecimal
0xBA
Talles kan nu sendes til lptout som parametret -D på en af følgende måder:
/usr/sbin/lptout 186
/sur/sbin/lptout 0xBA