Добрый день. Делаю каркас умного дома (температура, влажность, давление, управление розетками и прочее + 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. Через веб-форму
Записывается: [inline]text=print%28%22Test%22%29[/inline] (добавляется имя поля textarea и кавычки со скобками преобразуются в символы)
Как решить данную задачу, не ковыряя вручную посылку посимвольно?
Может возможно передавать бинарный скомпилированный файл *.lc? Как его тогда записать в память?
Часть кода, ответственная за сохранение сценария:
Устройства будут распиханы по-углам/подрозетникам и прочим тайным местам, и не хочется доставать их для перепрошивки (если таковая когда-нибудь понадобится).
Вот озадачился прошивкой 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>
Как решить данную задачу, не ковыряя вручную посылку посимвольно?
Может возможно передавать бинарный скомпилированный файл *.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
Последнее редактирование: