2017-04-26 1 views
0

Je souhaite activer et désactiver une led d'un serveur Web à l'aide de NodeMCU mais chaque fois que je compile la même erreur. Je suis dans un niveau débutant donc j'ai besoin d'aide. Je crois que cette erreur a quelque chose à voir avec la fonction listen(). Peut-être parce que j'ai changé mon DNS, le port 80 ne peut pas être utilisé.Erreur de connexion au serveur Web Lua NodeMCU (traceback de pile de l'adresse utilisée)

Erreur:

dofile("ConectarRedeWireless.lua"); 
    192.168.137.57 255.255.255.0 192.168.137.1 
ConectarRedeWireless.lua:13: address in use 
stack traceback: 
[C]: in function 'listen' 
ConectarRedeWireless.lua:13: in main chunk 
[C]: in function 'dofile' 
    stdin:1: in main chunk 

code:

-- Conexao na rede Wifi 
wifi.setmode(wifi.STATION) 
wifi.sta.config("goncalo","936674888") 
print(wifi.sta.getip()) 
-- Definicoes do pino do led 
led1 = 1 
gpio.mode(led1, gpio.OUTPUT) 
-- Definicoes do Web Server 
srv=net.createServer(net.TCP) 
srv:listen(80,function(conn) 
conn:on("receive", function(client,request) 
    local buf = ""; 
    local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP"); 
    if(method == nil)then 
     _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP"); 
    end 
    local _GET = {} 
    if (vars ~= nil)then 
     for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do 
      _GET[k] = v 
     end 
    end 
    buf = buf.."<h1><u>FILIPEFLOP</u></h1>"; 
    buf = buf.."<h2><i>ESP8266 Web Server</i></h2>"; 
    buf = buf.."<p><a href=\"?pin=LIGA1\"><button><b>LED 1 LIG</b></button></a> <br/><br/><a href=\"?pin=DESLIGA1\"><button><b>LED 1 DES</b></button></a></p>"; 
      local _on,_off = "","" 
    if(_GET.pin == "LIGA1")then 
      gpio.write(led1, gpio.HIGH); 
    elseif(_GET.pin == "DESLIGA1")then 
      gpio.write(led1, gpio.LOW); 
    end 
    client:send(buf); 
    client:close(); 
    collectgarbage(); 
end) 
end) 
+0

Est-ce résolu? Avez-vous besoin de plus de commentaires? –

Répondre

0

Tout d'abord, je vous suggère d'utiliser une séquence d'initialisation appropriée dans laquelle vous attendez que votre appareil soit entièrement connecté au WiFi jusqu'à ce que vous définissez le serveur. Nous gardons un template in our documentation.

srv:listen(80,function(conn) ne peut être appelée qu'une seule fois pour un port donné car vous ne pouvez pas avoir plusieurs sockets de serveur en écoute sur le même port. C'est pourquoi vous obtenez l'erreur

address in use

. Notre net.server:listen() documentation montre comment vérifier si srv est disponible avant d'écouter. Vous pouvez étendre cela en exécutant srv:close() avant de réécouter. Quelque chose comme ceci:

sv = net.createServer(net.TCP, 30) 
if sv then 
    sv:close() 
    sv:listen(80, function(conn) 
    -- do something 
    end) 
end 

Btw, où avez-vous obtenu cet échantillon de code? J'ai vu ça plusieurs fois ici sur Stack Overflow mais il y a plus de failles qui devraient être corrigées.