代码之家  ›  专栏  ›  技术社区  ›  StefanL38

具有自动更新功能的NodeMCU超小型web服务器内存不足

  •  -1
  • StefanL38  · 技术社区  · 8 年前

    我正在测试一个具有自动更新功能的LuaWeb服务器。HTML代码每秒都会重定向到web服务器本身。因此,客户端的web浏览器总是从服务器获取新数据,而不是

    如果一段时间后我只与一个客户端(我的电脑或智能手机)连接,NodeMCU板就会崩溃,并显示以下消息:

    question .

    我把问题缩小了一点:如果HTML代码的刷新频率低于30秒,代码就会占用堆内存。

    那么,我该如何修改这段代码以实现恒定的堆内存使用率呢?

    斯特凡

    tmr.alarm(0, 1000, 1, function()
       if wifi.sta.getip() == nil then
          print("trying to connect to AccessPoint...")
       else
          own_ip, netmask, gateway=wifi.sta.getip()
          print("connected to AccessPoint:")
          print("IP Info: \nIP Address of this device: ",own_ip)
          print("Netmask: ",netmask)
          print("Gateway Addr: ",gateway,"\n")
          print("type IP-Address "..own_ip.." into your browser to display SHT-31-website")
          tmr.stop(0)
       end
    end)
    
    counter = 0
    srv = net.createServer(net.TCP, 28800)
    print("Server created... \n")
    
    srv:listen(80, function(conn)
        conn:on("receive", function(sck, request)
            local message = {}
            counter = counter + 1
            message[#message + 1] = "<head> <meta http-equiv=refresh content=1; URL=http://"..own_ip.."> </head>"
            message[#message + 1] = "<h1> ESP8266 SHT-31 Web Server Ver 003</h1>"
            message[#message + 1] = "<h2>some more text blabla blub"..counter.."</h2>"
            local function send(sk)
                if #message > 0 then
                    sk:send(table.remove(message, 1))
                else
                    sk:close()
                    message = nil
                    print("Heap Available:" .. node.heap())
                end
            end
            sck:on("sent", send)
            send(sck)
        end)
    end)
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Community Mohan Dere    4 年前

    您没有告诉我们您使用的固件版本。我在Chromium浏览器中测试了最新版本,没有发现任何内存问题。我在700多个重新加载周期后中止了测试,堆消耗绝对稳定。

    今年早些时候,我们不得不 reduce the TCP TIME_WAIT parameter value

    等待时间

    (服务器或客户端)表示等待足够的时间 连接终止请求。[根据RFC 793,连接可以 停留时间-最多等待四分钟,称为两个MSL

    资料来源: https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Protocol_operation

    更多详细信息: https://www.rfc-editor.org/rfc/rfc7230#section-6.6

    然而:

    • 如果你的客户(浏览器?)如果不按时关闭旧套接字,您也可以明确地告诉它这样做

    添加适当的HTTP头可以修复这两个问题。因此,消息部分应如下所示:

    local message = { "HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n" }
    
    counter = counter + 1
    
    message[#message + 1] = "<html><head> <meta http-equiv=refresh content=1; URL=http://" .. own_ip .. "> </head>"
    message[#message + 1] = "<body><h1> ESP8266 SHT-31 Web Server Ver 003</h1>"
    message[#message + 1] = "<h2>some more text blabla blub" .. counter .. "</h2></body></html>"
    

    注意到 Connection: close Content-Type: text/html