2015-07-20 82 views
0

我有一个非常简单的Web服务器来切换中继。它有时会起作用,而其他时候会建立连接,但超时。如果我重新加载页面并重试。它会再次开始工作。有任何想法吗?
下面是代码:带有ESP8266的NodeMCU工作...有时

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

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

第一个包含您的'chk = on'打开继电器或没有任何东西关闭您的继电器。

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

您的TCP服务器将它们解析为单个请求。

实施例:

GET/CHK =上HTTP/1.1 主机:192.168.11.6 连接:保活 缓存控制:最大年龄= 0 接受: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,和Gecko一样)Chrome/45.0.2454.85 Safari/537.36 Accept-Encoding:gzip,放气,SDCH 接受语言:EN-US,EN; Q = 0.8,PT; Q = 0.6

GET /favicon.ico HTTP/1.1 主持人:192.168.11.6 连接:保持活跃 Pragma:no-cache Cache-Control:no-cache User-Agent:Mozilla/5.0(Windows NT 6.1; WOW64)为AppleWebKit/537.36(KHTML,例如Gecko)Chrome浏览器/ Safari浏览器45.0.2454.85/537.36 接受:/ 的Referer:http://192.168.11.6/on 接受编码:gzip,紧缩,SDCH 接受语言:EN-US,EN; q = 0.8,PT; q = 0.6

尝试:
headertest = string.find(数据 “的favicon.ico”)
如果(headertest)不解析。

而且,并非所有的浏览器都会要求提供favicon .....

1

它的事情是,你不一定得传递给接收功能于一体的呼叫整个请求,就可以得到多次调用单个请求。在收到所有请求之前关闭连接会向客户端浏览器发送RST。

迄今为止我所能做的最好的事情是在数据的开头寻找一个有效的动词,并假设a)它永远不会需要超过2次的调用才能完成, b。)如果没有有效的动词,它必须是第二个电话。

确实,这是一种难以编码的情况。