ESP8266 - маленькое устройство для DIY.
В этой статье мы разберем, как можно красиво прошивать устройство на лету, в те моменты когда оно не подключено физически к ПК. Да да, через WiFi. Таким образом мы можем изменять и дополнять функционал тех девайсов, которые уже находятся в работе.
Создавать свой способ перепрошивки мы будем на основе популярной прошивки NodeMCU, поэтому я подразумеваю что у вас есть уже готовый девайс, подключенный к ПК через UART. Разбирать, где скачать NodeMCU и как перепрошивать - я не буду, мануалов в сети масса. Перейдем к самой сути.
Основная идея прошивки на лету - возможность NodeMCU вставлять и исполнять файлы .lua на лету. Это означает что мы можем создать один статический файл (пусть это будет init.lua), в который можем вставлять другой файл (например test.lua), который в свою очередь будет динамическим и содержать нашу "прошивку".
Много ерунды писать не буду, а сразу приведу полный скрипт.
wifi.setmode(wifi.STATION) wifi.sta.config("wp_h","") print("IP") print(wifi.sta.getip()) -- 1 srv=net.createServer(net.TCP)srv:listen(80,function(conn) conn:on("receive", function(client,request) -- 2 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 -- 3 if vars=="fwstart" thenfile.open("test.lua", "w+") end
-- 4 if vars=="fwend" thenfile.flush() file.close() end
-- 5 if method=="POST" and vars=="fw" thenr = request _,_,DataToGet, request = string.find(request, "Content%-Length: (%d+)(.+)") 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 -- 6 client:send(buf); client:close();collectgarbage(); end) end) dofile("test.lua") |
-- 1:
Создаем веб-сервер. Все как обычно.
-- 2:
Все GET запросы передаем в переменную vars
-- 3:
Если в GET запросе получаем строку "fwstart", то открываем файл test.lua на запись. Файл пересоздается.
-- 4:
Если в GET запросе получаем строку "fwend", то сбрасываем буферы, и закрываем файл test.lua
-- 5:
Если получаем POST запрос, и при этом в GET запросе есть строка "fw", то считываем то что пришло в POST-запросе, и пишем в файл test.lua
-- 6:
Конец веб-сервера. И запускаем файл test.lua
Это все.
Теперь как этим пользоваться, в картинках.
Интерфейс ESPlorer. Еще ничего не прошито, ESP8266 - девственно чиста
Теперь прошито. Файл test.lua не найден. Ведь мы еще ничего не создавали.
Теперь открываем линуксовую консоль (проще всего делать там, главное поймите принцип)
Собственно процесс прошивки таков:
curl 'http://192.168.88.223?fwstart'
curl --data 'print("This is a test!!")' http://192.168.88.223?fw
curl --data 'print("Hello, daemons")' http://192.168.88.223?fw
curl --data 'print("End of program")' http://192.168.88.223?fw
curl 'http://192.168.88.223?fwend'
После перезапуска ESP8266, видим что прошивка подхватилась, и вывела в консоль наши три предложения
Собственно на этом все, далее можно модернизировать программу по своему усмотрению.