ESP8266 прошивка по WiFi

Умный дом  /  Сделай сам  /  Печатные платы  /  ESP8266  




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" then
   file.open("test.lua", "w+")
                       end


-- 4

   if vars=="fwend" then
   file.flush()
   file.close()
                    end

    

-- 5                  

   if method=="POST" and vars=="fw" then
   r = 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, видим что прошивка подхватилась, и вывела в консоль наши три предложения



Собственно на этом все, далее можно модернизировать программу по своему усмотрению.




Метки текста: прошивка esp8266, nodemcu post request, nodemcu web-server, esp8266 удаленная прошивка


http://minidevices.info/images/ava.png
http://minidevices.info/images/ava.png
2016-07-29 00:35
root 29 июля в 00:35  0 

1126
2016-07-29 00:35


Комментировать



Опубликовать запись