2016-06-01 1 views
2

Я работаю над ESP8266, и я пытаюсь запрограммировать Lua. Я попытался создать TCP-сервер, но я принимаю сообщение об ошибке «только один сервер tcp разрешен», когда я написал пример кода ниже. Я создаю сервер, и я не могу закрыть его.Только один сервер tcp разрешил ESP8266 с Lua

Как это исправить?

print("ESP8266 mode is: " .. wifi.getmode()); 

cfg = {}; 
-- Set the SSID of the module in AP mode and access password 
cfg.ssid = "SSID"; 
cfg.pwd = "password"; 
if ssid and password then 
    print("ESP8266 SSID is: " .. cfg.ssid .. " and PASSWORD is: " .. 
      cfg.password) 
end; 
-- Now you should see an SSID wireless router named ESP_STATION when you scan for available WIFI networks 
-- Lets connect to the module from a computer of mobile device. So, find the SSID and connect using the password selected 
wifi.ap.config(cfg); 
ap_mac = wifi.ap.getmac(); 
-- create a server on port 80 and wait for a connection, when a connection is coming in function c will be executed 
sv = net.createServer(net.TCP, 30); 
sv:listen(80, function(c) 
    c:on("receive", function(c, pl) 
     -- print the payload pl received from the connection 
     print(pl); 
     print(string.len(pl)); 
     -- wait until SSID comes back and parse the SSID and the password 
     print(string.match(pl, "GET")); 
     ssid_start, ssid_end = string.find(pl, "SSID="); 
     if ssid_start and ssid_end then 
      amper1_start, amper1_end = string.find(pl, "&", ssid_end + 1); 
      if amper1_start and amper1_end then 
       http_start, http_end = string.find(pl, "HTTP/1.1", ssid_end + 1); 
       if http_start and http_end then 
        ssid = string.sub(pl, ssid_end + 1, amper1_start - 1); 
        password = string.sub(pl, amper1_end + 10, http_start - 2); 
        print("ESP8266 connecting to SSID: " .. ssid .. " with PASSWORD: " .. password); 
        if ssid and password then 
         sv:close(); 

         -- close the server and set the module to STATION mode 
         wifi.setmode(wifi.STATION); 
         tmr.stop(2) 



         print("ESP8266 mode now is: " .. wifi.getmode()); 
         -- configure the module wso it can connect to the network using the received SSID and password 
         wifi.sta.config(ssid, password); 
         print("Setting up ESP8266 for station mode…"); 
         print("Please restart your device"); 
         tmr.delay(10000000); 
         print("Mode is " .. wifi.getmode()); 
         print("Heap:" .. node.heap()) 
         print(""); 
        end; 
       end; 
      end; 
     end; 
     -- this is the web page that requests the SSID and password from the user 
     c:send("<!DOCTYPE html> ") 
     c:send("<html> ") 
     c:send("<body> ") 
     c:send("<h1>ESP8266 Wireless control setup</h1>") 
     mac_mess1 = "The module MAC address is: " .. ap_mac 
     mac_mess2 = "You will need this MAC address to find the IP address of the module, please take note of it." 
     c:send("<h2>" .. mac_mess1 .. "</h2>") 
     c:send("<h2>" .. mac_mess2 .. "</h2>") 
     c:send("<h2>Enter SSID and Password for your WIFI router</h2>") 
     c:send("</form> </html>") 
     c:send("<form action='' method='get'>") 
     c:send("SSID:") 
     c:send("<input type='text' name='SSID' value='' maxlength='100'/>") 
     c:send("<br/>") 
     c:send("Password:") 
     c:send("<input type='text' name='Password' value='' maxlength='100'/>") 
     c:send("<input type='submit' value='Submit' />") 
    end); 
end); 
+0

Открытых два вопроса на SO для этих двух проблем. –

+0

Вы имеете в виду два вопроса под двумя разными темами? – ahmd14

+0

Да. Поскольку SO является сайтом вопросов и ответов, вопрос - это «тема» (возможно, аналогия BBS). –

ответ

2

Nodemcu разрешает использовать только один сервер tcp. , когда вы пытаетесь сохранить файл init.lua и используете esplorer ide, это то, что происходит.

  1. Файл инициализации, уже существующий на nodemcu, удален.
  2. Новый файл init.lua написан.
  3. dofile("init.lua") запускается на nodemcu, который выполняет файл init.lua.

При запуске третьего шага уже существует tcp-сервер, работающий на nodemcu, который не позволяет создать еще один.

Разрешение: - Просто перезагрузите nodemcu. Будет запущен новейший init.lua, и ваш tcp-сервер должен быть включен и выключен.

+0

Это, наверное, «пурист» ответ –

13

Вам необходимо закрыть TCP-сервер, который уже запущен на ESP8266. Перед созданием проверки сервера ли уже начал сервер, если да, то закрыть его и создать новую ..

if srv~=nil then 
    srv:close() 
end 

srv=net.createServer(net.TCP) 
srv:listen(80,function(conn) 
    conn:on("receive",function(conn,payload) 
    print(payload) 
    conn:send("<h1> Hello, World.</h1>") 
    end) 
end) 
+1

Я согласен с этим ответом. – ambassallo

Смежные вопросы