PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Webserver mit dynamischer Seite auf AVR



vohopri
26.08.2011, 11:05
Nachdem mich die mc Faszination gepackt hat, will ich nun versuchen, eine dynamische Webseite auf dem mega32 eines NETIO zu implementieren.

Die Originallösung des Netio, die einen eigenen Client braucht, ist suboptimal. Da hat man 2 Baustellen: Server und Client.

Viel besser und Zeitgemäss ist eine Lösung, die clientseitig mit jedem beliebigen Browser arbeitet, und alles an EINER Stelle gelöst wird, nämlich serverseitig. Entwicklungstechnisch ist das schon einmal von Vorteil, und für den Endanwender umso mehr. Das Gerät wird angeschlossen und kann von jedem PC im Netz aus OHNE irgend eine Installation genutzt werden.

Jetzt habe ich mal Ulrich Radigs Webserver genommen, und für die Verwendung auf dem NETIO adaptiert. Das war schon eine gute Einstiegsübung und das Ergebnis funktioniert bereits. Ich kann das NETIO mit dem Browser im LAN oder auch übers Internet bedienen. Herzlichen Dank an Ulrich Radig, für das Publizieren seiner Software, da hat man die wichtigste Info zu dem Thema in konzentrierter Form vorliegen.

Jetzt soll es weiter gehen, von einer statischen Seite zu einer dynamischen.

Ceos
26.08.2011, 11:25
mir ist der code für beide varianten jetzt nciht SO geläufig, aber du könntest es doch mit speziellen tags lösen, in dem quellcode veränderst du den part, der aus der datei in den socket streamt, einfach so, dass er interpretiert WAS er da sendet udn wenn er dabei auf ein von dir definiertes tag stößt wird anstelle der textdatei die auswertung angestoßen und das ergebnis in den stream eingefügt und dann der rest der datei

vohopri
26.08.2011, 13:02
Ja, das ist die eine Variante. Da ist die Verarbeitung in den Seitentext eingebettet. Das ist günstig bei kleinen inhaltlichen Variationen.

Die andere Variante ist die, dass Seitentext in den Serverquelltext eingebettet wird. Da tut man sich leichter, wenn man grössere und vor allem auch strukturelle Variationen realisieren will.

Das Ganze ist sehr ähnlich dem Schreiben von PHP Scripts.


Der gegenwärtige Stand sieht so aus:

https://www.roboternetz.de/community/attachment.php?attachmentid=19784&d=1314359586

vohopri
27.08.2011, 18:56
https://www.roboternetz.de/community/attachment.php?attachmentid=19804&d=1314467459

Das ist schon ein vom mc veränderter Webseiteninhalt. Softwaretechnisch ist aber noch viel zu tun.

radbruch
27.08.2011, 20:16
Hallo

Für dynamische Webseiten braucht man wirklich nicht viel:

out.print("<html><head><title>Robotersteuerung mit J2ME-Handy</title>");
out.print("</head><body>");
out.print("Kommando: ");
out.print(Kommando);
log(Kommando);
out.print("
<table><tr><td><a href=1>Test1</a></td>");
out.print("<td><a href=2>Test2</a></td>");
out.print("<td><a href=3>Test3</a></td></tr>");
out.print("<tr><td><a href=4>Test4</a></td>");
out.print("<td><a href=5>Test5</a></td>");
out.print("<td><a href=6>Test6</a></td></tr>");
out.print("<tr><td><a href=7>Test7</a></td>");
out.print("<td><a href=8>Test8</a></td>");
out.print("<td><a href=9>Test9</a></td></tr>");
out.print("<tr><td></td><td><a href=0>Test0</a></td><td></td>");
out.print("</tr></table>
");
//out.print(erste_line);
out.print("");
out.print("");
out.print("");
out.print("");
out.print("</body></html>");
out.close();
in.close();
sc.close();
//playFromResource("/"+Kommando+".wav");
if(Kommando.equals("1")) playFromResource("/servo-4ms-r.wav");
if(Kommando.equals("2")) playFromResource("/servo-4ms.wav");
if(Kommando.equals("3")) playFromResource("/servo-4ms-l.wav");
//if(Kommando.equals("4")) playFromResource("/4.wav");
//if(Kommando.equals("5")) playFromResource("/5.wav");
//if(Kommando.equals("6")) playFromResource("/6.wav");
//if(Kommando.equals("7")) playFromResource("/7.wav");
if(Kommando.equals("8")) playFromResource("/servo-10ms.wav");
//if(Kommando.equals("9")) playFromResource("/9.wav");
if(Kommando.equals("0")) playFromResource("/1ms_lang.wav");
}
}
(Aus https://www.roboternetz.de/community/threads/49876-Roboter-mit-J2ME-Handy-steuern?p=485027&viewfull=1#post485027)

Das "Server-Script" (in Java, da kenne ich mich quasi gar nicht aus) sendet eine Tabelle mit Links deren Ziel-URL aus einer Ziffer besteht. Wenn man im Browser dann einen dieser Links anklickt sendet dieser unter anderem die Ziffer zum Server zurück. Dieser filtert dann aus dem Datenstrom die Ziel-URL und daraus wiederrum die Ziffer. Das sollte ein AVR auch können.

Nettes Platinchen, damit liebäugle ich auch schon lange.

Gruß

mic

vohopri
30.08.2011, 09:47
Hallo,

was mic beschreibt ist das Verwenden der GET Methode. Die ist etwas einfacher als die POST Methode und hat den Vorteil, dass das Ganze für den Endanwender leichter zu durchschauen ist. Noraussichtlich werd ich das auch so machen.

Bevor man nun die GET- oder die POST- Variablen auswerten kann, muss man Zugang haben zum HTTP Request und der kommt hier nicht so komfortabel in einem Socket Stream daher, sondern ist Nutzlast in einem Paket, dass der ENC28j60 empfangen hat.

Um da jetzt tiefer einsteigen zu können, hab ich mir den Webserver auf dem mega32 so erweitert, dass ich den Browser zum Debuggen verwenden kann. Da wird es schon etwas lustiger.

https://www.roboternetz.de/community/attachment.php?attachmentid=19828&d=1314692706

So wird der Zustand der LED angezeigt, die LED kann umgeschaltet werden und die Debuginfo wird ausgegeben.

vohopri
31.08.2011, 20:10
Um mit der Sprache C etwas vertrauter zu werden, hab ich mi das c Tutorial von www.tutorials.at (http://www.tutorials.at) und die code::blocks IDE mit C Compiler herunter geladen. Beides hat mir gut weiter geholfen.

Der Getstring ist jetzt zugänglich. Das war das letzte und schwierigste Puzzleteil, das mir gefehlt hat.

https://www.roboternetz.de/community/attachment.php?attachmentid=19843&d=1314817133

Jetzt kann programmiert werden.

vohopri
02.09.2011, 20:07
Jetzt ist der Webserver mit dynamischer Webseite auf meinem NETIO.

https://www.roboternetz.de/community/attachment.php?attachmentid=19870&d=1314989719

Die Anzeige, der Linktext und der Urlstring richten sich nach dem Status der LED.

Hier jetzt weiter zu arbeiten ist schon recht komfortabel, wie man sieht:



if (!strcmp(UrlString,"L0")){LedOff();}
else if (!strcmp(UrlString,"L1")){LedOn() ;}


Mal sehen, was als nächstes kommt: grafische Webseiten oder ein kleines IO-Board auf Punktrasterplatine. Vielleicht auch ganz etwas anderes.