Forum: Mikrocontroller und Digitale Elektronik ESP8266 nodeMCU Lua Demo-Webserver läuft nicht unter aktueller Firmware


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stefan L. (stefanl38)


Angehängte Dateien:

Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

Hast du mal mit einem LED-Blinker angefangen? Geht das denn?

von Stefan L. (stefanl38)


Lesenswert?

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
von TestX (Gast)


Lesenswert?

Hast du mal den "LUA Webserver" debugged und geschaut wo er sich 
auffhängt ?

von Stefan L. (stefanl38)


Lesenswert?

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
von Joachim S. (oyo)


Lesenswert?

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
von esp (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.