2015-07-20 40 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。)如果沒有有效的動詞,它必須是第二個電話。

確實,這是一種難以編碼的情況。

相關問題