Сервер NodeMCU не отвечает

Использование NodeMCU в качестве точки доступа Wi-Fi. Точка доступа работает, и я могу подключиться к ней, и когда я захожу на 192.168.4.1, print(payload) мой запрос выводится на консоль, так что все работает, но Safari на iOS жалуется, что сервер перестал отвечать.

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

person Johnathan Barrett    schedule 01.01.2017    source источник
comment
Не уверен, что это имеет какое-либо значение, но во втором обратном вызове параметр сокета не должен называться conn, так как это накладывается на conn первого обратного вызова. Сделайте что-то вроде function(sck,payload) sck:send().   -  person Marcel Stör    schedule 02.01.2017
comment
Из любопытства я напечатал [адрес] параметра соединения на каждом уровне вложенности, т. е. print(conn) conn:on(sent, function(sck) print(sck) sck:close() end)end). Адрес объекта, переданного как conn, был таким же, как и sck. Единственный объект, у которого был другой адрес, был передан в обратный вызов отключения, они не соответствовали ни одному из значений, используемых где-либо еще в коде.   -  person Mark McGinty    schedule 18.04.2017


Ответы (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)
person jankop    schedule 02.01.2017
comment
Хотя, скорее всего, это правильный ответ (из нашего GitHub start страницу) это не очень хороший ответ, потому что он не объясняет, что было не так или почему исходный код не работает. - person Marcel Stör; 02.01.2017
comment
Спасибо, это работает, я проголосовал за ответ, если бы вы могли добавить краткое объяснение того, почему/что я делал неправильно, я могу принять это как ответ. Это просто заголовок, который мне не хватало? - person Johnathan Barrett; 02.01.2017
comment
Вы не возвращали действительный ответ в соответствии с протоколом HTTP. Еще одно замечание: если вам когда-нибудь понадобится, чтобы ответ был больше, чем один сетевой фрейм, включите в ответ заголовок Connection: close. Подсчет байтов для заголовка Content-length часто нецелесообразен. Connection: close сообщает запрашивающему хосту, что ответ сервера завершен, когда он закрывает соединение. - person Mark McGinty; 17.04.2017