Webserver-Software

 

Der Webserver ist es ein experimentelles Projekt. Es soll zeigen, was mit einem einfachen Controller und einer alten Netzwerkkarte noch geht.
Natürlich kann dies aufgrund der beschränkten Ressourcen kein vollwertiger Server sein.
Bei uns laufen die entsprechenden Funktionen zufriedenstellend, was aber keine Gewähr ist, dass es auch bei anderen auf Anhieb oder fehlerfrei klappt.

In der Version V1.40 des AVR-Webserver sind eine Menge neuer Funktionen implementiert worden.
Nachfolgend sind einige davon näher erklärt.

Einige Hinweise gleich vorab:

Die Quellen sind für einen ATMEGA644 ausgelegt.
Dieser verfügt im Vergleich zum MEGA32 über einen grösseren Flash- und RAM-Speicher.
Der MEGA644 ist pinkomp. zum MEGA32 und kann direkt in der ISA-Ctrl-Platine verwendet werden.
Das fertige Hexfile ist für einen 14,7456 MHz Quarz kompiliert.

Die aktuelle Version von PonyProg V2.06f beta hat leider noch keine Unterstützung für den MEGA644.
So kann man am besten das beigelegte Makefile zum Programmieren des Mikrcontrollers benutzen.
Dabei werden auch die Fusebits gleich korrekt eingestellt. --> WICHTIG

In der Zip-Datei findet man ein Verzeichnis 'files_sd_card'.
Die Dateien darin sollte man zum Testen komplett in das Hauptverzeichnis der SD-Karte (FAT16) kopieren.

 

Die Quellen findet man im Downloadbereich...

Konfiguration per Datei auf der SD-Karte

Bis auf wenige Ausnahmen kann die Konfiguration per Textdatei (Name: SERVER.CFG) auf der SD-Karte eingestellt werden.
Dadurch ist es jetzt sehr einfach z.B. die IP- oder MAC-Adresse zu verändern.

Die Parameter sind mit Kommentaren versehen und eigentlich selbsterklärend. Aus diesem Grund erspare ich mir hier eine detailierte Beschreibung.

So kann man z.B. auch die Kameraunterstützung einfach deaktivieren.

Hier mal eine Beispieldatei:

Wichtig:

Die IP-Adressen müssen immer 3stellig sein - also 192.168.000.081 und nicht 192.168.0.81

Parameter sind meist 4stellig.

Ein entsprechender Hinweis befindet sich auch immer im Kommentar.

 

NTP

Der Webserver kann sich die aktuelle Uhrzeit von einem Zeitserver aus dem Internet holen.
Dazu trägt man einfach die IP-Adresse des NTP-Servers in die Konfigurationsdatei ein.
Bei einer Internet-IP unbedingt auch die Router-IP eintragen!
Alternativ kann man sich auch einen NTP-Server lokal auf seinem heimischen PC unter Windows oder Linux installieren.

Hinweis: Die interne Uhr im Webserver beginnt bei Programmstart mit 00:00 Uhr 01.01.1900.

Hier mal ein Screenshot der seriellen Ausgabe:

screen1

Zur Erklärung:

Der Webserver wurde ohne SD-Karte gestartet. Nach 3 erfolglosen Versuchen, die SD-Karte zu finden, startet das Programm trotzdem.
Hierbei werden die interne Konfiguration, die beim Compilieren festgelegt wurde, verwendet (siehe main.h).

Zum Schluss kommt die Meldung, dass zur IP-Adresse des NTP-Server (192.168.1.88) keine ensprechende MAC-Adresse aufgelöst werden konnte, d.h. es ist z.Z. kein Rechner mit der IP erreichbar.

Der Mailserver (SMTP) ist im Beispiel oben übrigends GMX.

 

Hier nochmal ein Screenshot mit eingesteckter SD-Karte:
screen2

Bei Start wurde die SD-Karte und das Konfigurationsfile (server.cfg) gefunden und geladen.
Wie man sieht, sind u.a. die IP-Adressen anders.

Zum Schluss sieht man, dass per ARP-Request jetzt auch eine MAC-Adresse von NTP-Server gefunden wurde.
(Der NTP-Server läuft hier lokal auf meinem PC)

In der letzten Zeile sieht man die Antwort vom NTP-Server.
Die Webserver-Uhrzeit ist jetzt aktuell.

 

Webseiten

Die interne Webseite im Flash des Mikrocontrollers ist über 'index.htm' erreichbar.
Ist eine SD-Karte vorhanden, wird auch hier nach den Dateien gesucht.

Es gibt eine Besonderheit:

Dateien auf der SD-Karte mit der Endung '.asp' werden speziell interpretiert.
Ein Beispiel (index.asp) ist auch in der Zip-Datei enthalten.

Damit ist es möglich, direkt auf einen RAM-Bereich im Mikrocontroller lesend und schreibend zuzugreifen.
Dies kann per bitweise oder per Integer erfolgen.

Dies erleichtert die Übergabe von Parametern vom Browser und das Darstellen von aktuellen Werten des Mikrocontrollers.

Diese Funktion ist im wesentlichen von Mark Haemmerling erstellt worden und nur geringfügig verändert worden.

Eine detailierte Beschreibung muss noch erstellt werden.

Hier mal ein Screenshot der Beispieldatei:
screen3

Diese speziellen Tag beginnen und enden immer mit `. (rechts oben neben Backspace)
Das Format ist einfach:

wx:Format

oder

bx.y:true:false

x=Index
y = Bitposition

Format = Formatstring für printf

Beispiel 1:

Im HTML-Code sieht das dann so aus:
<p>AN5 = `w0:4u`</p>

das bedeutet:

W0 = Word Index 0
4u = Formatierung für printf, also 4 Stellen unsigned

Für den Fall, dass im Index 0 der Wert 6751 steht, ergibt
`w0:4u` = 6751
`w0:4X` = 1A5F

 

Beispiel 2:

<img src="`b9.1:red.gif:green.gif`">

b9.1 = Index 9 Bit 1

wenn das Bit = 1, gebe "red.gif" aus,
wenn das Bit = 0, gebe "green.gif" aus

Für den Fall, dass das Bit9.1 = 1 ist, wird an den Browser folgendes gesendet:

<img src="red.gif">

Am besten einfach mal die Beispieldatei genau anschauen, dann sollte die Funktionsweise klarer werden.

 

Kamerafunktionen / FAT16 mit Schreibunterstützung

Das FAT-System wurde von Stephan Busker (http://www.mikro-control.de) um entsprechende Schreibfunktionen erweitert.
Dadurch sind mir jetzt ein paar neue Aufgaben für den Webserver eingefallen.

Anmerkung:
Bei aktivierter Kamerafunktion ist nach der Initalisierung keine (lesbare) serielle Ausgabe mehr möglich.
Also NTP, SMTP,... vorher testen.

 

Speichern des Kamerabildes auf die SD-Karte

Man kann in einem bestimmten Zeitintervall ein Bild der Kamera auf die SD-Karte speichern.
Dabei wird die Uhrzeit als Dateiname verwendet.
Auf diese Weise lassen sich z.B. leicht Zeitrafferaufnahmen erstellen.

Das Zeitintervall (in Minuten) kann in der Konfigurationsdatei (server.cfg) eingestellt werden.
Die erforderlichen Optionen sind:
CAM_STORE_ENABLE=YES
CAM_STORE_TIME=0005

Eine Zeit von 0000 deaktiviert das Intervallspeichern.

 

Externer Trigger für die Kamera

Alternativ kann man auch das Speichern durch ein externes Signal (z.B. einem Türkontakt oder Bewegungsmelder) auslösen.
Diese Funktion kann auch zusätzlich zum Intervallspeichern verwendet werden.
D.h. man speichert z.B. 1 mal pro Stunde ein Bild und zusätzlich bei Auslösen des Triggers.

Als Parameter sind Portpin, Logik (High - oder Lowaktiv) und die minimale Zeit zwischen 2 Triggerereignissen einstellbar.
Durch diesen Mindestabstand wird verhindert, dass ständig auf die SD-Karte geschrieben wird.

Die erforderlichen Optionen sind:
CAM_STORE_ENABLE=YES
EXT_TRIG_ENABLE=YES

# State (HIGH or LOW)
EXT_TRIG_STATE=HIGH

# min. Zeit zw. 2 Trigger
# in Sekunden (4stellig!!!)
EXT_TRIG_TIME=0100

# Portpin für ext. Trigger
# 00=B4, 01=D2, 02=D3
# 04=D4, 08=D5, 16=D6
# WICHTIG: 2stellig!!!

EXT_TRIG_PIN=00

FTP-Funktion

Neben dem Speichern auf die SD-Karte, sind ausserdem die Funktionen für einen FTP-Client implementiert worden.

Jetzt kann man die Bilder der Kamera auf einen FTP-Server übertragen.
Dies kann ein Server im Internet oder z.B. eine auch eine LAN-Festplatte sein.

Die FTP-Funktion ist für das Intervallspeichern und für den externen Trigger möglich.

Die Optionen für die FTP-Dateiübertragung sind:
FTP=192.168.000.081

# FTP-Login (je max. 8 Zeichen)
FTP_USER=test
FTP_PASS=test123

# Bilder auf FTP-Server übertragen?
FTP_PUSH_ENABLE=YES

Mail-Funktion

Der Webserver kann jetzt getriggert E-Mails verschicken.

Die Textvorlagen werden auf der SD-Karte als Dateien hinterlegt: MAIL-01.txt, MAIL-02.txt usw.
Wenn in einer festgelegten Variablen z.B. das 2.Bit gesetzt wird, wird automatisch die Mail mit dem Inhalt der Datei MAIL-02.txt verschickt.

In der Demodatei INDEX.ASP kann man z.B. die Mails manuell auslösen.

Die grundsätzliche Funktionen sind auch von Mark Haemmerling und wurden von mir angepasst bzw. erweitert (z.B. AUTH-Login)
Eine weitergehende Implementierung ist z.Z. noch nicht vorhanden.

Es wäre vorstellbar, z.B. in Abhängigkeit von Portpins verschiedene Statusmail zu verschicken.
In der Art: Fenster geöffnet oder nicht alle Türen geschlossen....

Die entsprechenden Optionen in der Konfigurationsdatei sind:
SMTP=213.165.064.020
SMTP_AUTH_LOGIN=YES

SMTP_USER=test
SMTP_PASS=baum

# Mail senden aktivieren?
MAIL_TRIGGER=NO

Ob AUTH_LOGIN aktiviert werden muss, hängt vom jeweiligen Mailserver ab.
Dies sind z.B. die Einstellungen für einen GMX-Account.

Routerunterstützung

Es können jetzt IP-Adressen im lokalen Netz oder im Internet angegeben werden.
(für SMTP, NTP, FTP,...)

Voraussetzung für externe IPs ist eine entsprechende Festlegung der Router-IP-Adresse.

Grundsätzlich wird noch dem Programmstart versucht, die MAC-Adressen zu den festgelegten IP-Adressen zu bestimmen.
Adressen, die nicht im lokalen Netz 192.168.*.* liegen, werden automatisch durch den Router geleitet, sofern dieser ansprechbar ist.

Die serielle Ausgabe des Webserver leistet bei der Fehlersuche gute Dienst.
Dabei ist unbedingt die Kamera-Unterstützung auszuschalten !

 

Sonstige Erweiterungen

Neben den bereits vorgestellen Erweiterungen sind eine Menge Details angepasst worden.
So wurde der TCP-Stack um diverse Funktionen ergänzt.
Neben TCP können auch UDP-Pakete verarbeitet werden und es kann selbstständig eine Verbindung aufgebaut werden
(z.B. für den FTP-Transfer)

Ein ARP-Request ist hinzugefügt worden, um die passenden MAC-Adressen zu den IP-Adressen bestimmen zu können.

 

TODO

Nachfolgend sind noch einige Punkte aufgeführt, die man noch implentieren/testen/erweitern könnte.
Es wäre nett, wenn ich dabei Unterstützung bekommen könnte.

Verwertbarer Quellcode, d.h. am besten mit möglichst minimaler Ergänzung der Funktionen, ist immer willkommen.
So könnte man versuchen, die Erweiterungen immer in einer Quellcode-Version zu bündeln.

In der Vergangenheit sind schon immer tolle Erweiterungen entwickelt worden. Leider sind dies aber dann sehr spezielle Projekte,
die man nur mit erheblichen Aufwand wieder in eine allgemeine Form bringen kann.

Ich habe mit der Version V1.40 versucht, die unterschiedliche Erweiterungen wieder zusammen zu führen.
Es wäre gut, wenn man dies eine zeitlang so beibehalten könnte....

Hier nun eine lockere Liste mit Ideen:

  • ausführliche Tests: Aufgrund der zalhreichen Änderungen werden sich wohl einige Bugs eingeschlichen haben
  • DNS- Lookup: dann könnte man auch 'mail.gmx.de' verwenden
  • Mail-Trigger erweitern
  • Kamerabilder per Mail verschicken
  • 3COM-Netzwerkkarten testen
  • RTF-Dateien oder HTML-Seiten verarbeiten (z.B. News-Ticker)
  • Directory-Funktion für den Webserver
  • FAT um Verzeichnis-Funktionen erweitern
  • FAT um Datum und Zeitstempel erweitern
  • Optionen der Konfigdatei per Browser veränderbar und speicherbar
  • Webserver nur als Interface zwischen Browser und eigenlicher 2ter Mikrocontroller-Steuerung
    Kommunikation zw. Webserver und 2ter Mikrocontroller-Steuerung per serieller Schnittstelle.
    Dies sollte so universell sein, dass man die Seiten auf der SD-Karte speichert und beliebige Paramter vom Webserver nur an die Mikrocontrollersteuerung durchgereicht werden.
    Eine Anpassung der Webserver-Software wäre dann nicht notwendig.