NodeMCU与ESP8266一起工作...有时会出现问题。

我有一个非常简单的网络服务器来控制一个继电器。有时它能工作,有时连接建立了但超时了。如果我重新加载页面并再试一次,它就会重新开始工作。有什么想法吗?

以下是代码:

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)
点赞
用户1241224
用户1241224
事情是这样的,可能不会在一个调用中将整个请求传递给接收函数,一个请求可能会被调用多次。在接收到所有请求之前关闭连接会向客户端浏览器发送 RST。

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

毫无疑问,这是一个难以编写的场景。
2015-08-09 13:34:48
用户5325591
用户5325591

你的网络浏览器实际上发送了两个请求。

第一个包含你的 'chk= on'来打开继电器,或一无所获关闭你的继电器。

第二个头文件请求是"GET /favicon.ico HTTP/1.1"。

你的脚本解析了两个头文件,因为第二个头文件中找不到'chk= on',所以继电器被关闭。

你的 TCP 服务器将它们解析为单独的请求。

示例:

GET /chk= on HTTP/1.1 Host: 192.168.11.6 Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp, /;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8,pt;q=0.6

GET /favicon.ico HTTP/1.1 Host: 192.168.11.6 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 Accept: / Referer: http://192.168.11.6/on Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8,pt;q=0.6

尝试:

headertest = string.find(data, "favicon.ico")

if(headertest) 不解析。

而且,并不是所有的浏览器都请求网站图标.....

2015-09-11 13:35:37