• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Передача и получение данных через интернет. Как организовать правильно?

Sany81

New member
Добрый день.
Только начинаю разбираться с этой штуковиной да и с языком Lua тоже.

Набросал небольшой код управлением светодиодными лентами + управление РГБ лентой(код в разработке):
Код:
srv=net.createServer(net.TCP)

srv:listen(1225,function(conn)
    conn:on("receive", function(client,request)
    local buf = ""
    local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
    if(method == nil)then
        _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
    end

    local _GET = {}
    if (vars ~= nil)then
        for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
            _GET[k] = v
        end
        if (_GET.stat=="all") then
            buf=""
            for i=1,  8 do
                buf=buf..i..":"..gpio.read(i)..";"
            end
            buf=buf.."11:"..gpio.read(11)..";"
            buf=buf.."12:"..gpio.read(12)..";"
        elseif (_GET.pin and _GET.stat) then
            gpio.write(_GET.pin, _GET.stat)
            buf="stat: ".._GET.pin..":".._GET.stat
            print(_GET.pin..":".._GET.stat)
        elseif _GET.CR or _GET.CG or _GET.CB then
            --gpio.write(_GET.pin, _GET.stat)
            buf="RGB: r-".._GET.CR.."; g-".._GET.CG.."; b-".._GET.CB
            print(buf)
        elseif(_GET.test == "1")then
            local ss,s,mm,hh,dd
            dd=tmr.time()
            ss=dd%60
            dd=(dd-ss)/60
            mm=dd%60
            dd=(dd-mm)/60
            hh=dd%24
            dd=(dd-hh)/24
            buf="Uptime: "..string.format("%dd %02d:%02d:%02d", dd,hh,mm,ss)
        end
    end
    client:on("sent", function(client) client:close() end)
    client:send("HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n"..buf);
    collectgarbage();
  end)
end)
Этот код это всего лишь начало проекта, но уже несколько вопросов.
1 - как эффективнее всего передавать с андройда по ВиФи команды на устройство. Через HTTP запрос/ответ получается крайне медленно, не в плане передать за раз большой объем данных в плане 100 раз маленький объем.
2 - в моем коде есть ошибка переполнения памяти. Если за несколько секунд передать с пол сотни запросов, то идет переполнение. Если передать скажем 50 запросов, подождать несколько сек то память очищается и потом можно передать вторую часть. Но меня это не устраивает. Как быть в этой ситуации?
3 - если передавать много запросов и принимать ответы. то часть запросов/ответов временно теряются. Но потом приходят в конце всех остальных запросов.
Скажем передаю сто запросов с переменной CR= от 0 до 100. При этом на устройство могут не прийти запросы с CR=20,37,45,86. После того как пройдет последний запрос с CR=99, секунды через полторы-2 приходят потерянные данные с CR=20,37,45,86. Подскажите что не так с получением данных и их отправкой.
Ведройдная часть разрабатывается на App Invertor, отправка/прием данных идет через компоненту WEB
 

Sany81

New member
Сам отвечу на свой вопрос.
1 - у меня в коде при каждом получении данных рвется соединение, при отправке данных с телефона соединение создается повторно - неверный шаг. Нужно убрать всего одну строку
Код:
client:on("sent", function(client) client:close() end)
2 - при отправке/получении данных через WEB передается куча мусора. Что бы избавиться от мусора при отправке со стороны устройства делаю так:
Было:
Код:
client:send("HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n"..buf);
Стало:
Код:
client:send(buf)
3 - самое главное - ушел от компоненты WEB на APP Inventor в сторону стороннего расширения ClientSocketAI2Ext, который позволяет передавать по TCP только нужные данные без заголовков и прочего мусора.

Таким образом обе проблемы решены. В процессе работы память устройства пожирается всего на 620 байт и работает устройство очень быстро.
 
Сверху Снизу