• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
 
Последнее редактирование:
Сверху Снизу