2017-01-01 90 views
1

使用NodeMCU充当wifi接入点。接入点正在工作,我可以连接到它,并且当我访问192.168.4.1,print(payload)时,我的请求被打印到控制台,以便所有工作正常,但iOS上的Safari抱怨服务器已停止响应。NodeMCU服务器没有响应

function initialConnection() 
    wifi.setmode(wifi.SOFTAP) 

    -- Setup as Access Point 
    print(wifi.ap.config({ 
     ssid = "SSIDNAME", 
     pwd = "SSIDPASSWORD", 
     auth = wifi.OPEN 
    })) 

    server = net.createServer(net.TCP, 30) 

    if server then 
    server:listen(80, function(conn) 
     conn:on("receive",function(conn,payload) 
     print(payload) 
     conn:send("<h1> Hello, NodeMCU!!! </h1>") 
     end) 
    end) 
    end 

    -- statusLed:flashBlue(100) 
end 

这是被打印到控制台

GET /?gddf HTTP/1.1 
Host: 192.168.4.1 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Upgrade-Insecure-Requests: 1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1 
Accept-Language: en-us 
DNT: 1 
Cache-Control: max-age=0 
+1

不知道这有什么差别,但是在第二个回调插座参数不该”因为这个“覆盖”了第一个回调函数的'conn',所以被称为'conn'。让它像'function(sck,payload)sck:send()'一样。 –

+0

出于好奇,我在每一层嵌套上印刷了[连接参数的地址],即print(conn)conn:on(“sent”,function(sck)print(sck)sck:close()end)end )。作为conn传递的对象的地址与sck相同。具有不同地址的唯一对象是传递给断开连接回调的对象,它们不匹配代码中任何其他地方使用的任何值。 –

回答

1

测试此请求:

srv = net.createServer(net.TCP) 
srv:listen(80, function(conn) 
conn:on("receive", function(sck, payload) 
    print(payload) 
    sck:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>Hello, NodeMCU.</h1>") 
end) 
conn:on("sent", function(sck) sck:close() end)end) 
+1

尽管它可能是正确的答案(从我们的[GitHub开始页面](https://github.com/nodemcu/nodemcu-firmware/blob/master/README.md#programming-model)),但这不是一个好的答案,因为它不能解释_什么是错的或_why_原始代码不起作用。 –

+0

它确实工作谢谢,我已经投了答案,如果你可以添加一个简短的解释为什么/我在做什么错我可以接受它作为答案。它只是我失踪的标题? –

+0

根据HTTP协议,您没有返回有效的响应。还有一点需要注意的是,如果您需要的响应大于单个网络帧,请在响应中包含Connection:close标头。计算Content-length头部的字节通常不切实际,Connection:close会在请求主机关闭连接时告诉请求主机服务器的响应已完成。 –