mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ESP32-Webserver liefert Seiten manchmal nicht aus


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Zonk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich programmiere meinen ESP32 mit der ArduinoIDE und lasse diese eine 
relativ simple Seite ausliefern (C-String-Escapesequenzen sind hier noch 
enthalten):
<!DOCTYPE html>\
<html>\
 <head>\
  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\
  <meta name=viewport content=\"width=device-width, initial-scale=1\">\
 </head>\
 <body>\
  <h1 style=\"text-align: center;\">Titel</h1>\
  1/6 h<BR>\
  <IMG SRC=\"/graph.svg\"><BR>\
  1/7 d<BR>\
  <IMG SRC=\"/graphL.svg\"><BR>\
 </body>\
</html>

Das Problem sind die beiden enthaltenen Bilder, diese werden manchmal 
nicht ausgeliefert und fehlen dann in der Webseite. Was genau passiert 
(also ob ein 404 ausgeliefert wird oder gar nichts) kann ich nicht 
erkennen, da die Bilder immer korrekt geladen werden, wenn ich sie 
einzeln anzeige. Bei der Webseite reicht es meistens, ein oder zwei mal 
neu zu laden, dann ist alles da.

Der Code zur Initialisierung der Webserver ist recht simpel:
server.on("/",eventIndex);
server.on("/graph.svg",drawGraph);
server.on("/graphL.svg",drawGraphL);
server.onNotFound(handleNotFound);
delay(500);
server.begin();

Die Callback-Funktionen liefern die Daten dann beispielsweise mit einem 
simplen
server.send(200,"image/svg+xml",sendBuffer);

aus, wobei sendBuffer die nötigen Daten enthält.

Wo könnte hier das Problem liegen? Werden die beiden Bilder eventuell zu 
schnell angefragt?

Jeder Hinweis zur Lösung des Problems ist willkommen!

von Johannes S. (jojos)


Bewertung
0 lesenswert
nicht lesenswert
Hast du den Datenverkehr zum Server schonmal mit dem integrierten 
Debugger im Browser angesehen? Z.B. F12 beim Firefox oder Ctrl-Shift-i 
beim Chrome.
In der Netzwerkanalyse sieht man Antwortzeiten und Fehler.
Kann der Webserver mehrere Verbindungen gleichzeitig bearbeiten? Gibt es 
für Arduino nur einen Webserver oder verschiedene?

von Zonk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Johannes S. schrieb:
> Z.B. F12 beim Firefox

Spannender Effekt: mit dem Firefox funktioniert es immer problemlos, ich 
bekomme also keine Debuginformationen.

Klingt für mich, als wäre es ein Timingproblem, da der ja deutlich 
lahmer ist...

von Johannes S. (jojos)


Bewertung
0 lesenswert
nicht lesenswert
Das glaube ich nicht, eher das der vielleicht mit einem Single threaded 
Server besser klarkommt.
Auch bei Fehlern im Protokoll verhalten sich die Browser 
unterschiedlich.

von Michael D. (nospam2000)


Bewertung
0 lesenswert
nicht lesenswert
Zonk schrieb:
> Wo könnte hier das Problem liegen? Werden die beiden Bilder eventuell zu
> schnell angefragt?

Bei der luftdaten.info Firmware hatten sie vor vielen Wochen ähnliche 
Problem mit dem ESP8266/ESP32, siehe folgende Zeilen auf 
https://github.com/opendata-stuttgart/sensors-software/blob/master/airrohr-firmware/airrohr-firmware.ino:
// Paginate page after ~ 1500 Bytes
server.sendContent(page_content);

Es haben immer wieder Teile der WebPage gefehlt.

An den exakten Grund kann ich micht nicht erinnern, das Grundproblem 
dürfte aber der beschränkte Speicher (besonders des TCP Sendepuffers 
sein). Wenn man weiter sendet, obwohl der Sendepuffer voll ist, dann 
dürften diese gesendeten Daten verlorengehen.

Ein "void" Rückgabewert ist hier nicht sehr hilfreich:
void ESP8266WebServer::sendContent(const char* content)

  Michael

von Johannes S. (jojos)


Bewertung
0 lesenswert
nicht lesenswert
Darum die Frage welcher Webserver benutzt wurde, wo sind die Quellen?
Ein Fehler der bei TCP gerne gemacht wird ist, sich darauf zu verlassen 
das ein send auf einem Socket sofort die gewünschte Anzahl Bytes sendet.

von Michael D. (nospam2000)


Bewertung
0 lesenswert
nicht lesenswert
Johannes S. schrieb:
> Darum die Frage welcher Webserver benutzt wurde, wo sind die Quellen?

Der TO hat geschrieben
"Ich programmiere meinen ESP32 mit der ArduinoIDE"

Ich schätze die Sourcen liegen hier: 
https://github.com/espressif/arduino-esp32/tree/master/libraries/WebServer/src

Beim ESP8266 habe ich mal drübergeschaut, da war Fehlerhandling nicht 
vorhanden, was bei einem "void" Rückgabetyp ja auch verwundert hätte.

 > Ein Fehler der bei TCP gerne gemacht wird ist, sich darauf zu 
verlassen
 > das ein send auf einem Socket sofort die gewünschte Anzahl Bytes 
sendet.

Yupp. Was flow control bedeutet lernen die meisten erst wenn Fehler 
auftreten.

 Michael

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Zonk schrieb:
> Spannender Effekt: mit dem Firefox funktioniert es immer problemlos, ich
> bekomme also keine Debuginformationen.

Du sollst natürlich mit dem Browser debuggen, wo das Problem auftritt. 
Alternativ kann man den Netzwerkverkehr mit Wireshark mitlesen und 
analysieren. Wireshark hebt sogar alle Fehler bunt hervor.

von Zonk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
OK, ich komme der Sache näher: es gibt einen ERR_CONNECTION_RESET, wenn 
die Bilder nicht geladen werden.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Zonk schrieb:
> OK, ich komme der Sache näher: es gibt einen ERR_CONNECTION_RESET,
> wenn die Bilder nicht geladen werden.

Das bedeutet, der Server hat die Verbindung abgelehnt.

Wie viele Verbindungen sind zu diesem Zeitpunkt gleichzeitig offen? Web 
Browser brauchen mindestens 2, damit sie funktionieren. Wenn die Seite 
AJAX oder Websockets benutzt, dann mindestens 3.

: Bearbeitet durch User
von Johannes S. (jojos)


Bewertung
0 lesenswert
nicht lesenswert
wenn es der o.g. WebServer von espressif ist, da steht gleich als erstes 
im Code:
  WebServer.cpp - Dead simple web-server.
  Supports only one simultaneous client, knows how to handle GET and POST.
Darin wird die WIFIServer Klasse benutzt, die kann eigentlich als 
default 4 Connections bedienen, aber der Webservercode nutzt das nicht.
Vielleicht kann man das Problem mit einem 'Tut mir leid, versuche es 
später' Header lösen: 
https://wiki.selfhtml.org/wiki/HTTP/Header/Retry-After

von Zonk (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Ulrich Winter (Gast)


Bewertung
0 lesenswert
nicht lesenswert
In der loop()-Schleife, in der auch der Aufruf von server.handleClient() 
steht, sollte kein delay() vorkommen.

Ich habe diese Fehlermeldung ERR_CONNECTION_RESET gesehen, wenn dort 
doch ein delay() steht.

Falls das bei dir vorkommt, versuch es mal ohne delay() - ist sowieso 
besser.

von ThomasW (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ich weiß, der Faden ist schon alter, aber wieso packst Du die Bilder 
nicht direkt ins HTML? Das geht einfach als Base64-Zeichenkette im src 
Attribut. Dann muss der ESP nur noch diese eine Ressource ausliefern.

von ThomasW (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ThomasW schrieb:
> ist schon alter

sollte heißen: ist schon älter ... blöde Autokorrektur

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.