Beispiel für die Steuerung des Interface übers Web

Funktionsweise

Das folgende CGI Script (in Perl) generiert aus der Datei interface.dat eine Webseite die den aktuellen Zustand am Interface wiedergibt, ebenfalls auf dieser Seite befinden sich Links mit dennen jeder Kanal umgeschaltet werden kann. Solch ein Link verweist wieder auf dieses Script übergibt im jedoch zusätzlich noch die Parameter welcher Kanal ein bzw. aus geschaltet werden soll.

interface.dat

In der Datei interface.dat wird der Zustand der 8 Kanäle gespeichert. Eine 1 steht für eingeschaltet, eine 0 für ausgeschaltet, die Stelle gibt die Kanalnummer wieder (0-te bis 7-te).
Zum Beispiel steht in der Datei:
00100101
dies würde bedeuten das der Kanal 2, 5 und 7 ein wäre (bei Null anfangen zu zählen).

Perl Script

#!/usr/bin/perl

if($ENV{'REQUEST_METHOD'} eq 'GET')
 {
   $Parameter = $ENV{'QUERY_STRING'}
  }
else
 {
   read(STDIN, $Parameter, $ENV{'CONTENT_LENGTH'});
 }

if (open(DATEI, "<interface.dat")) #Wenn geht Datei öffnen
 {
   while (($AktChar = getc(DATEI)) ne "")
    {
      push(@Data, $AktChar);
    }
   close(DATEI);
 }
else #Alles aus wenn Datei nicht existiert
 { 
   @Data = ("0","0","0","0","0","0","0","0");
 }

$_ = $Parameter;
/[01234567]/;
$Kanalnummer = $&;
$Zustand = ($' =~ "ein" ? '1' : '0');

$Data[$Kanalnummer] = $Zustand;

open(DATEI, ">interface.dat");
  print DATEI @Data;
close(DATEI);

print "Content-type: text/html\n\n";
print "<html>\n";
print "<link rel=\"stylesheet\" href=\"../../local/css/formate.css\" type=\"text/css\">\n";
print "<head>\n";
print "<title>Schalterstellung des Interface &auml;ndern</title>\n";
print "</head>\n";
print "<body bgcolor=#FFFFFF text=#000000 link=#009900 vlink=#006600 alink=#0000FF>\n";
print "<h1>Schalterstellung des Interface</h1>\n";

print "<table border=\"0\">";
for($i = 0; $i <= 7; $i++)
{
  print "<tr>\n<td>", $i, ". Kanal ist&nbsp;</td>", $Data[$i] =~ 0 ? ("<td><b class=\"rot\">aus</b></td>\n<td>&nbsp;jetzt <a href=\"interface.pl\?Kanal", $i, "ein\">einschalten</a></td>\n") : ("<td><b class=\"gruen\">ein</b></td>\n<td>&nbsp;jetzt <a href=\"interface.pl\?Kanal", $i, "aus\">ausschalten</a></td>");
  print "</tr>\n";
}

print "</table>\n";

print "<br>\n";

if ($Kanalnummer =~ /[01234567]/)
 {
 #An das Interface senden /dev/lp0 event. Rechte von lp0 ändern zum Testen tty2 ebefalls Rechte ändern (nach jedem Login!)
 print "Ich habe den Kanal ";

 if (open(INTERFACE, ">/dev/lp0")) #Wenn es geht auf das Interface schreiben
  {
   print INTERFACE chr( $Data[0] + $Data[1]*2 + $Data[2]*4 + $Data[3]*8 + $Data[4]*16 + $Data[5]*32 + $Data[6]*64 + $Data[7]*128);
   close(INTERFACE);
   print $Kanalnummer, $Zustand =~ 0 ? " ausgeschaltet<br>\n" : " eingeschaltet<br>\n";
  }

 else #Fehlermeldung
  { 
   print "nicht umschalten k&ouml;nnen<br>\nAuf das Interface konnte nicht zugegriffen werden!<br>\n<br>\n";
  }
 
 } 
else
 {
  print "Ich habe keinen Kanal umgeschaltet<br>\n";
 }

print "<br>\n";
print "<a href=\"/index.html\">zur\&uuml;ck zur Homepage</a><br>\n<br>\n";
print "</body>\n";
print "</html>\n";

CSS

Da ich zur Definition vom Formateigenschaften Cascading Style-Sheets verwende, ist hier noch der Inhalt des im Script referenzierten formate.css wiedergeben (das Script funktioniert natürlich auch ohne CSS).
/*standart def.*/
body, h1, h2, h3, h4, th, td, span {
font-family:Verdana, Helvetica, Arial;
font-style:normal;
font-size:12pt;
color:#000000;
}

h1 {
font-size:18pt;
font-weight:bold;
}

h2, th {
font-size:16pt;
font-weight:bold;
}

/*link farben def., nicht unterstrichen*/
a:link {
color:#0000FF;
text-decoration:none;
}

a:visited {
color:#0080FF;
text-decoration:none;
}

a:active {
color:#FF0000;
text-decoration:none;
}

/*text fett*/
b {
font-weight:bold;
}

h3.index {
font-size:14pt;
font-weight:normal;
margin-bottom:6pt;
line-height:6pt;
}

b.rot{
color:#FF0000;
}

b.gruen{
color:#00FF00;
}

sup {
font-size:8pt;
font-style:normal;
font-weight:normal;
}

home

zurück