Съдържание:

Настройте сървър за автоматично актуализиране на ESP8266: 7 стъпки
Настройте сървър за автоматично актуализиране на ESP8266: 7 стъпки

Видео: Настройте сървър за автоматично актуализиране на ESP8266: 7 стъпки

Видео: Настройте сървър за автоматично актуализиране на ESP8266: 7 стъпки
Видео: Home Assistant - first settings, File Editor, Maria DB, HACS - October 2023 2024, Ноември
Anonim
Настройте сървър за автоматично актуализиране на ESP8266
Настройте сървър за автоматично актуализиране на ESP8266

Сега много хора използват ESP8266 в многобройните му облика (ESP-01S, Wemos D1, NodeMCU, Sonoff и др.) За системи за домашна автоматизация. Ако напишете свой собствен код (както правя аз), актуализирането на всеки от тях поотделно дори чрез OTA (по въздуха) става малко досадно.

Моята собствена система например има 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV и NodeMCU, които споделят обща кодова база, така че това са общо 33 устройства за актуализиране, когато направя прост код промяна.

Но има по -лесен начин: „Сървър за актуализация“. Отличното ядро на Arduino IDE + ESP8266 има библиотека, която да свърши по -голямата част от работата (ESP8266httpUpdate), но трябва да знаете как да настроите свой собствен сървър, за да работи.

Тази инструкция ви показва как се използва NODE-RED сървър, но същата логика се прилага за всяка сървърна технология по ваш избор, напр. Apache + PHP и др

Стъпка 1: Какво ви трябва

  1. Arduino IDE
  2. ESP8266 ядро
  3. Всяка платка за разработка на ESP8266 с 1M или повече флаш RAM
  4. Уеб сървър (дори скромният малинов Pi ще свърши работа - това е, което използвам)
  5. (по избор) инструмент mkspiffs, ако искате да актуализирате автоматично изображение на файлова система SPIFFS

Стъпка 2: Създайте хранилище за съхранение на двоични фърмуери

Създайте хранилище за съхранение на двоични фърмуери
Създайте хранилище за съхранение на двоични фърмуери

На моя сървър имам папка, наречена/home/pi/trucFirmware, която съхранява различните фърмуери на устройства и SPIFFS изображения

Поддържам отделен двоичен файл за всеки тип хардуер (от един изходен файл с няколко #дефиниции) и когато нова версия е готова, използвам командата от менюто за скица/експортиране на компилирана двоична информация на Arduino за всяко целево устройство. Обърнете внимание, че дори въпреки че има 5 различни типа хардуер, има само две SPIFFS двоични файлове: 1M и 4M версия - конструирана с инструмента mkspiffs - тъй като всички устройства имат 1M или 4M флаш.

Стъпка 3: Създайте двоични файлове

Използвайки скицата на менюто на Arduino IDE/Експортиране на компилиран двоичен файл, създайте фърмуера, който ще бъде качен на устройството, когато го поиска от сървъра за актуализация.

Ако имате нужда от двоичен файл SPIFFS, ще трябва да инсталирате инструмента mkspiffs.

След като го имате, изграждането на двоичен файл SPIFFS е лесно. Имам едноредов партиден файл за 1M версията, който приема номера на версията като параметър (%1)

mkspiffs -c данни/ spiffs_%1_1M.bin

и още една за 4M версията:

mkspiffs -p 256 -b 8192 -s 0x0FB000 -c данни/ spiffs_%1_4M.bin

След това копирам всички компилирани двоични файлове и SPIFFS.binary файлове в хранилището

Стъпка 4: Създайте потока на сървъра

Създайте сървърния поток
Създайте сървърния поток

Използвам NODE-RED, но простата логика ще бъде същата на всяка сървърна технология / език.

а) Определете URL адрес, който да слуша заявката ESP8266httpUpdate. Моят raspberryPi serevr е на 192.168.1.4 и слуша на порт 1880 за /актуализация с добавен тип хардуер. Така че, ако ще поискам двоичен файл за Wemos D1 Mini, URL адресът завършва като:

192.168.1.4:1880/update/d1_mini

б) Създайте код за обработка на следната логика:

ESP8266: „Здравейте, използвам версия на фърмуера a.b.c, имате ли по -нова версия?“Сървър: „Нека да видя … ах да, имам a.b.d - ето го …“

Ако съществува по -нова версия, сървърът просто я изпраща като товар от двоични данни в http отговора. Класът ESP8266httpUpdate изпълнява трудната част от копирането на двоичния файл в паметта, променяйки адреса за зареждане на фърмуера в новия код, отколкото (ако се изисква) рестартиране на устройството, за да стартира новия код.

Ако от друга страна няма по -висока версия, тя отговаря с грешка http 304, която ефективно казва: „Нямам нищо за вас“и кодът ви продължава да работи нормално.

Стъпка 5: Добавете логиката на сървъра

Първият възел в потока „слуша“за http заявка за URL адрес https://192.168.1.4:1880/update с добавен тип устройство. Той предава това на функционален възел "Конструиране на път за търсене", който има следния код на javascript:

msg.type = msg.req.params.type; var h = msg.req.headers; msg.version = h ["x-esp8266-версия"];

msg.mode = h ["x-esp8266-mode"];

if (msg.mode == "скица") {msg.payload = "/home/pi/trucFirmware/*. ino."+msg.type+". bin"; } else {var sz = h ['x-esp8266-size-chip']; msg.payload = "/home/pi/trucFirmware/spiffs _*_"+(sz/1048576)+"M.bin"; } return msg;

Това просто задава подходящия път с заместващ знак за функцията sys, която следва, която просто се изпълнява

ls - r

След това изходът се подава към функционалния възел "Сравняване на версии":

var f = msg.payload.split ("\ n") [0]; msg.filename = f;

if (msg.mode == "скица") {

f = f.replace ("/home/pi/trucFirmware/truc_", ""); f = f.replace (". ino."+msg.type+". bin", "")); } else {f = f.replace ("/home/pi/trucFirmware/spiffs_", ""); f = f.replace (/_ / dM \.bin/, ""); }

if (msg.version <f) {

node.warn ("необходимо надстройване");

node.warn ("ще върне"+msg.filename); връщане на съобщение; } node.warn ("без надстройка"); msg.statusCode = 304; msg.payload = ;

връщане на съобщение;

След това комутационният възел гарантира, че или 304 съобщението "не е необходима актуализация" е изпратено, или действителният нов двоичен файл е върнат и изпратен обратно на устройството.

Стъпка 6: Добавете код към скицата, за да поискате актуализация

Скицата трябва да съдържа следния код, така че да се актуализира автоматично следващия път, когато увеличите номера на версията:

#включва

#дефинирайте TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE се задава по-рано в зависимост от различни дефиниции по време на компилация // които в крайна сметка определят типа hw, напр. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // това е моят малинов Pi сървър, 1880 е NODE-RED портът по подразбиране // /update е URL адресът, който избрах за сървъра да "слуша", последван от типа на устройството … bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (невярно); if (скица) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Това е редът, който „прави бизнеса“} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

връщане true; } иначе {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf ("Неуспешно надстройване");

}}} return false; }

Стъпка 7: Накрая стартирайте актуализацията

По време на зареждане или може би в отговор на съобщение MQTT (както правя аз) изпълнете следния код:

if (_actualUpdate (true)) ESP.restart ();

// или за SPIFFS …

if (_actualUpdate (false)) ESP.restart ();

Устройството ще се актуализира и ще рестартира най -новия код от сървъра. За мен е много по -просто, отколкото ръчно актуализиране на 33 устройства!

Много повече полезна информация за домашната автоматизация, IOT и програмирането на ESP8266 можете да намерите в Моят блог

Препоръчано: