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.
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
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!
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