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 Accept: 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 Връзка: поддържане Pragma: без кеш Cache-Control: без кеш Потребителски агент: 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) не анализирайте.

И не всички браузъри изискват favicon.....

person Bruce    schedule 11.09.2015

Работата е там, че не е задължително цялата заявка да бъде предадена на функцията за получаване в едно повикване, тя може да бъде извикана няколко пъти за една заявка. Затварянето на връзката преди получаване на цялата заявка изпраща RST до браузъра на клиента.

Най-доброто, което успях да направя досега, е да потърся валиден глагол в началото на данните и да приемем a.), че никога няма да има нужда от повече от 2 извиквания за завършване и; б.) ако няма валиден глагол, трябва да е второто извикване.

Това е труден сценарий за кодиране, разбира се.

person Mark McGinty    schedule 09.08.2015