• Система автоматизации с открытым исходным кодом на базе 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 байт и работает устройство очень быстро.
 
Сверху Снизу