2017-01-10 8 views
0

Я работаю над небольшим проектом, используя Lua и плату NodeMCU, но я довольно новичок в обеих темах, и у меня возникают проблемы.Проблема, когда несколько пользователей пытаются подключиться к моему NodeMCU

У меня есть кнопка, прикрепленная к устройству, и что я хочу сделать, это в основном ручная аутентификация. После того, как пользователь подключился к серверу на узлеMCU, он получит контрольную страницу, где он должен нажать кнопку, обновить страницу и увидеть загруженную на устройстве веб-страницу.

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

Я пробовал некоторые решения, но ни один из них не работал. Я думал об инициализации строки после того, как один пользователь нажал кнопку, которая могла бы работать как какой-то токен сеанса, но я понятия не имею, действительно ли это может работать. Есть ли более легкое решение?

Вот мой код до сих пор:

auth.lua

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.."<html><body>" 
    buf = buf.."<h1> Control Web Server</h1>"; 
    buf=buf.."<p> Press the button attached to the device and click below</p>" 
    buf=buf.."<p><button onclick=\"history.go(0)\">ADVANCE</button></p>" 
    buf = buf.."</form></body></html>" 

    local _on,_off = "","" 

    gpio.mode(1 ,gpio.INPUT,gpio.PULLUP) 

    function debounce (func) 
     local last = 0 
     local delay = 200000 

     return function (...) 
      local now = tmr.now() 
      if now - last < delay then return end 

      last = now 
      return func(...) 
      end 
    end 

    function onChange() 
     if gpio.read(1) == 0 then 
    assert(loadfile("server.lua")) 
      tmr.delay(500000) 
      end 
end 


gpio.trig(1,"down", debounce(onChange)) 

    client:send(buf); 
    client:close(); 
    collectgarbage(); 
    end) 
end) 

server.lua

srv:listen(80,function(conn) 
conn:on("receive", function(client,payload) 
     tgtfile = string.sub(payload,string.find(payload,"GET /") 
     +5,string.find(payload,"HTTP/")-2) 
    if tgtfile == "" then tgtfile = "index.htm" end 

    local f = file.open(tgtfile,"r") 
    if f ~= nil then 
     client:send(file.read()) 
     file.close() 
    else 
     client:send("<html>"..tgtfile.." not found - 404 error.<BR><a href='index.htm'/<%= @a %>>Home</a><BR>") 
    end 
    client:close(); 
    collectgarbage(); 
    f = nil 
    tgtfile = nil 
end) 
end) 
+0

Какую версию NodeMCU вы используете? –

+0

Плата - devkit 1.0. Я использую пользовательскую прошивку 1.5.4.1 – Kegluneq

ответ

0

Я считаю, что проблема заключается в том, что srv:listen() в вашем server.lua что загруженный в функцию onChange также находится на порту 80. srv:listen() в auth.lua больше не вызывается, потому что они оба находятся на порту 80, поэтому новыйВместо этого выполняется.

Вам нужно будет написать свой код как-то всем в одной и той же функции srv:listen() и хранить в нем что-то о клиенте (свой IP-адрес или файл cookie или что-то еще) в массиве.