Ich arbeite mit dem LWIP WEBSERVER Beispiel von ST.
Ich wollte nun gern wenn ich ein Button auf der HTML Seite drücke mir
ein gif Bild angezeigt wird.
Es wird aber nun kei Bild angezeigt.
Vielleicht könnte mir wer weiterhelfen.
Anbei mal soweit ich das bis jetzt habe.
Hier die HTML
> Es wird aber nun kei Bild angezeigt.
Das ist zu wenig Fehlerbeschreibung.
Benutze den Debugger im Browser (F12). Im Console Tab wird er Fehler
melden und im Netzwerk Tab kannst du analysieren, was zwischen Browser
und Server übertragen wurde.
Momentan ist mir noch nicht klar, was du da genau machen willst. Ich
rate mal, bitte antworte, ob das so richtig ist:
Deine HTML Datei enthält ein Image mit der id "kinoa". Das Javascript
sendet irgendwelche Formuarfelder an den Server, der anschließen mit
neuen einem Dateinamen für das Bild antworten soll. Anschließend tauscht
das Javascript den Dateinamen von dem HTML Element aus.
Ist das so richtig?
Prüfe, ob diese einzelnen Schritte tatsächlich stattfinden. Dein
Javascript kann dazu hilfreiche Debug Meldungen ins Konsole Fenster
schreiben, du musst sie nur einfügen. Außerdem kannst du prüfen, ob es
den Dateinamen wirklich erfolgreich ausgewechselt hat.
Wo ich mir unsicher bin: Wird die Webseite eigentlich automatisch neu
gerendert, wenn man den Dateinamen ändert? Prüfe das (es sei denn du
bist Dir da bereits sehr sicher, dass es geht), und zwar unabhängig vom
Mikrocontroller. Dein Javascript könnte per Timer getriggert werden und
dann mal ein anderes Bild einsetzen. Wird das dann sichtbar?
Ich habe diese Aufgabe bisher immer anders gelöst, mit zwei
unterschiedlichen Methoden:
a) Der Server liefert nach jedem Submit eine komplette HTML Seite
zurück, wo der Name des Bildes (schon vom Server) ausgetauscht ist. Aus
Sicht des Browsers ist das also eine ganz simple normale HTML Seite,
gerne ohne Javascript.
b) Die Seite enthält von Anfang an alle Bilder aber mit
style="display:none", danach kann das Javascript entscheiden, welches
dieser Bilder sichtbar werden soll.
Das alles löst dein Problem nicht direkt, aber soll Dir helfen, es
weiter zu analysieren.
Hallo,
wenn ich die Seite im Browser aufrufe wird diese auch korrekt angezeigt
auch mit dem Image <img id="kinoa" src="/E_off.gif" width="64"
height="64" alt="layer"> also die Lampe aus wird so richtig angezeigt.
wenn ich nun auf den Button drücke soll der Wert von Licht erhöht werden
und je nach diesem wert das entsprechende IMG angezeigt werden.
Wenn ich zb. im Browser 192.168.2.149/F_75.gif eingebe wird mir auch das
Bild angezeigt.
Das CGI wird auch durchlaufen und jenachdem wie oft der Button gedrückt
wurde erhöht sich auch der Wert von licht[0].
Wenn ich dann F12 drücke im Browser und dann den Button up bekomme ich
als Fehler :: HTTP404: NICHT GEFUNDEN: Der Server hat keine
Übereinstimmungen für den angeforderten URI
Ich kann dein Problem nicht nachvollziehen. Die folgende Seite
funktioniert bei mir tadellos, daher vermute ich, dass dein Javascript
Ok ist:
1
<html>
2
<script>
3
functiontimeout()
4
{
5
document.getElementById("bild").src="/gruen.png";
6
}
7
</script>
8
9
<bodyonload="window.setTimeout(timeout,2000);">
10
<imgid="bild"src="/rot.png">
11
</body>
12
</html>
Test: http://stefanfrings.de/test.html
Wegen dem Error 404 würde ich mal überprüfen, welche URL der Browser vom
Server anfordert und was der Server damit anstellt.
Tritt der HTTP Error 404 beim Aufrufen des CGI oder beim Laden des
Bildes auf?
Stefanus F. schrieb:> Ich kann dein Problem nicht nachvollziehen.>
Wenn ich die Seite aufrufe wird mir auch das Bild korrekt angezeigt.
wenn ich den button auf der Seite drücke ändert sich das Bild nicht,
also der Rückgabe wert vom CGI passt auch nicht vermutlich.
> Wegen dem Error 404 würde ich mal überprüfen, welche URL der Browser vom> Server anfordert und was der Server damit anstellt.>> Tritt der HTTP Error 404 beim Aufrufen des CGI oder beim Laden des> Bildes auf?
Der Tritt erst auf beim Aufruf des CGI
HTTP404: NICHT GEFUNDEN: Der Server hat keine Übereinstimmungen für den
angeforderten URI (Uniform Resource Identifier) gefunden.
GET - http://192.168.2.149/GIF89a@
heiko schrieb:> wenn ich den button auf der Seite drücke ändert sich das Bild nicht,> also der Rückgabe wert vom CGI passt auch nicht vermutlich.
Das kannst du ja im Debugger prüfen. Schau Dir an, was das CGI zurück
liefert und wie der Seitenquelltext danach aussieht. Du kannst sogar
Unterbrechungspunkte ins Javascript setzen und es Zeile für Zeile
ausführen.
> GET - http://192.168.2.149/GIF89a@
Das ist sicher nicht die erwartete URL. Also sendet der Browser eine
falsche URL an den Server, dieser ruft das CGI daher nicht auf.
Andererseits schriebst du:
> Das CGI wird auch durchlaufen und jenachdem wie oft der Button> gedrückt wurde erhöht sich auch der Wert von licht[0].
Das passt nicht zusammen.
Ich lasse mir ja den Wert licht[0] per
printf(" %d\r\n", licht[0]);
ausgeben daran sehe ich ja wenn ich den Button drücke dann ändert sich
auch der Wert von daher wird das cgi ja auch aufgerufen.
Bloss der Rückgabe wert vom CGI wie mache ich das
Ich versuche es nochmal anders: Welche bedeutung hat in deiner Anwendung
"GIF89a@"?
Ich weiß zufällig auswendig, dass jede GIF Datei mit dieser Zeichenfolge
beginnt. Sicher macht es keinen Sinn für den CGI, den Inhalt einer GIF
Datei zu übermitteln.
Da liegt der Hase im Pfeffer.
GIF89a ist der Inhalt der gif-Datei!
Die Funktion des JavaScripts kann ich nicht ganz nachvollziehen, scheint
irgendwie die Datei selbst schon zu laden und das Ergebnis dann der
img.src zuzuordnen.
Sascha
Stefanus F. schrieb:> Ich versuche es nochmal anders: Welche bedeutung hat in deiner Anwendung> "GIF89a@"?>
der Inhalt der GIF Datei oder irre ich mich
> Ich weiß zufällig auswendig, dass jede GIF Datei mit dieser Zeichenfolge> beginnt. Sicher macht es keinen Sinn für den CGI, den Inhalt einer GIF> Datei zu übermitteln.>> Da liegt der Hase im Pfeffer.
ich hatte ja schon geschrieben was das cgi machen soll , je nach dem was
licht[0] für ein Wert hat soll mir das auf der html seite angezeigt
werden.
heiko schrieb:> ich hatte ja schon geschrieben was das cgi machen soll , je nach dem was> licht[0] für ein Wert hat soll mir das auf der html seite angezeigt> werden.
Das CGI soll den Namen einer GIF Datei liefern, damit das Javascript
diesen in die Seite einfügt, damit der Browser diese Datei lädt.
Tatsächlich liefert es aber offensichtlich den Inhalt der GIF Datei.
Man beachte die Kommentare:
1
/* uri to send after cgi call*/
2
// return RESPONSE_PAGE_SET_CGI_RSP_URL;
3
return"/F_100.Gif";
Offensichtlich ist hier vorgesehen, dass du mit "return" bestimmst,
welche Datei serverseitig geladen werden soll, deren Inhalt an den
Browser geliefert wird.
Du willst aber nicht den Inhalt der Datei liefern, sondern einfach nur
den String "/F_100.Gif". Finde heraus, wie das geht.
Wenn du uns verraten würdest, wie die von dir verwendete Bibliothek
heißt und wo sie dokumentiert ist, könnten wir gezielter helfen.
lwip ist es jedenfalls nicht, das ist höchstens der IP Stack, der deinem
ganzen Konstrukt zugrunde liegt.
Stefanus F. schrieb:> Wenn du uns verraten würdest, wie die von dir verwendete> Bibliothek> heißt und wo sie dokumentiert ist, könnten wir gezielter helfen.>> lwip ist es jedenfalls nicht, das ist höchstens der IP Stack, der deinem> ganzen Konstrukt zugrunde liegt.
Doch das ist LWIP.
Im Anhang mal relevante Teile vom Projekt welches auch Funkktioniert.
heiko schrieb:> Doch das ist LWIP.
Da muss noch mehr hinter stecken, denn "FindCGIParameter" gibt es nicht
in der Doku von lwip.
Das ZIP File reicht nicht, daran kann ich weder erkennen, wie die return
Werte der CGI Handler weiter verarbeitet werden, noch kann ich daraus
ableiten, welches Framework dahinter steckt um dessen Doku zu finden.
Jedenfalls hat dein Problem nichts mit lwip zu tun, sondern damit, dass
du nicht weißt, wie diese CGI Handler auszusehen haben.
Stefanus F. schrieb:> heiko schrieb:>> Doch das ist LWIP.>> Da muss noch mehr hinter stecken, denn "FindCGIParameter" gibt es nicht> in der Doku von lwip.>> Das ZIP File reicht nicht, daran kann ich weder erkennen, wie die return> Werte der CGI Handler weiter verarbeitet werden, noch kann ich daraus> ableiten, welches Framework dahinter steckt um dessen Doku zu finden.>
hier nochmal die fehlenden Dateien
> Jedenfalls hat dein Problem nichts mit lwip zu tun, sondern damit, dass> du nicht weißt, wie diese CGI Handler auszusehen haben.
Dein CGI Handler wird von http_find_file() in httpd.c aufgerufen. Sie
muss einen Dateinamen zurück liefern, deren Inhalt wird an den Browser
geliefert. Was du machen willst geht so nicht mit diesem Framework. Du
müsstest es ändern.
Ich würde hier eher den Weg über Server Side Includes (SSI, shtml File)
gehen. Das ist der vorgesehene Weg variablen Content vom Server an den
Browser zu liefern.
Siehe
https://www.st.com/content/ccc/resource/technical/document/user_manual/65/e8/20/db/16/36/45/f7/DM00103685.pdf/files/DM00103685.pdf/jcr:content/translations/en.DM00103685.pdf
Kapitel 6.2.1
In diesem Kapitel steht auch ein Kommentar drin, der erklärt, warum es
mit CGI nicht geht:
"The CGI is a standard web technique used to
execute a request coming from a client on the
server side and then to return a response to the client."
Bis dahin ist noch alles gut, aber dann kommt das:
"In LwIP, the CGI offered works only with GET method requests and can
handle up to 16 parameters encoded in the URI. The CGI handler function
executed on the server side returns a HTML file that the HTTP server
sends to the client."
Du willst aber kein HTML File zurückliefern, sondern nur einen nackten
String. Den könntest du in eine ansonsten leere *.shtml Seite einbetten.