2017-01-01 158 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會在請求主機關閉連接時告訴請求主機服務器的響應已完成。 –