Hallo, jetzt bin ich mir etwas unsicher ob dieses Forum der richtige Platz für meine Frage ist. Wenn nicht dann postet mir doch einen Link wo die Frage besser hinpasst. Nachdem ich nun mit NodeMCU PyFlasher.exe download hier https://github.com/marcelstoer/nodemcu-pyflasher/releases/download/v1.0.0/NodeMCU-PyFlasher-1.0.0.exe das flashen einer aktuellen nodeMCU-Firmware hinbekommen habe klappt der nächste Schritt noch nicht. Ich habe von Random Nerd Tutorials das Lua-Script für den kleinen Demo-Webserver http://randomnerdtutorials.com/esp8266-web-server/#comment-302198 auf meinen Router angepasst und aufs NodeMCU-Board geladen und gestartet. Das Board kriegt auch eine Verbindung zum Router hin und eine IP-Adresse zugewiesen. Aber wenn ich dann die IP-Adresse im Browser eingebe bekomme ich eine Fehlermeldung "ERR_CONNECTION_RESET" Wenn ich eine alte Firmware flashe NodeMCU 0.9.5 build 20150318 powered by Lua 5.1.4 dann funktoniert das Script. Ergo hat sich wohl was an den Programmierdetails geändert. Ich habe aber nur leider keine Ahnung was. Hat jemand einen Mini-webserver als Lua-Script unter aktueller Firmware am laufen? Script habe ich als Datei angehängt viele Grüße Stefan
Hallo Stefan, LED Blinken geht und connecten mit dem Router und IP-Adresse bekommen geht auch nur 192.168.178.47 im Browser aufrufen ergibt Fehlermeldung ERR_CONNECTION_RESET bei neuer Firmware. Mit alter Firmware funktioniert der Demo-Webserver
:
Bearbeitet durch User
Hast du mal den "LUA Webserver" debugged und geschaut wo er sich auffhängt ?
Hi, also hier der code mit Debug-Ausgabe wifi.setmode(wifi.STATION) wifi.sta.config("FRITZ!Box 7490","myPW") print(wifi.sta.getip()) led1 = 3 led2 = 4 gpio.mode(led1, gpio.OUTPUT) gpio.mode(led2, gpio.OUTPUT) print("gpio.mode(led2, gpio.OUTPUT)") srv=net.createServer(net.TCP) print("srv=net.createServer(net.TCP)") srv:listen(80,function(conn) conn:on("receive", function(client,request) print("conn:on('receive'") local buf = ""; local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP"); if(method == nil)then _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP"); print("string.find(request..)") end local _GET = {} if (vars ~= nil)then for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do _GET[k] = v end print("local get for k...") end print("direkt vor buf = buf.. ESP8266 Web Server<") buf = buf.."<h1> ESP8266 Web Server</h1>"; buf = buf.."<p>GPIO0 <a h_ref=\"?pin=ON1\"><button>ON</button>..... print("direkt nach buf = buf ..ESP8266 Web Server<") local _on,_off = "","" if(_GET.pin == "ON1")then gpio.write(led1, gpio.HIGH); elseif(_GET.pin == "OFF1")then gpio.write(led1, gpio.LOW); elseif(_GET.pin == "ON2")then gpio.write(led2, gpio.HIGH); elseif(_GET.pin == "OFF2")then gpio.write(led2, gpio.LOW); end print("direkt vor client:send(buf);") client:send(buf); print("direkt nach client:send(buf);") print("direkt vor client:close();") client:close(); print("direkt nach client:close();") collectgarbage(); end) print("hinter end on connect") end) Wenn ich das Script starte Ausgabe gpio.mode(led2, gpio.OUTPUT) srv=net.createServer(net.TCP) dann dauert es ca 30 Sekunden dann dann Ausgabe hinter end on connect Wenn ich die IP-Adresse im Browser aufrufe http://192.168.178.45/ kommt Ausgabe conn:on('receive' string.find(request..) direkt vor buf = buf.. ESP8266 Web Server< direkt nach buf = buf ..ESP8266 Web Server< direkt vor client:send(buf); direkt nach client:send(buf); direkt vor client:close(); direkt nach client:close(); hinter end on connect Ich schließe daraus das Script wird ausgeführt nur die Daten aus buf werden nicht an den Browser geschickt. musste den href-code rausnehmen Forumwebsite glaubt href sei SPAM
:
Bearbeitet durch User
Stefan L. schrieb: > Ich schließe daraus das Script wird ausgeführt nur die Daten aus buf > werden nicht an den Browser geschickt. Mal in's Blaue geraten: Möglicherweise schliesst Du den Socket, bevor die Daten überhaupt gesendet wurden, bzw. bevor alle Daten gesendet wurden. So wie ich socket.send verstehe, ist das nämlich keine blockierende Funktion, die erst zurückkehrt ist, nachdem alle Daten gesendet wurde, sondern sofort: https://nodemcu.readthedocs.io/en/dev/en/modules/net/#netsocketsend > client:send(buf); > print("direkt nach client:send(buf);") > print("direkt vor client:close();") > client:close(); > print("direkt nach client:close();") > collectgarbage(); Probier mal, ob es funktioniert, wenn Du obige Zeilen durch folgendes ersetzt:
1 | client:send(buf, function() |
2 | print("nachdem die Daten gesendet wurden") |
3 | print("direkt vor client:close()") |
4 | client:close() |
5 | print("direkt nach client:close()") |
6 | ) |
7 | print("direkt nach client:send(buf)") |
Im Übrigen kannst Du Dir die ganzen Semikolons am Zeilenende sparen. Den collectgarbage() Aufruf übrigens offenbar auch - der ist offenbar nicht nur unnötig, sondern hat in genau diesem Kontext teilweise scheinbar sogar für Probleme gesorgt: https://github.com/nodemcu/nodemcu-firmware/issues/320 EDIT: Obiger Code von Dir scheint übrigens nur ein Code-Sample zu sein, das offizieller Teil der NodeMCU-Firmware ist. Die jeweils aktuelle Version dieses Code-Samples, kompatibel mit der neuesten dev-Version von NodeMCU, findest Du offenbar unter: https://github.com/nodemcu/nodemcu-firmware/blob/dev/lua_examples/webap_toggle_pin.lua
:
Bearbeitet durch User
Meine Vermutung: ...du wirst zum Zeitpunkt des net.createServer() noch keine Verbindung zum WLAN haben und damit steht der resultierende Socket in der "Luft"! WSchaue dir mal eine gängige init.lua an, in der solange gewartet wird, bis eine Verbindung zum AP da ist. Stichwort --> wifi.sta.status() == 5
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.