Session 当多个用户尝试连接到my NodeMCU时出现问题

Session 当多个用户尝试连接到my NodeMCU时出现问题,session,lua,webserver,nodemcu,Session,Lua,Webserver,Nodemcu,我正在用Lua和NodeMCU板做一个小项目,但我对这两个主题都是新手,我遇到了一些麻烦 我有一个按钮连接到设备上,我想做的基本上是手动验证。用户连接到nodeMCU上的服务器后,他将收到一个控制页面,在该页面上他必须按下按钮,刷新页面,并查看我在设备上加载的网页 我现在遇到的问题是,在一个用户按下按钮之后,每个连接到服务器的新用户都将完全跳过第一阶段,直接连接到网页 我一直在尝试一些解决方案,但没有一个真正奏效。在一个用户按下按钮后,我正在考虑初始化一个字符串,该按钮可以用作某种会话令牌,但我

我正在用Lua和NodeMCU板做一个小项目,但我对这两个主题都是新手,我遇到了一些麻烦

我有一个按钮连接到设备上,我想做的基本上是手动验证。用户连接到nodeMCU上的服务器后,他将收到一个控制页面,在该页面上他必须按下按钮,刷新页面,并查看我在设备上加载的网页

我现在遇到的问题是,在一个用户按下按钮之后,每个连接到服务器的新用户都将完全跳过第一阶段,直接连接到网页

我一直在尝试一些解决方案,但没有一个真正奏效。在一个用户按下按钮后,我正在考虑初始化一个字符串,该按钮可以用作某种会话令牌,但我不知道它是否真的可以工作。 有更简单的解决办法吗

以下是我目前的代码:

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)
srv=net.createServer(net.TCP)
srv:监听(80,功能(连接)
连接:打开(“接收”,功能(客户端,请求)
本地buf=“”;
local u,u,method,path,vars=string.find(请求,“([A-Z]+)(.+)?(.+)HTTP”);
如果(方法==nil),则
_,方法,路径=string.find(请求,([A-Z]+)(.+)HTTP”);
结束
本地_GET={}
如果(vars~=nil),则
对于string.gmatch(vars,(%w+)=(%w+&*)do中的k,v
_获取[k]=v
结束
结束
buf=buf.“”
buf=buf.“控制Web服务器”;
buf=buf.“按下连接到设备的按钮,然后单击下面的

” buf=buf.“前进

” buf=buf.“” 本地_on,_off=“”,“” gpio.mode(1,gpio.INPUT,gpio.PULLUP) 函数去盎司(func) 本地last=0 本地延迟=200000 返回函数(…) local now=tmr.now() 如果现在-上次<延迟,则返回结束 最后=现在 返回函数(…) 结束 结束 函数onChange() 如果gpio.read(1)==0,则 断言(loadfile(“server.lua”)) tmr.延迟(500000) 结束 结束 gpio.trig(1,“向下”,去盎司(一旦改变)) 客户:发送(buf); 客户端:close(); 收集垃圾(); (完) (完)
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)
srv:监听(80,功能(conn)
连接:打开(“接收”,功能(客户端,有效负载)
tgtfile=string.sub(有效负载,string.find(有效负载,“GET/”)
+5,string.find(有效负载,“HTTP/”)-2)
如果tgtfile==“”则tgtfile=“index.htm”结束
本地f=file.open(tgtfile,“r”)
如果f~=nil,那么
客户端:发送(file.read())
file.close()文件
其他的
客户端:发送(“.tgtfile..”未找到-404错误。

”) 结束 客户端:close(); 收集垃圾(); f=零 tgtfile=nil (完) (完)
我认为问题在于,onChange函数中加载的server.lua中的
srv:listen()
也位于端口80上。
auth.lua
中的
srv:listen()
不再被调用,因为它们都在端口80上,因此较新的
listen()
取代


您必须以某种方式编写代码,使所有代码都位于相同的
srv:listen()
函数中,并将有关客户端的某些信息(它们的IP、cookie或其他信息)存储在数组中

您使用的是哪个版本的NodeMCU?主板是devkit 1.0。我正在使用自定义固件1.5.4.1