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


von Zonk (Gast)


Lesenswert?

Ich programmiere meinen ESP32 mit der ArduinoIDE und lasse diese eine 
relativ simple Seite ausliefern (C-String-Escapesequenzen sind hier noch 
enthalten):
1
<!DOCTYPE html>\
2
<html>\
3
 <head>\
4
  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\
5
  <meta name=viewport content=\"width=device-width, initial-scale=1\">\
6
 </head>\
7
 <body>\
8
  <h1 style=\"text-align: center;\">Titel</h1>\
9
  1/6 h<BR>\
10
  <IMG SRC=\"/graph.svg\"><BR>\
11
  1/7 d<BR>\
12
  <IMG SRC=\"/graphL.svg\"><BR>\
13
 </body>\
14
</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:
1
server.on("/",eventIndex);
2
server.on("/graph.svg",drawGraph);
3
server.on("/graphL.svg",drawGraphL);
4
server.onNotFound(handleNotFound);
5
delay(500);
6
server.begin();

Die Callback-Funktionen liefern die Daten dann beispielsweise mit einem 
simplen
1
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. (Gast)


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)


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. (Gast)


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)


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:
1
// Paginate page after ~ 1500 Bytes
2
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. (Gast)


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)


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. (Gast)


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)


Lesenswert?

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

von Stefan F. (Gast)


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.

von Johannes S. (Gast)


Lesenswert?

wenn es der o.g. WebServer von espressif ist, da steht gleich als erstes 
im Code:
1
  WebServer.cpp - Dead simple web-server.
2
  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)


Lesenswert?


von Ulrich Winter (Gast)


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)


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)


Lesenswert?

ThomasW schrieb:
> ist schon alter

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.