2016-04-21 7 views
1

Ich verwende NodeMCU (mit ESP8266-E) mit einer aktualisierten Firmware. Alle grundlegenden Befehle funktionieren perfekt, aber es gibt ein Problem.ESP8266, NodeMCU, Soft-AP - UDP Server-ähnlicher Soft-AP, unabhängiger Zugriffspunkt

Ich wollte einen unabhängigen Zugangspunkt erstellen, der ein Verhalten wie ein UDP-Server haben könnte. Das bedeutet, ohne direkte Verbindung zu anderen Access Points. Ein einfacher UDP-Server wie ein Soft-AP.

Ich folgte diesen Schritten:

  1. ich eine neue Firmware auf NodeMCU hochgeladen haben.
  2. Ich habe ESPlorer für bessere Arbeit mit NodeMCU heruntergeladen.
  3. Ich habe den Quellcode unten hochgeladen.
  4. Ich habe mit dem NodeMCU Access Point auf meinem Desktop verbunden.
  5. Ich habe einige Zeichenfolgen an die NodeMCU mit einem Java UDP-Client-Programm gesendet.
  6. Ich habe die Nachrichten auf ESPlorer angeschaut.
  7. NodeMCU hat keine solchen Zeichenfolgen empfangen.

-

print("ESP8266 Server") 
wifi.setmode(wifi.STATIONAP); 
wifi.ap.config({ssid="test",pwd="12345678"}); 
print("Server IP Address:",wifi.ap.getip()) 

-- 30s timeout for an inactive client 
srv = net.createServer(net.UDP, 30) 
-- server listens on 5000, if data received, print data to console 
srv:listen(5000, function(sk) 
    sk:on("receive", function(sck, data) 
    print("received: " .. data) 
    end) 
    sk:on("connection", function(s) 
    print("connection established") 
    end) 
end) 

Als ich versuchte, eine Nachricht mit einer Java-Anwendung zu senden, gab es keine Veränderung in esplorer. Nicht einmal, als ich versuchte, eine Nachricht mit dem Hercules-Programm (tolles Programm für TCP, UDP-Kommunikation) zu senden.

Ich vermute, dass es vielleicht die falsche IP-Adresse sein wird. Ich verwende die IP-Adresse des AP und nicht die IP-Adresse der Station.

Mit anderen Worten verwende ich diese Adresse: wifi.ap.getip() und nicht diese Adresse wifi.sta.getip() für Verbindungen mit dem UDP-Server. Aber sta.getip() gibt ein Nil-Objekt zurück. Wirklich, ich weiß es nicht.

Ich werde mich für jeden Hinweis freuen.

Vielen Dank.

Antwort

2

Ok, lassen Sie uns das neu starten, seit Sie die Frage aktualisiert haben. Ich hätte mein Gehirn einschalten sollen, bevor ich dir die ersten Hinweise gegeben habe, tut mir leid.

UDP ist verbindungslos und daher gibt es natürlich keine s:on("connection"). Daher können Sie Ihre Callbacks nicht auf einem Socket, sondern auf dem Server selbst registrieren. Es ist in the documentation, aber es ist leicht zu übersehen.

Dies sollte erhalten Sie gehen:

wifi.setmode(wifi.STATIONAP) 
wifi.ap.config({ ssid = "test", pwd = "12345678" }) 
print("Server IP Address:", wifi.ap.getip()) 

srv = net.createServer(net.UDP) 
srv:listen(5000) 
srv:on("receive", function(s, data) 
    print("received: " .. data) 
    s:send("echo: " .. data) 
end) 

Ich lief diese gegen eine Firmware von der dev Zweig und von der Kommandozeile getestet wie so

$ echo "foo" | nc -w1 -u 192.168.4.1 5000 
echo: foo 

esplorer dann auch „empfangen korrekt gedruckt: foo ".

+0

Ich habe meine Frage repariert. Danke – Luke

+0

Vielen Dank. Ich habe herausgefunden, dass es endlich perfekt funktioniert. Der Grund, warum es nicht funktioniert, war mein falsches Verständnis des UDP-Protokolls. Als ich mit Hercules versuchte eine Saite zu senden, passierte nichts. Aber nachdem ich mehr Strings/Nachrichten gesendet habe, habe ich herausgefunden, dass der UDP-Server alles richtig empfangen hat. Mit anderen Worten, das UDP-Protokoll ist ein unzuverlässiges Protokoll :) – Luke

+0

"UDP-Protokoll ist ein unzuverlässiges Protokoll" - oh ja, [sehr gut] (https://en.wikipedia.org/wiki/User_Datagram_Protocol#Reliability_and_congestion_control_solutions). –

1

Diese Zeile ist ungültiger Lua-Code. connected ist hier falsch. Sie können nicht einfach ein einzelnes Wort nach einem Funktionsaufruf setzen.

print(wifi.ap.getip()) connected 

Ich denke, Sie so etwas wie print (wifi.ap.getip() .. „verbunden“) zu tun gedenke Obwohl ich glaube, Sie sollten Umgang hier bei wifi.ap.getip som Fehler hinzufügen () gibt keine IP zurück.

Hier beenden Sie die Funktionsdefinition nicht. Weder haben schließen Sie die srv:on Anruf

srv:on("receive", function(srv, pl) 
print("Strings received") 
srv:listen(port) 

Ich nehme an, Sie haben einfach nicht kopieren/einfügen den vollständigen Code.

+0

Ich habe meine Frage repariert. Danke – Luke

+0

Vielen Dank. Ich habe herausgefunden, dass es endlich perfekt funktioniert. Der Grund, warum es nicht funktioniert, war mein falsches Verständnis des UDP-Protokolls. Als ich mit Hercules versuchte eine Saite zu senden, passierte nichts. Aber nachdem ich mehr Strings/Nachrichten gesendet habe, habe ich herausgefunden, dass der UDP-Server alles richtig empfangen hat. Mit anderen Worten, das UDP-Protokoll ist ein unzuverlässiges Protokoll :) – Luke