• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Передача пользовательских сценариев по WiFi

Apik

New member
Добрый день. Делаю каркас умного дома (температура, влажность, давление, управление розетками и прочее + MajorDoMo)

Устройства будут распиханы по-углам/подрозетникам и прочим тайным местам, и не хочется доставать их для перепрошивки (если таковая когда-нибудь понадобится).

Вот озадачился прошивкой ESP8266 по WiFi. Т.е. не глобальную прошивку менять, а именно пользовательские сценарии (благо NodeMCU умеет работать с файловой системой).

Файл "init.lua" будет отвечать только за подъем и прослушку сервера. В конце него погружается файл "main.lua", и уже из него будет опрос-управление.

Сценарий будет заливаться через форму POST-запросом.
Если POST-запрос имеет вид: http://192.168.1.10/?update=main, то открываем (либо при его отсутствии создаем) файл main.lua
Если POST-запрос имеет вид: http://192.168.1.10/?remove=main, то удаляем файл main.lua
Ну и так далее. Можем дистанционно создавать/редактировать/удалять сценарии.

Сама передача текста в POST-запросе идет прекрасно, и запись в файл тоже. Но есть одно НО - коверканье спецсимволов.

Запросы делал разными способами:
1. Утилитой CURL.
POST запрос имеет вид: [inline]--data print("Test") http://192.168.1.10/?update=main[/inline]
Записывается: [inline]print(Test)[/inline] (т.е. кавычки уходят)
POST запрос имеет вид: [inline]--data 'print("Test")' http://192.168.1.10/?update=main[/inline]
Записывается: [inline]'print(Test)'[/inline] (одинарные кавычки остаются, двойные уходят)
2. Через веб-форму
HTML:
<form name="form1" method="post" action="http://192.168.1.10/?update=main">
Введите текст:<br />
<textarea name="text" cols="80" rows="10"></textarea>
<input name="" type="submit" value="Отправить"/>
</form>
Записывается: [inline]text=print%28%22Test%22%29[/inline] (добавляется имя поля textarea и кавычки со скобками преобразуются в символы)

Как решить данную задачу, не ковыряя вручную посылку посимвольно?
Может возможно передавать бинарный скомпилированный файл *.lc? Как его тогда записать в память?

Часть кода, ответственная за сохранение сценария:
Код:
--[[ при запросе "http://192.168.1.7/?val1=0&val2=1&update=main"получаем:
             key == val1; val == 0
             key == val2; val == 1
             key == update; val == main --]]
        for key, val in pairs(table_value) do
            print("key == "..key.."; val == "..val)
        end

        --[[ Таблицу значений заполнили.
             Теперь смотрим, есть ли ключ на обновлениЕ файла ?update=XXXX ]]
        for key, val in pairs(table_value) do
            if key == "update" then
                local file_update = val..".lua" -- создаем переменную с именем файла
                print("Обновление файла ", file_update)
                file.open(file_update, "w+") -- Открываем файл для записи
           
                if method=="POST" then
                    r = data
                    _,_,DataToGet, data = string.find(data, "Content%-Length: (%d+)(.+)")
                    print(DataToGet)
                    print(data)
                   
                    if DataToGet ~= nil then
                        l = string.len(r)
                        DataToGet = tonumber(DataToGet)
                        start = l-DataToGet
                        payload = string.sub(r, start , l)
                        file.writeline(payload)
                    end
                end
                file.flush()
                file.close()
            end
        end
 
Последнее редактирование:
Сверху Снизу