Hallo Zusammen,
ich nutze den uIP sowie den zugehörigen Web Server von Adam Dunkel.
Per cgi-calls kann ich auch Daten von meinem uC im Web-Client
darstellen.
Nun möchte ich aber Daten im Web Client in ein Textfeld eingeben und per
Knopfdruck an den Web Server schicken.
Könnte mir evtl. jemand einen Link zu einem Code-Beispiel schicken, der
zeigt, wie das prinzipiell funktioniert?
Per Butten kann ja ein GET-Befehl an den Web Server geschickt werden.
Aber an welcher Stelle im httpd.c Code kann ich diese Daten dann
abfangen und weiterverarbeiten? ode geht das dann auch über cgi?
Vielen Dank für Eure Hilfe.
Gruß
Stefan
Nicht httpGET sondern httpPOST. Der Knopf im Formular macht dann
"submit". Das kannst du bei der Auswertung des Headers im Server
abfangen und passend verarbeiten.
Sieh dir als Beispiel mal den Radig Webserver an. Der ist zwar für einen
anderen Stack und etwas buggy, aber für Anregungen prima geeignet, weil
gut kommentiert.
Mit GET.
Der Browser baut dann eine Anfrage nach dem Muster "GET scriptname".
Optional die Formulardaten als Wertepaare hinterher, jeweils mit &
getrennt in der Form name=wert.
Den String fängst Du auf und wertest ihn aus.
Sers Stefan,
ich kenne den leider nicht. Aber irgendwo muß eine Stelle sein die
den String auswertet. Muß man halt finden (der Server muß ja auf
Eingaben reagieren können).
Stefan K. schrieb:> Könnte mir evtl. jemand einen Link zu einem Code-Beispiel schicken, der> zeigt, wie das prinzipiell funktioniert?
Hast du doch schon.
Die "Settings" Seite im httpd ist genau so gemacht.
> Aber an welcher Stelle im httpd.c Code kann ich diese Daten dann> abfangen und weiterverarbeiten? ode geht das dann auch über cgi?
Sieh dir im httpd-cgi.c an, wie er da die "Settings" Seite reingebaut
hat
Es beginnt ganz oben, wo er offenbar ein 'Schlüsselwort' "settings" mit
einer auszuführenden Funktion verknüpft
Diese Verknüpfung muss in die Tabelle der Verknüpfungen eingetragen
werden
1
staticconststructhttpd_cgi_call*calls[]=
2
{
3
&cgi_hello,
4
&cgi_settings,
5
&cgi_welcome,
6
NULL
7
};
aufgerufen wird die Funktion offenbar, weil in der settings.shtml
1
%!: /header.html
2
<h1>NetworkSettings</h1><br>
3
%! settings
4
%!: /footer.html
genau dieses Schlüsselwort "%! settings" vorkommt, was den http Server
offenbar veranlasst die entsprechende Funktion aufzurufen.
Die Funktion selber ist ebenfalls in httpd-cgi.c enthalten
und unterscheidet 2 Modi.
Wird sie mit oder ohne Parameter aufgerufen.
Ohne Parameter, der Fall kommt dann zum Zug, wenn die settings.shtml von
einer anderen Seite verlinkt wurde und über diesen Link betreten wird.
Mit Parameter: Der Fall tritt deswegen ein, weil bei der Erzeugung des
Formulars
1
... <form action=\"/settings.shtml\" ....
wieder settings.shtml als Empfänger angegeben wurde
Das ist alles keine Raketentechnik. Aber ein wenig C sollte man schon
können.
Vielen Dank für die ausführliche Beschreibung.
Die Datei settings.shtml ist in meinem UIP-Stack + http Server nicht
enthalten. Da gibts nur Beispiele für Status-Anzeigen und nichts zum
Schreiben in Richtung http-Server.
Auf googlecode.com habe ich aber ein avr uhttpd Beispiel gefunden, dass
deiner Beschreibung entspricht. Werde ich nun mal ausprobieren.
Also, noch mal vielen Dank.
Gruß
Stefan
Karl Heinz schrieb:> Stefan K. schrieb:>>> Könnte mir evtl. jemand einen Link zu einem Code-Beispiel schicken, der>> zeigt, wie das prinzipiell funktioniert?> Sieh dir im httpd-cgi.c an, wie er da die "Settings" Seite reingebaut> hat>> Es beginnt ganz oben, wo er offenbar ein 'Schlüsselwort' "settings" mit> einer auszuführenden Funktion verknüpftHTTPD_CGI_CALL(cgi_settings,> "settings", run_settings);> Die Funktion selber ist ebenfalls in httpd-cgi.c enthaltenstatic> PT_THREAD(run_settings(struct httpd_state *s, PGM_P ptr))
schade das läuft nicht unter keil
bei mir kommt der fehler
httpd-cgi.c(1526): error: #136: struct "httpd_state" has no field
"param"
Schau Dir mal meine Firmware an:
http://stefanfrings.de/avr_io/index.html
Mein httpd ist inzwischen weit von dem ursprünglichen entfernt, aber mit
etwas Phantasie kannst du den gemeinsamen Ursprung noch erkennen :-)
Jedenfalls habe ich da genau das implementiert, was du brauchst.
Vermutlich findest du dort hilfreiche Lösungsansätze.
Schau dir in httpd-functions.c zuerst die Funktion
httpd_function_dispatcher() an, da wird je nach Parameter eine andere
Unterfunktion aufgerufen.
Und in httpd.c kannst du dir anschauen, wie die URL in
Dateiname/Funktionsname und Parameter gesplittet wird. Genau genommen
wir gar nicht gesplittet, sondern nur zwei Pointer auf die Positionen
gesetzt und Null-bytes eingefügt.
ich spiele ein bischen mit diesen
Beitrag "ARM-Webserver auf uIP-Basis" Webserver.
Meine Leds kann ich damit schalten.
nun wollte ich in einem Textfeld etwas eingeben die seite wird mir auch
angezeigt.
Aber die Variable pcount bleibt immer null.
könnte mir jemand weiterhelfen
danke
Für meinen Geschmack ist das zuviel code um ihn rein theoretisch nur im
Kopf durchzuanalysieren.
Nutze den seriellen Port, um Debug Meldungen zu loggen. Jede Funktion
loggt am Anfange, dass sie aufgerufen wurde und mit welchen Parametern.
Nach jedem if-Ausdruck loggst du das Ergebnis (ob es strue oder false
ergab).
Damit kannst du Schrittweise herausfinden, was genau das Programm tut
oder auch nicht tut. Oder verwende einen Hardware Debugger, falls
verfügbar.
Hallo
Das Problem ist das Point immer Null bleibt
Und somit die if nicht war wird
if(s->param[0] &&
pcount=http_get_parameters_parse(s->param,sizeof(s->param)))>0)
wen neuling schrieb:> Hallo> Das Problem ist das Point immer Null bleibt> Und somit die if nicht war wird>> if(s->param[0] &&> pcount=http_get_parameters_parse(s->param,sizeof(s->param)))>0)
Ich meinte pcount
So als ob der String vom Browser nicht empfangen wird
Hallo
So das beispiel funktioniert bei mir eigentlich ganz gut bis auf das ich
den
button Submit 2mal anklicken muss damit die werte übernommen werden.
beim 1mal anklicken gehts nich.
nutze den aktuellen Mozilla
Woran könnte das liegen.
mfg