Forum: Mikrocontroller und Digitale Elektronik ESP8266 send buffer


von Mathias F. (savag)


Lesenswert?

Hallo,
seit Tagen versuche ich meinen ESP8266 Webserver zum laufen zu bringen, 
leider hänge ich an einem scheinbar bekannten Problem. Aber der 
Such-O-Mat hat mich nicht weiter gebracht.

Ich verwende LUA sprich Nodemcu als Firmware.

Das Problem liegt darin das ich eine 8KB große HTML Datei habe die zum 
Browser gesendet wird sobald sich jemand den Server aufruft.
Leider kommen aber nur 3021byte im Browser an.

Hier eine meiner Zahlreichen Varianten
1
srv=net.createServer(net.TCP,10)
2
srv:listen(80,function(conn)
3
    conn:on("receive", function(conn, payload)
4
5
6
file.open("index.html","r") 
7
    for counter=1, 211 do
8
    conn:send(file.readline());  
9
10
end)
11
    end           
12
    file.close()
13
14
        conn:on("sent", function(conn) conn:close() end)
15
    end)
16
end)

Wie man sieht verwende ich das File-System. Wie ich bisher 
herausgefunden habe liegt das Problem darin das der sende buffer 
irgendwann einfach voll ist und dann der ESP einfach neustartet oder 
eben einfach nix mehr sendet.

Schreibe ich den Code so um dass ich die Datei per Serialmonitor also 
mit print() angezeigt bekomme, schreibt er alle Daten aus der Datei!

Ich habe auch schon andere Schleifen versucht aber wie zu erwarten ohne 
Erfolg.

Hat hier jemand noch eine andere Idee um dieses Problem zu umgehen.
Ich muss dazu sagen das ich LUA erst seit 1 Monat kenne und dem 
entsprechend wenig Erfahrung habe.

von Planlos (Gast)


Lesenswert?

Problem: Der ESP kann nicht soviel gleichzeitig buffern.

d.H. du kannst nur einen Schnippsel aus der Datei lesen&senden, und 
musst dann warten, bis dieser Teil über's Netzwerk raus ist.

Dann den nächsten Block der Datei lesen usw.

Schwierig, wenn mehrere gleichzeitige HTTP-Requests laufen können, weil 
die "file"-API nur eine gleichzeitig geöffnete Datei erlaubt.


d.h mitzählen, bei welchen Byte du bist, file öffnen, Seek, read, close. 
und ab damit in die connection.
Bei con:on("sent") dann den nächsten block.

oder mit coroutine arbeiten.


Oder bei anderen spicken, z.B.:
https://github.com/marcoskirsch/nodemcu-httpserver

von Mathias F. (savag)


Lesenswert?

Super Danke :)

Das war genau der fehlende Schwung den ich gebraucht habe.
Leider ist der Ihalt des Link noch etwas zu komlex für mich, aber durch 
deine Auflistung konnte ich das hier verwenden und das funktioniert fürs 
erste
1
srv = net.createServer(net.TCP, 30)
2
srv:listen(80,function(conn)
3
    conn:on("receive", function(conn, payload)
4
5
6
local idx = 0 --keep track of where we are in the file
7
local fname = "index.html"
8
9
function nextChunk(c) --open file, read a chunk, and send it!
10
      file.open(fname)
11
      file.seek("set", idx)
12
      local str = file.read(500)
13
      if not str then return end --no more to send. 
14
      c:send(str)
15
      idx = idx + 500
16
      file.close() --close the file to let other callbacks use the filesystem
17
end
18
19
conn:on("sent", nextChunk) --every time we send a chunk, start the next one!
20
nextChunk(conn) --send the first chunk. 
21
22
23
24
    end)
25
end)

von Michael U. (amiga)


Lesenswert?

Hallo,

kommt mir bekannt vor...

Der Sendbuffer des ESP selbst ist 2290 Byte groß (warum auch immer...).
Es werden jeweils 2 Buffer reserviert. Wenn LUA den Kram nicht selber 
abfängt, sende maximal diese 2290 Byte im Stück.
Die Info über den Buffer stammt aus dem Espressif-Forum, unberechenbare 
Abstürze, die nicht direkt auf diese Größe zurückzuführen waren, hatte 
ich bei meinem Wenserver ebenfalls.
Seit der Aufteilung auf besagte Größe laufen diese absolut stabil bei 
mir.

Gruß aus Berlin
Michael

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.