【问题标题】:NodeMCU with ESP8266 works...Sometimes带有 ESP8266 的 NodeMCU 可以工作……有时
【发布时间】:2015-10-09 01:05:34
【问题描述】:

我有一个非常简单的 Web 服务器来切换继电器。它有时会起作用,有时会建立连接,但会超时。如果我重新加载页面并重试。它将再次开始工作。有什么想法吗?
代码如下:

srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive",function(conn,data)
        conn:send("HTTP/1.1 200 OK\r\n\r\n")

        path = string.find(data, "chk=on")
        print(path)
        if path == nil then
            print("off")
            gpio.write(1, gpio.LOW)
        end
        if path ~= nil then
            print("on")
            gpio.write(1, gpio.HIGH)
        end

        conn:send("<h1>Relay Control</h1>")
        conn:send("<form action='/' method='post'>")
        conn:send("<input type='checkbox' value='on' name='chk'>")
        conn:send("<input type='submit' value='Submit'>")
        conn:send("</form>")

        path = nil
        data = nil

    end)
    conn:on("sent",function(conn) conn:close() end)
end)

【问题讨论】:

    标签: http lua server esp8266 nodemcu


    【解决方案1】:

    问题是,您可能不一定会在一次调用中将整个请求传递给接收函数,它可能会为单个请求多次调用。在收到所有请求之前关闭连接会向客户端浏览器发送 RST。

    到目前为止,我能做的最好的事情是在数据的开头寻找一个有效的动词,并假设 a.) 它永远不需要超过 2 次调用来完成,并且; b.) 如果没有有效动词,则必须是第二次调用。

    可以肯定,这是一个很难编写代码的场景。

    【讨论】:

      【解决方案2】:

      您的网络浏览器实际上正在发送两个请求。

      第一个包含用于打开继电器的“chk=on”或用于关闭继电器的任何内容。

      第二个标头请求是“GET /favicon.ico HTTP/1.1”。
      您的脚本正在解析两个标头,因为在第二个标头中从未找到“chk=on”,因此中继已关闭。

      您的 TCP 服务器将这些作为单独的请求进行解析。

      示例:

      GET /chk=on HTTP/1.1 主机:192.168.11.6 连接:保持活动 缓存控制:max-age=0 接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 升级不安全请求:1 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 接受编码:gzip、deflate、sdch 接受语言:en-US,en;q=0.8,pt;q=0.6

      GET /favicon.ico HTTP/1.1 主机:192.168.11.6 连接:保持活动 Pragma:无缓存 缓存控制:无缓存 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 接受:/ 推荐人:http://192.168.11.6/on 接受编码:gzip、deflate、sdch 接受语言:en-US,en;q=0.8,pt;q=0.6

      试试:
      headertest = string.find(data, "favicon.ico")
      if(headertest) 不解析。

      而且,并非所有浏览器都要求提供网站图标.....

      【讨论】:

        猜你喜欢
        • 2017-07-14
        • 1970-01-01
        • 2021-07-25
        • 2017-01-30
        • 2019-01-18
        • 2021-05-25
        • 2017-04-05
        • 2016-09-15
        • 1970-01-01
        相关资源
        最近更新 更多