Forum: Mikrocontroller und Digitale Elektronik ESP8266 - Artikel zum Wiki


von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Hallo zusammen,

* ich baue gerade eine ESP8266-Bibliothek (ARM mit
  DMA-Ringbuffer auf STM32),
* mir war dabei im Artkel ESP8266 ein Fehler aufgefallen und
* ich habe eine kleine Frage.

Dieser Thread soll den Anspruch haben, Fragen, die Im Wiki nicht 
beantwortet werden, stellen zu können. Wenn Antworten da sind, würde ich 
die im Wiki ergänzen.

Zu meiner Frage: Ich eröffne mit AT+CIPSERVER=1,80 einen Server für 
HTTP-Requests. Wenn ein Browser zugreift, kommt "Link". Wenn der nächste 
Zugreift, kommt nochmal "Link".

An +IPD,0,… oder +IPD,1,… usw. kann ich erkennen, von welchem Request 
die empfangenen Daten gerade kommen.

Nun muss ich die Daten ja sammeln, den HTTP-Herader auswerten usw.. 
Dafür benutze ich einen Zustandsautomaten.

Meine Frage: Wenn die Verbindung abgebrochen wird, kommt ja ein 
"Unlink". Aber wie finde ich heraus, welcher Request gerade abgebrochen 
wurde? Ich muss ja die Statemachine für den einen Request weiter laufen 
lassen und die andere für das nächste "Link" zurücksetzen.

von Stefan F. (Gast)


Lesenswert?

Bei HTTP spielen Verbindungsaufbau und Ende keine Rolle. Wenn dein 
Server von diesen Ereignissen abhängt, hast du ihn fehlerhaft 
implementiert.

Entscheident sind Requests und Response. Ein Request endet mit einer 
Leerzeile. Die Response endet nach der im Header angekündigten Anzahl 
von Bytes.

Wenn dein Server keine Ahnung hat, wie viele Bytes er senden wird, kann 
er alternativ auch auf die ANgabe im Header verzichten und stattdessen 
das Ende durch Trennen der Verbindung ankündigen. Aber das sollte man 
vermieden, wenn es irgendwie geht. Denn so können die Browser keinen 
anständigen Ladebalken anzeigen und der Browser muss nach jeder 
einzelnen Dateil immer wieder eine neue Verbindung aufmachen, was Zeit 
kostet.

Zusätzlichen arbeiten Server und Browser mit einem Timeout 
(typischerweise 60 Sekunden) damit sie sich nicht aufhängen.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Stefan Us schrieb:
> Bei HTTP spielen Verbindungsaufbau und Ende keine Rolle. Wenn dein
> Server von diesen Ereignissen abhängt, hast du ihn fehlerhaft
> implementiert.

Ob das Wort "Fehlerhaft" hier angemessen ist? Zumindest ist so ein 
Server dann nicht robust programmiert.

Bei drei oder vier offenen Verbindungen kann ich mir schon vorstellen, 
dass bei einem Abbruch und Neuaufbau einer Verbindung mal ein 
Requst-Header versehentlich für Upload-Daten des Vorgängers gehalten 
wird.

Aber mit dem ESP8266 wird man solche Anwendungen kaum haben und ich will 
hier jetzt keine Grundsatzdiskussion über irgendwelche Sonderfälle, die 
theoretisch möglich wären.

Jedenfalls habe ich wohl nichts übersehen: Es hätte ja sein können, dass 
es eine Möglichkeit gibt, bei einem "Unlink" den Kanal herauszufinden.

Stefan Us schrieb:
> Wenn dein Server keine Ahnung hat, wie viele Bytes er senden wird…

Bei "+IPD,0,… oder +IPD,1,… usw."^^ geht es um empfangene Daten 
(Requests), nicht um gesendete.

HTTP ist ja nicht das einzig denkbare, was man mit Telnet machen kann. 
Dann muss man halt alle Protokolle so implementieren, dass man mit einem 
"Unlink" ohne Kanalnummer auskommt.

von Stefan F. (Gast)


Lesenswert?

Ja, offensichtlich fehlt bei der Unlink Meldung die Kanalnummer.

Hast du mal AT+CIPSTATUS? probiert. Vielleicht hilft dessen Ausgabe?

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Stefan Us schrieb:
> Hast du mal AT+CIPSTATUS? probiert. Vielleicht hilft dessen Ausgabe?

Cool, danke. :-)

Keine Verbindung:
1
AT+CIPSTATUS
2
STATUS:4
3
4
OK

Zwei Verbindungen:
1
AT+CIPSTATUS
2
STATUS:3
3
+CIPSTATUS:0,"TCP","192.168.178.21",56694,1
4
+CIPSTATUS:1,"TCP","192.168.178.21",56703,1
5
6
OK

Also nach jedem "Link" oder "Unlink" einfach mal nachschauen! Danke!

PS: Wobei ich mich frage, ob man im Wiki-Artikel alle Kommandos usw. 
genauer beschreiben sollte. Hier z.B. gibt es eine FW mit deutlich 
umfangreicheren Kommandos:

https://github.com/igrr/atproto

Da macht eine Gesamtübersicht eigentlich nur Sinn, wenn auch immer dabei 
steht, mit welcher Firmware welches Kommando unterstützt wird. Bei mir 
z.B.:

> AT+GMR => 00160901
> AT+GMM => ERROR
> AT+GSN => ERROR
> ATV => ERROR
> ATE0 => no this fun
> ATQ1 => ERROR
> AT+GMEM => ERROR
> AT+IDBG? => ERROR
> AT+IPR? => ERROR

von Stefan F. (Gast)


Lesenswert?

Die Leute von Boxtec Shop haben sich große Mühe gegeben, hilfreiche 
Infos zusammenzutragen: 
http://playground.boxtec.ch/doku.php/wireless/esp8266

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Stefan Us schrieb:
> Die Leute von Boxtec Shop haben sich große Mühe gegeben

Sieht gut aus. Danke. Kann man das editieren?

…boxtec.ch/…/esp8266 schreibt:
> Die Ausgabe ist wie folgt aufgeteilt:
> +IPD,<id>,<len>,<data>

Richtig wäre mit Doppelpunkt :
> +IPD,<id>,<len>:<data>

Scheint leider kein Wiki zu sein.

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.