0

我有一个非常简单的 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)
4

2 回答 2

4

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

第一个包含你的'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 主机:192.168.11.6 连接:keep-alive 编译指示:无缓存 缓存控制:无缓存 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,像壁虎)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-11T13:35:37.277 回答
1

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

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

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

于 2015-08-09T13:34:48.263 回答