NodeMCU с ESP8266 иногда работает

У меня есть чрезвычайно простой веб-сервер для переключения реле. Иногда это будет работать, а иногда соединение устанавливается, но время ожидания истекло. Если я перезагружу страницу и повторю попытку. Он снова начнет работать. Есть идеи?
Вот код:

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)

person Kevin192291    schedule 20.07.2015    source источник


Ответы (2)


Ваш веб-браузер фактически отправляет два запроса.

Первый содержит ваш «chk = on», чтобы включить реле, или ничего, чтобы выключить ваше реле.

Второй запрос заголовка — «GET /favicon.ico HTTP/1.1».
Ваш сценарий анализирует оба заголовка, поскольку во втором заголовке не найдено «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, как 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 Прагма: без кэша Управление кэшем: без кэша Агент пользователя: Mozilla/5.0 (Windows NT 6.1; WOW64 ) AppleWebKit/537.36 (KHTML, например 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

Попробуйте:
headertest = string.find(data, "favicon.ico")
if(headertest) не анализировать.

И не все браузеры запрашивают значок .....

person Bruce    schedule 11.09.2015

Дело в том, что вы не обязательно можете передать весь запрос в функцию приема за один вызов, он может вызываться несколько раз для одного запроса. Закрытие соединения до получения всего запроса отправляет RST в клиентский браузер.

Лучшее, что мне удалось сделать до сих пор, — это найти допустимый глагол в начале данных и предположить, а.), что для завершения никогда не потребуется более двух вызовов, и; б.) если нет действительного глагола, это должен быть второй вызов.

Конечно, это сложный сценарий для кода.

person Mark McGinty    schedule 09.08.2015