Forum: Mikrocontroller und Digitale Elektronik ESP8266 als TCP Server


von Jojo S. (Gast)


Lesenswert?

Hallo ESP User,
ich arbeite an meiner Reflow Ofen Steuerung und möchte den ESP8266 
einsetzen um Steuerbefehle und Profile zu empfangen und während des 
Betriebs die Temperaturdaten zu senden.
Ein ESP Modul habe ich an einem mbed LPC1347 Controller zum Laufen 
bekommen, ich verwende eine Lib von iTead.
Den Server starte ich und setze ein Timeout von erstmal 10s. Taugt der 
ESP jetzt um eine Verbindung längerfristig aufrecht zu erhalten? Mein 
Steuerprogramm wäre der Client und der Ofen der Server. Wenn die 
Verbindung steht soll der Ofen zyklisch (alle 250 oder 500 ms) seinen 
Status senden. Muss man dabei vor jedem Senden den Status abfragen oder 
wie bekommt man mit das eine Verbindung beendet wurde?

von Tobi (Gast)


Lesenswert?

Wenn alle Verbindungen zum esp8266 modul beendete wurden. Gibt es die 
einen string aus. Weis leider aus dem Kopf nicht welchen.

von chris_ (Gast)


Lesenswert?


von chris_ (Gast)


Lesenswert?

... ich glaube der obere Link war der Code für den PC ...

hier der Code für den ESP8266:
https://github.com/nodemcu/nodemcu-firmware/blob/master/examples/telnet.lua

von Klaus (Gast)


Lesenswert?

chris_ schrieb:
> Verwendet von euch jemand "lua" als server?:

Ich verwende die nodemcu firmware. Ich habe mir ein paar Hilfsfunktionen 
in lua geschrieben, und die in init.lua auf dem ESP gespeichert. Diese 
wiederum spreche ich über die serielle von meinem µC an. So sende ich 
auch Daten ins LAN an jeden beliebigen Host. Der muß natürlich einen 
socket offen haben. Das geht auch umgekehrt. Ganz normale 
socket-Programmierung eben.

Jojo S. schrieb:
> Den Server starte ich und setze ein Timeout von erstmal 10s. Taugt der
> ESP jetzt um eine Verbindung längerfristig aufrecht zu erhalten? Mein
> Steuerprogramm wäre der Client und der Ofen der Server. Wenn die
> Verbindung steht soll der Ofen zyklisch (alle 250 oder 500 ms) seinen
> Status senden.

Mit der lua Firmware ist das kein Problem. Das sollte aber auch mit dem 
AT+ Interface funktionieren, wurde früher mit Modems ja auch so gemacht.

> Muss man dabei vor jedem Senden den Status abfragen oder
> wie bekommt man mit das eine Verbindung beendet wurde?

Bei der lua Firmware läuft das anders. Da hat hat ein socket Callbacks 
für connect, disconnect, data etc. Das läuft ähnlich ab, wie in js. Da 
hab ich dann lua Funktionen (keine länger als ein Zehnzeiler) für 
geschrieben, die eine passende Nachricht auf der seriellen zum µC 
schicken. Für soetwas brauchts keine Library, da dauert es länger die 
Library richtig zu verstehen, als es selber zu schreiben.

MfG Klaus

von Jojo S. (Gast)


Lesenswert?

Danke für die Antworten. Das mit dem LUA hört sich interesant an, nur 
damit habe ich mich aber noch nicht beschäftigt.
Die Bibliothek die ich benutzt habe kapselt nur das Ping-Pong mit den AT 
Befehlen und den Antworten und kümmert sich nicht um irgendwelche 
Abläufe. Im ersten Versuch habe ich den Server gestartet und eine endlos 
Schleife mit recv() und Timeout von 250 ms laufen lassen. Wenn Zeichen 
ankommen gebe ich etwas aus. Das lief aber nicht zuverlässing und hing 
sich nach einigen Ausgaben auf. Vielleicht das Problem bei 
gleichzeitigem Senden/Empfangen das hier schon diskutiert wurde?

von chris_ (Gast)


Lesenswert?

Mit der Lua Bibliothek habe ich mich auch noch nicht befasst. Der Code 
sieht aber sehr einfach aus und ich würde es gerne irgend wann mal 
probieren.

Klaus, kannst Du mir sagen, Wie man vorgehen muss, um Lua auf dem 
ESP8266 zu installieren und wie bekommt man dann die Lua Scripte auf das 
Modul?

von Klaus (Gast)


Lesenswert?

Jojo S. schrieb:
> Im ersten Versuch habe ich den Server gestartet und eine endlos
> Schleife mit recv() und Timeout von 250 ms laufen lassen. Wenn Zeichen
> ankommen gebe ich etwas aus. Das lief aber nicht zuverlässing und hing
> sich nach einigen Ausgaben auf.

Ich benutze im Moment nur eine Richtung: der ESP öffnet einen socket zu 
einem PC, schickt ein paar k Daten und macht den socket wieder zu. Man 
darf den ESP dabei nicht überfahren, er hat (bei der lua Firmware) einen 
Buffer von ca. 250 Bytes. Also schicken und auf den Prompt warten, usw.

Umgegekehrt habe ich mir bisher nicht die Mühe gemacht, zwischen Prompt 
und Daten von der Gegenseite zu unterscheiden. Das kann aber noch 
kommen.

MfG Klaus

von Jojo S. (Gast)


Lesenswert?

bin auch einen Schritt weiter, das Timing habe ich in meinem Programm 
aufgeräumt und sende jetzt etwa alle 0,5 s. Ausserdem habe ich in der 
iTead Lib noch eine Unschärfe beseitigt: vor dem Senden von Befehlen 
wird immer ein flush() aufgerufen, aber wenn zwei Befehle schnell 
nacheinander kommen können noch restliche Zeichen vom ersten Befehl 
ankommen. Es wird nicht bis zum letzten CR oder LF gewartet (die 
Antworten vom ESP scheinen auch nicht alle gleich zu sein). Das habe ich 
erstmal durch ein kurzes wait vor dem buffer löschen im flush() gefixt.
Jetzt muss ich noch den Status vor dem Senden auswerten, wenn die 
Verbindung besteht wird das im Status gemeldet:
STATUS:3
+CIPSTATUS:0,"TCP","192.168.100.74",53105,1,    0.0,   17.8,    0.0, 
17.8
STATUS:3
+CIPSTATUS:0,"TCP","192.168.100.74",53105,1,    0.0,   18.2,    0.0, 
18.2
STATUS:3
+CIPSTATUS:0,"TCP","192.168.100.74",53105,1,    0.0,   18.1,    0.0, 
18.1
STATUS:3

von chris_ (Gast)


Lesenswert?

>Klaus, kannst Du mir sagen, Wie man vorgehen muss, um Lua auf dem
>ESP8266 zu installieren und wie bekommt man dann die Lua Scripte auf das
>Modul?

Hab's selber gefunden:
https://github.com/nodemcu/nodemcu-flasher

von chris_ (Gast)


Lesenswert?

Und hier noch das Dev-Kit.

https://github.com/nodemcu/nodemcu-devkit

Bleibt nur die Frage nach der Baudrate.

von Jojo S. (Gast)


Lesenswert?

> Bleibt nur die Frage nach der Baudrate.

welche Frage hast du da? Die Baudrate kann man per AT-Befehl abfragen 
und einstellen, AT+CIOBAUD?

von Stefan F. (Gast)


Lesenswert?

Beim Internet und WLAN solltest du generell nicht darauf hoffen, eine 
Verbindung lange aufrecht erhalten zu können. Schreibe die Software 
besser so, dass sie jederzeit bei Bedarf eine neue Verbindung aufbauen 
kann.

Da ich diesem Modul (noch) nicht viel zutraue, würde ich sogar eine 
Möglichkeit vorsehen, das ganze Modul durch Unterbrechung der 
Spannungsversorgung neu zu starten.

von Jojo S. (Gast)


Lesenswert?

Stefan Us schrieb:
> Beim Internet und WLAN solltest du generell nicht darauf hoffen, eine
> Verbindung lange aufrecht erhalten zu können. Schreibe die Software
> besser so, dass sie jederzeit bei Bedarf eine neue Verbindung aufbauen
> kann.

ja, ist richtig. Die Doku zu dem Modul ist ein Puzzle, man findet die AT 
Befehle mehr oder weniger gut dokumentiert und verschiedene Beispiele, 
aber was in welchen Fehlerfällen passiert muss man experimentell 
ermitteln.
Jedenfalls sendet das Modul jetzt kontinuierlich und ohne erkennbare 
Aussetzer, mit Auswertung des Status scheint das sehr gut zu laufen. Und 
solange es auf die AT Befehle reagiert kann man ja auch Software Reset 
auslösen.

von chris_ (Gast)


Lesenswert?

>welche Frage hast du da? Die Baudrate kann man per AT-Befehl abfragen
>und einstellen, AT+CIOBAUD?

Ich meinte die Baudrate zum flashen des LUA Interpreters. Aber 
wahrscheinlich muss man die nicht wissen, da das Download-tool die 
richtige Baudrate einstellt.

von Stefan F. (Gast)


Lesenswert?

> Jedenfalls sendet das Modul jetzt kontinuierlich und
> ohne erkennbare Aussetzer

Das war auch mein erstes Testergebnis. Ich hatte es an einen Laptop 
gehangen und mit einem Shell Script immer wieder eine lokale Webseite 
aufgerufen (also als Client, nicht Server). Im Server Log konnte ich am 
nächsten Morgen alle Requests wieder finden, ohne Aussetzer.

von R. W. (quakeman)


Lesenswert?

Ich habe in den letzten Wochen auch etwas mit den ESP8266 Modulen und 
der Lua Firmware (NodeMCU) herum experimentiert. Auch ohne Vorkenntnisse 
in Lua kommt man sehr schnell zu guten Ergebnissen. Die Sprache 
abstrahiert komplexe Funktionen durch eine gute API und man kommt gut 
damit klar.

Als Beispiel wollte ich einen kleinen Webserver auf den Modulen laufen 
lassen und darüber den Zustand aller GPIOs steuern können. Mittlerweile 
kann ich über den Webserver jeden GPIO als Ausgang oder Eingang 
konfigurieren und steuern/auslesen. Alternativ können maximal 4 
beliebige GPIO als PWM konfiguriert werden.

Das Beispiel zeigt, wie einfach man so etwas in Lua realisieren kann, 
auch wenn es mich anfangs einiges Zeit gekostet hat mit der speziellen 
Syntax zurecht zu kommen. :)

Aber man muss fairer weise auch sagen, dass die NodeMCU Firmware 
deutlich besser dafür geeignet ist nur den integrierten Controller zu 
verwenden. Als Interface für einen externen Controller ist die 
AT-Firmware dann doch besser geeignet.

Ciao,
     Rainer

von Jojo S. (Gast)


Lesenswert?

Für den Betrieb am externen Controller finde ich die AT Kommandos 
nervig, gibt es Alternativen mit SPI oder I2C?
In den Antwortstrings nach Daten zu fischen finde ich nicht sehr 
effizient. Die Lib die ich benutze kommt aus der Arduino Welt, die C++ 
Quellen kann man meist mit wenigen Anpassungen auch für mbed verwenden. 
Da werden die Antworten zwar relativ komfortabel mit einer Stringklasse 
verarbeitet, die ruft aber ganz brutal für jedes ankommende Zeichen ein 
realloc() auf...
Immerhin läuft der TCP Server jetzt sehr stabil. Bei einem Test über 
Nacht hatte der Telnet Client zwar die Verbindung verloren, das dürfte 
aber an der nächtlichen Zwangstrennung durch die Fritzbox liegen. Das 
Modul meldet dann Linkstatus '4' = disconnected, dann muss vermutlich 
wieder der Link zum AP neu aufgebaut werden.

von R. W. (quakeman)


Lesenswert?

Die Lua Firmware kann Onewire, I2C und SPI an beliebigen Pins 
aktivieren. Eventuell wäre das eine Möglichkeit darüber mit dem Modul zu 
kommunizieren. Habe das aber selber noch nicht ausprobiert.

von drama (Gast)


Lesenswert?

Gibt es mittlerweile eigentlich schon irgendwas in Richtung IPv6 für den 
ESP8266? Ohne IPv6 ist der Chip bald recht nutzlos.

von R. W. (quakeman)


Lesenswert?

drama schrieb:
> Gibt es mittlerweile eigentlich schon irgendwas in Richtung IPv6 für den
> ESP8266? Ohne IPv6 ist der Chip bald recht nutzlos.

Mit der Aussage "bald" wäre ich erst mal vorsichtig. IPv6 gibt es seit 
über 10 Jahren und selbst heute ist es noch nicht mal annähernd 
flächendeckend eingeführt worden. ;)

Abgesehen davon hängen die ESP sowieso nicht direkt im Internet sondern 
hinter einem Router im Intranet. Und dort wird auch weiterhin 
hauptsächlich IPv4 verwendet. Also nur das Verbinden zu IPv6 Adressen im 
Internet wird dann zu einem Problem.

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.