Я работаю над небольшим проектом, используя 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)
Какую версию NodeMCU вы используете? –
Плата - devkit 1.0. Я использую пользовательскую прошивку 1.5.4.1 – Kegluneq