带有 ESP8266 的 NodeMCU 工作......有时
NodeMCU with ESP8266 works...Sometimes
我有一个非常简单的网络服务器来切换中继。它有时会工作,有时会建立连接,但会超时。如果我重新加载页面并重试。它将再次开始工作。有什么想法吗?
这是代码:
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)
问题是,您不一定会在一次调用中将整个请求传递给接收函数,它可能会为单个请求调用多次。在接收到所有请求之前关闭连接会向客户端浏览器发送一个 RST。
到目前为止我能做的最好的事情是在数据的开头寻找一个有效的动词,并假设 a.) 它永远不需要超过 2 次调用来完成,并且; b.) 如果没有有效动词,则必须是第二次调用。
可以肯定的是,这是一个很难编写代码的场景。
您的网络浏览器实际上发送了两个请求。
第一个包含您的 'chk=on' 以打开继电器或不包含任何内容以关闭继电器。
第二个 header 请求是 "GET /favicon.ico HTTP/1.1"。
您的脚本正在解析两个 header,因为在第二个 header 中从未找到 'chk=on',中继已关闭。
您的 TCP 服务器将这些解析为单独的请求。
示例:
GET /chk=on HTTP/1.1
主机:192.168.11.6
连接:keep-alive
Cache-Control: max-age=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, 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
编译指示: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
接受:/
推荐人:http://192.168.11.6/on
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,pt;q=0.6
尝试:
header测试=string.find(数据,"favicon.ico")
如果(header测试)不解析。
而且,并非所有浏览器都要求提供网站图标.....
我有一个非常简单的网络服务器来切换中继。它有时会工作,有时会建立连接,但会超时。如果我重新加载页面并重试。它将再次开始工作。有什么想法吗?
这是代码:
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)
问题是,您不一定会在一次调用中将整个请求传递给接收函数,它可能会为单个请求调用多次。在接收到所有请求之前关闭连接会向客户端浏览器发送一个 RST。
到目前为止我能做的最好的事情是在数据的开头寻找一个有效的动词,并假设 a.) 它永远不需要超过 2 次调用来完成,并且; b.) 如果没有有效动词,则必须是第二次调用。
可以肯定的是,这是一个很难编写代码的场景。
您的网络浏览器实际上发送了两个请求。
第一个包含您的 'chk=on' 以打开继电器或不包含任何内容以关闭继电器。
第二个 header 请求是 "GET /favicon.ico HTTP/1.1"。
您的脚本正在解析两个 header,因为在第二个 header 中从未找到 'chk=on',中继已关闭。
您的 TCP 服务器将这些解析为单独的请求。
示例:
GET /chk=on HTTP/1.1 主机:192.168.11.6 连接:keep-alive Cache-Control: max-age=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, 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 编译指示: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 接受:/ 推荐人:http://192.168.11.6/on Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8,pt;q=0.6
尝试:
header测试=string.find(数据,"favicon.ico")
如果(header测试)不解析。
而且,并非所有浏览器都要求提供网站图标.....