Angewandte Informatik INFAP5 2015 Webseiten mit HTML und CSS Kurze Einführung Im Internet gibt es viele gute Einführungen zu HTML und CSS (Webseiten, Videos, interaktive Seiten). Diese Seiten sollen also nur einen einfachen Überblick und einige Aufgaben bieten. Zum Entwickeln von Webseiten benötigt man nur einen einfachen Texteditor. HTML Was ist HTML? HTML (HyperText Mark­up Language) bzw. XHTML (Extensible HyperText Mark­up Language) sind einfache Textdateien, welche vom Browser interpretiert werden um Webseiten darzustellen. Hier ein Beispiel: <!DOCTYPE html> <html> <head> <title>Meine erste Webseite</title> </head> <body> <h1>Dies ist die Überschrift (english: header)</h1> <p>Das ist ein erster Abatz</p> <p>Das ist ein zweiter Absatz mit <b>fetten (english:bold)</b> und <i>kursiven (english: italic)</i> Wörtern.</p> </body> </html> Aufgabe H1: Kopiere den Text in einen Editor (Wordpad, Libreoffice Writer, Kate oä.). Speichere ihn als reinen Text (.txt), aber gib ihm den Namen index.html (also Endung .html statt .txt). Rufe die Datei nun mit deinem Webbrowser auf. Webseiten mit HTML und CSS 1 Angewandte Informatik INFAP5 2015 Tags Man erkennt in unserem Dokument den eigentlichen Inhalt. Er ist eingeschlossen zwischen sogenannten Tags. Dieses Wort könnte man hier mit "Kennzeichnungen" übersetzen, allerdings wird auch im Deutschen das englische Wort "Tag" benutzt. Die Blöcke oder Elemente, welche das Dokument strukturieren und formatieren, und somit dem Browser mitteilen wie die Seite darzustellen ist, sind alle zwischen so einem Start­Tag und einem End­Tag eingeschlossen. Alle Tags beginnen mit einem Kleiner­als­Zeichen "<" und enden mit einem Größer­als­Zeichen ">". Das End­Tag enthält zusätzlich einen Schrägstrich "/" (Slash). Tags können mit einem oder mehreren Attributen versehen werden um weitere Informationen zu liefern (siehe weiter unten). Kennt man viele Tags und ihre Bedeutung, so kennt man HTML. Alle Tags findet man unter: http://www.w3schools.com/tags/default.asp Aufgabe H2: Geh mit dem Firefox­Browser auf eine beliebige Homepage und drücke die Tastenkombination "Crtl+u". Sie stellt den HTML­Quelltext der Seite dar. Wiederhole dies für mehrere Seiten und schau dir den Quelltext an (Internet Explorer: View ­ Source). Die wichtigsten Tags Das HTML Dokument In der ersten Zeile sollte angegeben werden in welchem Dialekt die Datei geschrieben wurde. Alle HTML Dokumente beginnen so mit der Typendeklaration: <!DOCTYPE html> (weitere Infos: http://de.html.net/tutorials/html/lesson14.php). Dann folgen die Tags für das HTML­Dokument selbst <html> und </html>. Der sichtbare Teil des Dokuments befindet sich zwischen <body> und </body>. Überschriften (headings) und Abschnitte (paragraphs) Überschriften dienen der Strukturierung. Es existieren die Tags <h1> bis <h6>. Jeder Text muss sich zwischen Tags befinden. Im Normalfall wird der Text in Absätzen gegliedert. Dazu dient das <p>­Tag. Formatieren mit Tags Das Bold­Tag <b> ermöglicht es den Text Fett darzustellen. Mit dem Italic­ Tag <i> wird der Text kursiv (schief) dargestellt. Das Small­Tag (<small>) gibt kleineren Text aus. Wichtiger Text kann mit <strong> dargestellt werden, Hervorzuhebender Text mit dem 2 Webseiten mit HTML und CSS Angewandte Informatik INFAP5 2015 Emphasis­Tag <em>. Programmcode mit dem Code­Attribut <code>. Zitate mit dem Quote­Tag <q>. All diese Tags können natürlich auch kombiniert werden: Beispiel: <b><i><code> import math </code></i></b> HTML Links Eine wichtige Eigenschaft von HTML ist das Verlinken von Informationen. HTML­ Links werden mit dem <a> Tag definiert. Beispiel: <a href="http://www.weigu.lu/c/python.lu">Link zur Python Seite</a> Im Start­Tag wird die Link­Adresse hinter dem href­Attribut mit href="http://www.weigu.lu/c/python" angegeben. Attribute liefern zusätzliche Informationen in HTML! Der ganze Text zwischen dem Start­ und End­ Tag (hier der Text: "Link zur Python Seite") wird extra formatiert und kann angeklickt werden. HTML Bilder HTML Bilder werden mit dem Image­Tag <img> definiert. Beispiel: <img src="ltam_logo_cmyk.png" alt="LTAM-Logo“ width="104" height="142"> Hier stehen mehrere Attribute zur Verfügung: Die Quelldatei wird mit Source­ Attribut src="w3schools.jpg" angegeben Der Text hinter dem alternative Text­Attribut alt, erscheint wenn der Browser die Datei nicht anzeigen kann. Er ist auch wichtig für blinde Webbenutzer, oder Suchmaschinen. Die width­ und height­Attribute ermöglichen das Anpassen des Bildes in Pixel an die Seitengröße. Allerdings ist es sinnvoller diese Attribute in der CSS­Datei zu definieren (siehe später). Spezielle Elemente mit nur einem Tag Es gibt auch leere Elemente, die im gleichen Tag geöffnet und geschlossen werden. Das <br />­Tag (break), ruft einen erzwungenen Zeilenumbruch hervor. Das <hr />­Tag zeichnet eine horizontale Linie (horizontal rule). HTML-Kommentare Genau wie in jeder Programmiersprache soll der HTML­Code wenn nötig mit sinnvollen Kommentaren versehen werden. Kommentare werden zwischen <!-- und --> eingefasst. Beispiel: <!-- Seiten Menü (dies ist ein HTML-Kommentar) --> Aufgabe H3: Erstelle eine Seite in der alle oben genannten Tags enthalten sind, und teste sie. Lade dazu ein beliebiges Bild aus dem Internet. Webseiten mit HTML und CSS 3 Angewandte Informatik INFAP5 2015 Aufgabe H4: Informiere dich über die Tags zum Erstellen einer geordneten sowie eine ungeordneten Liste. Erweitere deine Seite um zwei Listen. Aufgabe H5: (für Fleißige) Informiere dich über die Tags zum Erstellen einer Tabelle. Erweitere deine Seite um eine Tabelle. CSS (Cascading Style Sheets) Mit HTML werden Inhalte strukturiert. Mit CSS wird der strukturierte Inhalt formatiert. CSS ist eine Sprache, die das Aussehen, den Stil (style) von HTML­Dokumenten definiert. CSS kann man zum Festlegen von Schriftarten, Farben, Rändern, Linien, Breiten, Höhen, Hintergrundbildern usw. Nutzen. Daneben ermöglicht es die eine präzise Kontrolle über das Layout vieler Webseiten aus einer einzigen Style­ Sheet­Datei heraus, und verschiedene Layouts für verschiedene Medien (PC­ Bildschirm, Handy, Druck). Der folgende Link vermittelt einen Eindruck wie unterschiedlich eine HTML­Seite mit unterschiedlichen Style­ Sheet­Dateien dargestellt werden kann: http://www.mezzoblue.com/zengarden/alldesigns/ (bzw: http://www.csszengarden.com/) HTML kümmert sich um die grobe Struktur eines Textes. Mit dem style­Attribut kann zwar das Layout mit Hilfe von CSS­Angaben innerhalb des HTML­Dokuments verändert werden (es existiert sogar auch ein style­Tag mit dem dies möglich ist). Möchte man aber für eine ganze Seite oder mehrere Seiten ein schönes Layout gestalten, so ist das style­Attribut und das style­Tag wenig geeignet. Der HTML­ Code wird unübersichtlich. Inhalte sind nicht mehr gut erkennbar und nachträgliche Änderungen sind schwierig. Hier kommt nun CSS in einer externen Datei ins Spiel. Die Trennung von Aussehen und Inhalt einer Seite vereinfacht die Pflege derselbigen wesentlich. Ein externes Style­Sheet ist eine Textdatei mit der Endung .css. Der Einfachheit halber speichern wir die Datei im gleichen Ordner wie unsere HTML­ Datei. Um dem HTML­Dokument anzugeben wo sich die CSS­Datei befindet muss man die folgende Zeile HTML­Code in den Kopfteil des HTML­Dokumentes, zwischen das <head> und </head>­Tag, einfügen: <link rel="stylesheet" type="text/css" href="style.css" /> Das folgende HTML­Dokument soll nun genutzt werden um mit einem Style­Sheet verschönert zu werden: <!DOCTYPE html> <html lang="de"> <head> <meta charset="utf-8"/> <!-- utf-8 (HTML5) alt: ISO-8859-1 (HTML4) --> <title>Meine gestylte Seite</title> <link rel="stylesheet" type="text/css" href="style.css"/> <link rel="icon" href="favicon.png"> </head> <body> <!-- Seitlicher Menüstreifen (dies ist ein HTML-Kommentar) --> 4 Webseiten mit HTML und CSS Angewandte Informatik INFAP5 2015 <ul class="navibar"> <li><a href="index.html">Home page</a></li> <li><a href="INFAP.html">Informatik</a></li> <li><a href="MICRO.html">Mikrocontroller</a></li> <li><a href="PROFE.html">Projektarbeit</a></li> </ul> <!-- Hauptseite --> <h1>Meine Streber-Seite</h1> <p>Diese Seite wurde vom perfekten Schüler erstellt :)</p> <p>Der "Duden" definiert Streber als jemanden, der ehrgeizig und egoistisch um sein <br /> Fortkommen bemüht ist (<a href="http://www.duden.de/rechtschreibung/Streber">Link zur DudenSeite</a>).</p> <p>Hier noch mein Lieblingsbild:</p> <p><img src="http://maennerrevolte.de/wp-content/uploads/2010/03/streber-berg1.jpg" alt="StreberBild"></p> <!-- Meine Adresse --> <address>Erstellt am 5 April 2015<br /> by Streber</address> </body> </html> So sieht die Seite aus, wenn kein Style­Sheet vorhanden ist: Webseiten mit HTML und CSS 5 Angewandte Informatik INFAP5 2015 Aufgabe C1: Speichere den HTML­Code als reinen Text mit dem Namen index.html ab. Erstelle im gleichen Verzeichnis eine leere Textdatei mit dem Namen style.css. Öffne die HTML­Datei mit einem Browser. Farben und die Syntax von CSS Unsere Seite soll farbiger werden. Der folgende CSS­Code wird in die Datei style.css kopiert. /*Dies ist die CSS-Datei für unsere gestylte Webseite*/ body { color: blue; background-color: #CEF4FC; } In CSS werden Kommentare wie in der Programmiersprache C zwischen /* und */ eingebettet. Die erste Code­Zeile beginnt mit dem selector (hier body). Er gibt an welchem HTML­Tag die Eigenschaften zwischen den geschweiften Klammern zuzuordnen sind. Die einzelnen Eigenschaften bestehen dann aus der Eigenschaft selbst property und ihrem Wert value. Beide sind durch einen Doppelpunkt getrennt und schließen mit einem Strichpunkt (Semikolon) ab. selector { proprety:value; } In unserem Beispiel gibt es die Eigenschaften color und background- color. Sie werden dem <body>­Tag zugeordnet. Die Schrift wird blau; der Hintergrund Hellblau. Es existieren viele HTML­Farben: http://www.w3schools.com/tags/ref_colornames.asp. Man hätte hier zum Beispiel PaleTurquoise (#AFEEEE) verwenden können. Individueller geht es aber wenn man sich die Farbe selbst zusammenstellt und die Farbnummer angibt: http://html­color­codes.info/ oder http://www.w3schools.com/tags/ref_colorpicker.asp. Die Farbnummer besteht aus den Farbanteilen Rot, Grün und Blau (RGB) mit einem Wert zwischen 0­255 in Hexadezimal­Schreibweise. 6 Webseiten mit HTML und CSS Angewandte Informatik INFAP5 2015 Mit CSS kann man als Hintergrund auch ein Bild nutzen: http://www.w3schools.com/css/css3_backgrounds.asp. Schrift Als nächstes sollen eigene Schriften verwendet werden. Eigenschaften sind die Schriftfamilie, Der Textstil, sowie die Größe und der Schrift. /*Dies ist die CSS-Datei für unsere gestylte Webseite*/ body { font-family: "Times New Roman", Times, serif; font-size: 18px; color: blue; background-color: #CEF4FC; } h1 { font-family: Arial, Verdana, sans-serif; font-size: 1.5em; font-style: italic; font-weight: bolder; } p { font-size: 110%; } Bei der Schriftfamilie unterscheiden wir hauptsächlich zwischen einer proportionalen Schrift mit Serifen und ohne Serifen (so wie diese Schrift). Eine bekannte Schrift mit Serifen ist "Times New Roman", eine bekannte Schrift ohne Serifen ist "Arial". Daneben gibt es "monospace" Schriften, bei denen die breite aller Buchstaben gleich ist (so wie dieser Satz). Bei der Schriftfamilie gibt man immer eine Liste mehrerer Schriften an, so dass der Computer eine ähnliche Schrift findet wenn die angegebene Schrift nicht vorhanden ist (fallback). In unserem folgenden Beispiel wird zuerst nach "Times New Roman" gesucht. Ist diese Schrift nicht vorhanden wird nach Webseiten mit HTML und CSS 7 Angewandte Informatik INFAP5 2015 einer Times ähnlichen Schrift gesucht, ansonsten wird irgend eine Serifen­Schrift verwendet. Die Schriftgröße kann man absolut in Pixel (px) angeben. Besser ist es aber dies relativ in Prozent oder in "em" zu tun. "em" ist eine relative Maßeinheit und gibt einen Skalierungsfaktor an. In unserem Beispiel beträgt die Schriftgröße der Überschrift (<h1>) das 2­fache der "body"­Schriftgröße, also 36px. Mit relativen Schriftgrößen bleibt das Layout der Seite erhalten wenn man die Seitengröße mit "Ctrl++" bzw. "Ctrl+-" Browser (Firefox) verändert. Andere Eigenschaften zum Gestalten der Schrift sind zum Beispiel font-style und font-weight. Weitere Informationen: http://www.w3schools.com/css/css_font.asp Aufgabe C2: Teste die neue CSS­Datei. Verändere danach das Layout indem du die Seite mit Ctrl++ und Ctrl+- im Firefox­Browser skalierst (mit Ctrl+0 wird die Originalgröße wieder hergestellt). Das Box-Modell Um Blöcke oder Elemente (die zwischen Tags eingefasst sind) mit entsprechenden Abständen zueinander positionieren zu können existiert das BOX­Modell: 8 Webseiten mit HTML und CSS Angewandte Informatik INFAP5 2015 Der Browser nimmt Standard­Werte für Margin und Padding an. Der Rahmen (Border) ist standardmäßig (default) nicht sichtbar. All diese Werte lassen sich einzeln (top, right, bottom und left) mit CSS verändern. (weitere Infos: http://www.w3schools.com/css/css_boxmodel.asp) Einfügen einer Navigationsleiste Die meisten Seiten besitzen entweder oben oder seitlich eine Navigationsleiste. Im HTML­ Code haben wir diese Leiste schon vorbereitet. Es handelt sich um eine ungeordnete Liste mit Hyperlinks. Die Dateien zu den Links müssen natürlich später vorhanden sein. /*Dies ist die CSS-Datei für unsere gestylte Webseite*/ body { padding-left: 11em; font-family: "Times New Roman", Times, serif; font-size: 18px; color: blue; background-color: #CEF4FC; } h1 { font-family: Arial, Verdana, sans-serif; font-size: 1.5em; font-style: italic; font-weight: bolder; } p { font-size: 110%; } ul.navibar { position: absolute; top: 2em; left: 1em; width: 9em; } Um sie seitlich anzuordnen rücken wir den Haupttext (body) nach links mit der Eigenschaft padding-left. Im HTML­Code wurde der ungeordneten Liste, um sie von anderen ungeordneten Listen unterscheiden zu können, ein class­Attribut mit dem Inhalt "navibar" zugeordnet. Mit ul.navibar kann jetzt auf diese spezifische Liste zugegriffen werden. Mit den Eigenschaften position, top, left wird die Leiste absolut, auf der Seite positioniert. Es wird hier auch Einheit "em" verwendet. Wie oben erwähnt entspricht 1em der Schriftgröße der verwendeten Schrift. Da wir im body­Selector diese mit 18px festgelegt haben entsprechen zum Beispiel 11em 191px. Der große Vorteil von dieser Einheit ist, dass die Abstände mit der Schriftgröße skaliert werden. Webseiten mit HTML und CSS 9 Angewandte Informatik INFAP5 2015 Aufgabe C3: Erweitere deine CSS­Datei mit den neuen Inhalten (Farbe, Schrift, Navigationsleiste). Teste die Seite im Browser. Setze jetzt die Schriftgröße im body­Selektor auf 10px und danach auf 32px. Schau dir an wie die Abstände mit­ skaliert werden. Teste die Seite dann indem du sie mit Ctrl++ und Ctrl+- im Firefox­Browser skalierst (mit Ctrl+0 wird die Originalgröße wieder hergestellt). Eine Seite mit Stil :) Die Navigationsleiste ist in dieser Form nicht sehr ansehnlich, und ähnelt noch immer einer Liste. Zuerst entfernen wir die Punkte und und die Abstände, welche automatisch vorhanden sind. ul.navibar { list-style-type: none; padding: 0; margin: 0; } Dann erhält jedes Element der Liste eine eigene Hintergrundfarbe, und seitlich zwei Randstreifen. Mit margin und padding erhält der Text etwas Abstand zum Rahmen (siehe Box­Model): ul.navibar li { background: #F4FFFF; margin: 0.5em 0; padding: 0.5em; border-right: 0.5em solid blue; border-left: 0.5em solid blue; } 10 Webseiten mit HTML und CSS Angewandte Informatik INFAP5 2015 Hyperlinks (<a>­Tags) werden standardmäßig unterstrichen. Dies entfernen wir für die Navigationsleiste mit: ul.navibar a { text-decoration: none; } Der Link zum Duden­Lexikon bleibt unterstrichen. Jetzt wollen wir noch die Farben der Hyperlinks ändern. In CSS existieren die beiden Pseudoklassen :link und :visited für Hyperlinks. Mit ihnen können wir jetzt unterschiedliche Farben für Links und bereits besuchte Links festlegen: a:link { color: purple; } a:visited { color: red; } Das Bild erhält noch einen Rahmen: p img { border: 0.1em solid blue; width: 30em; height: 15em; } und unsere Adresse erhält Abstand und wird mit einer Linie vom Rest getrennt: address { margin-top: 1em; padding-top: 1em; border-top: thin dotted; } Die gesamte CSS­Datei sieht jetzt so aus: /*Dies ist die CSS-Datei für unsere gestylte Webseite*/ body { padding-left: 11em; font-family: "Times New Roman", Times, serif; font-size: 18px; color: blue; background-color: #CEF4FC; } h1 { font-family: Arial, Verdana, sans-serif; font-size: 2em; font-style: italic; font-weight: bolder; } p { font-size: 110%; } ul.navibar { list-style-type: none; padding: 0; margin: 0; position: absolute; top: 1em; left: 1em; width: 9em; } ul.navibar li { background: #F4FFFF; margin: 0.5em 0; padding: 0.5em; border-right: 0.5em solid blue; border-left: 0.5em solid blue; } ul.navibar a { text-decoration: none; } a:link { color: purple; } Webseiten mit HTML und CSS 11 Angewandte Informatik INFAP5 2015 a:visited { color: red; } p img { border: 0.1em solid blue; width: 30em; height: 15em; } address { margin-top: 1em; padding-top: 1em; border-top: thin dotted; } Und die entsprechende Webseite: Aufgabe C4: Teste die gestylte Seite und verändere sie nach Belieben. Aufgabe C5: Wir wollen die Seite noch um ein Bild, das links vom Seitennamen im Browser angezeigt wird erweitern. Ein solches Bild kann man sich auf http://www.favicon.cc selbst erstellen, oder ein bestehendes Icon herunterladen und im gleichen Verzeichnis wie die Webseite abspeichern. Der HTML­Code muss jetzt noch um die folgende Zeile im <head>­Block erweitert werden: <link rel="icon" href="favicon.png"> Quelle für das obige Beispiel: http://www.w3.org/Style/Examples/011/firstcss 12 Webseiten mit HTML und CSS Angewandte Informatik INFAP5 2015 HTML und CSS validieren Um Fehler in der Darstellung der Webseite zu vermeiden ist es sinnvoll den HTML­ und den CSS­Code mit einem Validator überprüfen zu lassen: http://validator.w3.org/check https://jigsaw.w3.org/css­validator/ Hier noch einige Links mit weiterführenden Tutorials: http://de.html.net/tutorials/ http://de.selfhtml.org/ http://www.w3schools.com/ http://www.w3devcampus.com/courses/ http://www.codecademy.com/courses/web­beginner­en­LceTK/0/1 Webseiten mit HTML und CSS 13 Angewandte Informatik INFAP5 2015 Interaktiver Webserver mit dem Raspberry Pi Kurze Einführung Auf einem eingebetteten System (z.B.: Raspberry Pi) soll ein Webserver es ermöglichen interaktiv auf LEDs oder angeschlossene elektronische Schaltkreise zuzugreifen. Statische Webseiten Siehe auch Kapitel "Webseiten mit HTML und CSS". Wird eine Internetadresse (URL, Uniform resource locator) im Browser angegeben, so sucht dieser nach einer Datei mit dem Namen "index.html". Diese HTML­Datei (HyperText Markup Language) besteht im einfachsten Fall aus dem Kopf mit Titel und dem Body mit Inhalt: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"/> <title>Meine statische Webseite</title> </head> <body> <h1>Dies ist die Überschrift</h1> <p>Das ist ein Absatz</p> </body> </html> Den obigen HTML­Code speichern wir auf dem Raspi unter dem Namen: "index.html" im Verzeichnis "/home/pi/webserver" das wir neu erstellen (mkdir webserver). Nachdem wir in dieses Verzeichnis gewechselt sind (cd ~/webserver) starten wir den Webserver mit dem folgenden Befehl: python3 ­m http.server 8000 Wir verwenden hier nicht den Standardport 80 für Webserver, da wir sonst Root­ Rechte auf dem Raspi benötigen. Unser Raspi­Server lauscht nun auf Port 8000. Der Schalter "-m" ist nötig damit nachher Module als Skript ausgeführt werden können. Auf dem PC können wir die Webseite jetzt mit folgender URL aufrufen, wobei natürlich die richtige IP­Adresse einzugeben ist: http://172.16.249.30:8000 Den Webserver kann man auch lokal testen, also auf dem Gerät auf dem der Webserver gestartet wurde. Die Standard­ IP­Adresse des lokalen Geräts lautet dann 127.0.0.1 (http://127.0.0.1:8000). 14 Interaktiver Webserver mit dem Raspberry Pi Angewandte Informatik INFAP5 2015 Aufgabe WS1: a) Teste den Webserver wie oben beschrieben. b) Teste den Webserver mit deinen Dateien aus dem vorigen Kapitel. Dynamische Webseite mit CGI und Python Mit dem Common Gateway Interface (CGI) ist es möglich Python­ Programme auf dem Webserver auszuführen. Durch diese besteht dann die Möglichkeit dynamische Webseiten zu erstellen, also Seiten, deren Inhalt durch den Nutzer verändert werden kann. Die Programme müssen sich zwingend im Unterverzeichnis "cgi-bin" im Webserver­ Verzeichnis befinden (/home/pi/webserver/cgi-bin). Das erste Python­Programm soll die gleiche statische Webseite wie vorhin erzeugen. Damit CGI weiß, welche Programmiersprache wir einsetzen, müssen wir dies in der ersten Zeile mitteilen. Die Zeile teilt CGI zusätzlich mit, dass die Python Umgebung (Programme) im Verzeichnis "/usr/bin" zu finden ist. Da wir deutsche Umlaute verwenden, müssen wir Python zusätzlich mitteilen mit welcher Kodierung wir arbeiten (dies muss in einer der ersten beiden Zeilen erfolgen!). Der HTML­Code wird mit der print()­Methode ausgegeben. Mit drei Hochkomma besteht die Möglichkeit mehrere Zeilen zu drucken. Der ausgegebene Code landet, wenn CGI ihn ausführt, allerdings nicht auf der Standardausgabe, sondern gleich im Browser. #!/usr/bin/env python #webserver_WS2.py print(''' <!DOCTYPE html> <html lang="de"> <head> <meta charset="utf-8"/> <title>Meine statische Webseite</title> </head> <body> <h1>Dies ist die Ueberschrift</h1> <p>Das ist ein Absatz</p> </body> </html> ''') Aufgabe WS2: Erstelle das Verzeichnis "cgi-bin". Speichere das obige Programm mit dem Namen "webserver_WS2.py" im Verzeichnis "/cgi-bin" ab. Wechsle in das Verzeichnis und teste das Programm (python3 webserver_WS2.py). Damit CGI die Datei ausführt, benötigt man die nötigen Rechte für eine ausführbare Datei. Führe den folgenden Befehl im Unterverzeichnis "/cgi-bin" aus: chmod u+x webserver_WS2.py Danach können wir im Server­Verzeichnis webserver ("cd ..") den Server starten mit dem neuen Befehl (in einer Zeile!): Interaktiver Webserver mit dem Raspberry Pi 15 Angewandte Informatik INFAP5 2015 python3 ­c 'import http.server; http.server.HTTPServer(("", 8000), http.server.CGIHTTPRequestHandler).serve_forever()' Im Webbrowser rufen wir jetzt unsere Seite mit der folgenden URL auf (eigene IP­Adresse einsetzen!): http://172.16.249.30:8000/cgi­bin/webserver_WS2.py Die Ausgaben unseres Python Programms landen nicht mehr auf der Standardausgabe, sondern werden zum Webserver gesendet. Über diesen Weg kann ein eingebettetes System uns jetzt Informationen mitteilen. Informationen vom eingebetteten System zum Browser An einem Raspberry Pi ist, über die 1­Wire Schnittstelle, ein Temperatursensor vom Typ DS18B20 angeschlossen. Die Temperatur soll im Webbrowser angezeigt werden, und bei jedem Reload der Webseite aktualisiert werden. Der Sensor ist mit 3,3V, Masse und Pin Nummer 4 zu verbinden. Der Pull­Up­ Widerstand von 4,7k zieht die Datenleitung auf 3,3V (siehe Kapitel: Schnittstellen mit dem Raspberry Pi). Hier das entsprechende Programm. #!/usr/bin/env python # -*- coding: utf-8 -*# webserver_WS3.py # add w1-gpio and w1-therm in the file /etc/modules import glob import time deviceFolder = glob.glob('/sys/bus/w1/devices/28*') deviceFolderString = deviceFolder[0] deviceFile = deviceFolderString + '/w1_slave' # find the file def readTemp(): try: f = open(deviceFile, 'r') except IOError: print('IOError') line1 = f.readline() line2 = f.readline() f.close() pos = line2.find('t=') if pos != -1: tempString = line2[pos + 2:] temp = round(float(tempString) / 1000.0, 1) else: print('error') return temp temperature = (readTemp()) print(''' <!DOCTYPE html> <html lang="de"> <head> <meta charset="utf-8"/> <title>Mein Raspi Fieberthermometer</title> </head> <body> <h1>Mein Raspi Fieberthermometer</h1> <p>Die Temperatur beträgt: <b>%s Grad Celsius<b/></p> </body> 16 Interaktiver Webserver mit dem Raspberry Pi Angewandte Informatik INFAP5 2015 </html> ''' % temperature) Sollen mehrere Variablen ausgegeben werden, so sind diese in Klammern, getrennt durch Komma hinter dem Prozentzeichen anzugeben. Beispiel: print(''' ... <p>Der erste Schalter ist <b>%sgeschaltet</b>.</p> <p>Der zweite Schalter ist <b>%sgeschaltet</b>.</p> <p>Der dritte Schalter ist <b>%sgeschaltet</b>.</p> ... ''' % (var0,var1,var2)) Aufgabe WS3: Speichere das obige Programm mit dem Namen "webserver_WS3.py" im Verzeichnis "/cgi-bin" und mache es ausführbar (chmod u+x webserver_WS3.py. Verdrahte die Hardware am Raspberry Pi und teste das Programm indem du es im Webbrowser mit der folgenden URL aufrufst: (eigene IP­ Adresse einsetzen!): http://172.16.249.30:8000/cgi­bin/webserver_WS3.py Aufgabe WS4: Schreibe ein eigenes Programm, das am Raspberry Pi vier Schalter abfragt und den Zustand der Schalter im Browser darstellt. Nutze dazu den 8­Bit I/O Port­Expander­ Chip PCF8574 (siehe Kapitel: Schnittstellen mit dem Raspberry Pi). Er ermöglicht es den Raspi über den I²C­ Bus um 8 digitale Ein­ bzw. Ausgänge zu erweitern. Ein über den I²C­Bus gesendetes Byte wird parallel an 8 Pins ausgegeben bzw eingelesen. Verbinde den Chip mit dem Raspi und schließe vier Taster (lila Drähte dienen als Schalter) an P0 bis P3 an. Weitere Informationen zum PCF8574: http://www.nxp.com/documents/data_sheet/PCF8574.pdf Nenne das Programm "webserver_WS4.py" (Verzeichnis "/cgi-bin" und chmod u+x webserver_WS4.py!) und teste es. Interaktiver Webserver mit dem Raspberry Pi 17 Angewandte Informatik INFAP5 2015 Verdrahtungsplan PCF8574P: Informationen vom Webbrowser zum eingebetteten System Ein Parameter Um unserem eingebetteten System Informationen zukommen zu lassen, nutzen wir Befehlszeilen­Parameter, die wir dem Python­Programm mitgeben. Auf den ersten Parameter kann mit sys.argv[1] zugegriffen werden.Dazu muss nur das Modul sys mit 18 Interaktiver Webserver mit dem Raspberry Pi Angewandte Informatik INFAP5 2015 import sys eingebunden werden. Der Parameter wird als Zeichenkette (string) übergeben. Es soll im folgenden eine LED ein­ und ausgeschaltet werden. Die Ausgänge des PCF8574 sind "open collector" Ausgänge und liefern maximal 25mA. Beim Anschließen von LEDs (gegen 5V) sind deshalb Vorwiderstände nicht unbedingt nötig. Die LEDs werden durch Ausgabe einer Null eingeschaltet. Um einzelne LEDs zu schalten wird eine klassische Maskierung (einlesen, maskieren, ausgeben) verwendet (siehe "Die Maskierung von Daten" in http://weigu.lu/a/pdf/MICEL_A3_Digitale_Ein_Ausgabe.pdf). Mit der ODER­ Verknüpfung (Python |) werden einzelne Pins auf Eins gesetzt und mit der UND­ Verknüpfung (Python &) werden einzelne Pins auf Null gesetzt. Um falsche Eingaben mit einer Fehlermeldung abfangen zu können, verwenden wir eine try/except­Anweisung. Hier der Code eines Programms, das eine LED an P4 des Port­Expander­Chip PCF8574 ein bzw. ausschaltet: #!/usr/bin/env python # -*- coding: utf-8 -*# webserver_WS5.py # comment out the line "blacklist i2c-bcm2708" with a #-sign in # /etc/modprobe.d/raspi-blacklist.conf # add i2-dev and i2c-bm2708 in the file /etc/modules # install i2c-tools and smbus with: # sudo apt-get install i2c-tools python-smbus # add user pi to group i2c: sudo adduser pi i2c # reboot: sudo reboot # test with: i2cdetect -y 0 (for Pi Model B rev. 1) # i2cdetect -y 1 (for Pi Model B rev. 2) import smbus import sys port = 1 # (0 for rev.1, 1 for rev 2!) bus = smbus.SMBus(port) expanderAddr = 0x20 din = bus.read_byte(expanderAddr) try: state = sys.argv[1] if (state == '0'): din = din | 0x10 # P4 = 1 LED ausschalten comment = "Die <b>LED</b> wurde <b>ausgeschaltet<b/>." elif (state == '1'): din = din & 0xEF # P4 = 0 LED einschalten comment = "Die <b>LED</b> wurde <b>eingeschaltet<b/>." else: comment = "Nur die 0 und die 1 sind als Parameter gültig!" except: comment = "Fehler: Kein gültiger Parameter!" bus.write_byte(expanderAddr, din) print(''' <!DOCTYPE html> <html lang="de"> <head> <meta charset="utf-8"/> <title>Der erleuchtete Raspi</title> </head> <body> <h1>Der erleuchtete Raspi</h1> <p>%s</p> </body> Interaktiver Webserver mit dem Raspberry Pi 19 Angewandte Informatik INFAP5 2015 </html> ''' % comment) Im Webbrowser rufen wir jetzt unsere Seite mit der folgenden URL auf (eigene IP­Adresse einsetzen!): http://172.16.249.30:8000/cgi­bin/webserver_WS5.py?0 zum Ausschalten und mit http://172.16.249.30:8000/cgi­bin/webserver_WS5.py?1 zum Einschalten. Das Fragezeichen wurde zur Trennung verwendet, da Leerzeichen nicht erlaubt sind. Aufgabe WS5: Teste das Programm. Denke daran es zuerst ausführbar zu machen. Um die komplizierten URLs nicht auswendig kennen zu müssen bauen wir klickbare Links mit den jeweiligen URLs in unsere Seite mit ein: print(''' <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"/> <title>Der erleuchtete Raspi</title> </head> <body> <h1>Der erleuchtete Raspi</h1> <p><a href="http://172.16.249.30:8000/cgi-bin/webserver_WS6.py?0">LED an P4 ausschalten<a/></p> <br /> <p><a href="http://172.16.249.30:8000/cgi-bin/webserver_WS6.py?1">LED an P4 einschalten<a/></p> <br /> <hr /> <p>%s</p> </body> </html> ''' % comment) Aufgabe WS6: Erweitere das Programm um die Links und teste es als webserver_WS6.py. Aufgabe WS7: a) Erweitere das Programm auf vier schaltbare LEDs und um einen Link, der zusätzlich die Zustände der vier Schalter anzeigt. Teste das Programm als webserver_WS7.py. b) Verpasse der Seite ein wenig "Style" sowie ein favicon. Nutze Bilder statt Text für die Links. Dies lässt sich mit folgendem HTML­Code verwirklichen: <a href="http://172.16.249.30:8000/cgi­bin/webserver_WS7.py?L4_0"> <img src="../led_off.png" alt="LED off"></a> 20 Interaktiver Webserver mit dem Raspberry Pi Angewandte Informatik INFAP5 2015 Entsprechende Icons findest du hier: . Die Datei style.css und die Bilddateien müssen sich im Verzeichnis webserver befinden. Aufgabe WS8: (für Fleißige) Schreibe ein Programm, das einen als Parameter übergebenen Text als Lauflicht auf dem 14­Segment Display (siehe Kapitel: Schnittstellen mit dem Raspberry Pi) ausgibt. Teste das Programm als webserver_WS8.py. Mehrere Parameter Leider sind mehrere Fragezeichen zur Trennung von mehreren Parametern nicht erlaubt. Möchte man mehrere Parameter übergeben, so ist es am einfachsten diese in einen Parameter zu packen. Dazu verwendet man das &­Zeichen. Um vier LEDs gleichzeitig zu schalten könnte man zum Beispiel: http://172.16.249.30:8000/cgi­bin/webserver_WS8.py?1&0&1&1&Hallo versenden (1. LED ein, 2. LED aus, 3. LED ein, 4. LED ein, 5. Parameter Text"Hallo"). Mit der split()­Methode wird der gepackte Parameter dann in seine Einzelteile zerlegt: Interaktiver Webserver mit dem Raspberry Pi 21 Angewandte Informatik INFAP5 2015 try: para = sys.argv[1] state = para.split ('&') comment5 = state[4] maskOff = 0x00 maskOn = 0xFF if (state[0] == '0'): maskOff = maskOff | 0x10 # P4 = 1 LED ausschalten comment1 = "Die <b>LED P4</b> wurde <b>ausgeschaltet</b>." elif (state[0] == '1'): maskOn = maskOn & 0xEF # P4 = 0 LED einschalten comment1 = "Die <b>LED P4</b> wurde <b>eingeschaltet</b>." else: comment1 = "Nur die 0 und die 1 sind als Parameter gültig!" if (state[1] == '0'): maskOff = maskOff | 0x20 comment2 = "Die <b>LED P5</b> wurde <b>ausgeschaltet</b>." elif (state[1] == '1'): maskOn = maskOn & 0xDF comment2 = "Die <b>LED P5</b> wurde <b>eingeschaltet</b>." else: comment2 = "Nur die 0 und die 1 sind als Parameter gültig!" if (state[2] == '0'): maskOff = maskOff | 0x40 comment3 = "Die <b>LED P6</b> wurde <b>ausgeschaltet</b>." elif (state[2] == '1'): maskOn = maskOn & 0xBF comment3 = "Die <b>LED P6</b> wurde <b>eingeschaltet</b>." else: comment3 = "Nur die 0 und die 1 sind als Parameter gültig!" if (state[3] == '0'): maskOff = maskOff | 0x80 comment4 = "Die <b>LED P7</b> wurde <b>ausgeschaltet</b>." elif (state[3] == '1'): maskOn = maskOn & 0x7F comment4 = "Die <b>LED P7</b> wurde <b>eingeschaltet</b>." else: comment4 = "Nur die 0 und die 1 sind als Parameter gültig!" except: comment1 comment2 comment3 comment4 = = = = "Fehler: "Fehler: "Fehler: "Fehler: Kein Kein Kein Kein gültiger gültiger gültiger gültiger Parameter!" Parameter!" Parameter!" Parameter!" Aufgabe WS9: Teste die Variante mit der gleichzeitigen Übergabe mehrerer Parameter. Teste das Programm als webserver_WS9.py. Aufgabe WS10: (für Fleißige) Schreibe ein Programm, das den Inhalt der Parameter über die serielle Schnittstelle des Raspi versendet. Aufgabe WS11: (für sehr Fleißige) Erweitere die vorige Aufgabe, so dass zusätzlich der Text aus einer Textdatei (serial_in.txt) im Browser angezeigt wird. Ein zweites Python­Programm soll im Hintergrund laufen, die serielle Schnittstelle der Raspi kontinuierlich abfragen, und empfangene Zeilen in die obige Textdatei schreiben. 22 Interaktiver Webserver mit dem Raspberry Pi Angewandte Informatik INFAP5 2015 Quellen: • Raspberry Pi: 45 Experimente mit Hard­ und Software für Elektroniker, Bert van Dam, Elektor­Verlag Aachen Interaktiver Webserver mit dem Raspberry Pi 23