Obsah:

Nastavte server automatickej aktualizácie ESP8266: 7 krokov
Nastavte server automatickej aktualizácie ESP8266: 7 krokov

Video: Nastavte server automatickej aktualizácie ESP8266: 7 krokov

Video: Nastavte server automatickej aktualizácie ESP8266: 7 krokov
Video: Изучите Arduino за 30 минут: примеры и проекты 2024, November
Anonim
Nastavte server automatickej aktualizácie ESP8266
Nastavte server automatickej aktualizácie ESP8266

Mnoho ľudí teraz používa ESP8266 v mnohých prevedeniach (ESP-01S, Wemos D1, NodeMCU, Sonoff atď.) Na systémy domácej automatizácie. Ak napíšete svoj vlastný kód (ako ja), aktualizácia každého z nich oddelene aj prostredníctvom OTA (vzduchom) bude trochu únavné.

Môj vlastný systém má napríklad 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV a NodeMCU, ktoré zdieľajú spoločný kódový základ, takže je celkovo 33 zariadení, ktoré je možné aktualizovať, keď vytvorím jednoduchý kód. zmeniť.

Existuje však jednoduchší spôsob: „Aktualizačný server“. Vynikajúce jadro Arduino IDE + ESP8266 má knižnicu, ktorá vám poskytne väčšinu práce (ESP8266httpUpdate), ale musíte vedieť, ako si nastaviť vlastný server, aby fungoval.

Tento návod vám ukáže, ako používať server NODE-RED, ale rovnaká logika platí pre každú serverovú technológiu podľa vášho výberu, napr. Apache + PHP atď

Krok 1: Čo potrebujete

  1. Arduino IDE
  2. Jadro ESP8266
  3. Akákoľvek doska pre vývojárov ESP8266 s 1 MB alebo viac flash RAM
  4. Webový server (aj pokorný malinový Pi to urobí - to používam)
  5. (voliteľné) nástroj mkspiffs, ak chcete automaticky aktualizovať obraz systému súborov SPIFFS

Krok 2: Vytvorte úložisko na uloženie binárnych firmvérov

Vytvorte úložisko na uloženie binárnych firmvérov
Vytvorte úložisko na uloženie binárnych firmvérov

Na svojom serveri mám priečinok s názvom/home/pi/trucFirmware, ktorý obsahuje rôzne firmvérové zariadenia a obrázky SPIFFS

Udržujem samostatný binárny súbor pre každý typ hardvéru (z jedného zdrojového súboru s niekoľkými #definíciami) a keď je pripravené nové vydanie, použijem pre každé cieľové zariadenie príkazový lístok Arduino IDE „sketch/Export compiled Binary“. aj keď existuje 5 rôznych typov hardvéru, existujú iba dva binárne súbory SPIFFS: 1M a 4M verzia - vytvorená pomocou nástroja mkspiffs - pretože všetky zariadenia majú buď 1M alebo 4M flash.

Krok 3: Vytvorte binárne súbory

Pomocou možnosti skica/Exportovať kompilované binárne súbory v ponuke Arduino IDE vytvorte firmvér, ktorý sa nahrá do zariadenia, keď o to požiada aktualizačný server.

Ak potrebujete binárny súbor SPIFFS, budete si musieť nainštalovať nástroj mkspiffs.

Akonáhle to máte, zostavenie binárneho súboru SPIFFS je jednoduché. Mám jednoriadkový dávkový súbor pre verziu 1M, ktorý ako parameter berie číslo verzie (%1)

mkspiffs -c údaje/ spiffs_%1_1M.bin

a ďalší pre verziu 4M:

mkspiffs -p 256 -b 8192 -s 0x0FB000 -c data/ spiffs_%1_4M.bin

Potom skopírujem všetky skompilované binárne súbory a binárne súbory SPIFFS do úložiska

Krok 4: Vytvorte tok servera

Vytvorte tok serverov
Vytvorte tok serverov

Používam NODE-RED, ale jednoduchá logika bude rovnaká pre každú serverovú technológiu / jazyk.

a) Definujte adresu URL, ktorá bude počúvať žiadosť ESP8266httpUpdate. Môj server raspberryPi serevr je na 192.168.1.4 a počúva na porte 1880 /aktualizuje s pripojeným typom hardvéru. Ak teda budem požadovať binárku pre Wemos D1 Mini, adresa URL skončí takto:

192.168.1.4:1880/update/d1_mini

b) Vytvorte kód na zvládnutie nasledujúcej logiky:

ESP8266: „Ahoj, používam verziu firmvéru a.b.c., máš novšiu verziu?" Server: "Uvidím … ah áno, mám a.b.d - je to tu …"

Ak existuje novšia verzia, server ju pošle ako načítanie binárnych údajov v odpovedi http. Trieda ESP8266httpUpdate robí náročnú časť kopírovania binárnej pamäte do pamäte, pričom mení štartovaciu adresu firmvéru na nový kód, než (ak je to potrebné) reštartuje zariadenie, aby spustilo nový kód.

Ak na druhej strane neexistuje vyššia verzia, odpovie chybou http 304, ktorá v skutočnosti hovorí: „Nemám pre teba nič“a váš kód pokračuje v normálnom spustení.

Krok 5: Pridajte logiku servera

Prvý uzol v toku „počúva“požiadavku http na adresu URL https://192.168.1.4:1880/update s pripojeným typom zariadenia. Odovzdá to funkčnému uzlu „Vytvoriť vyhľadávaciu cestu“, ktorý má nasledujúci kód JavaScript:

msg.type = msg.req.params.type; var h = msg.req.headers; msg.version = h ["x-esp8266-verzia"];

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

if (msg.mode == "sketch") {msg.payload = "/home/pi/trucFirmware/*. ino."+msg.type+". bin"; } else {var sz = h ['x-esp8266-chip-size']; msg.payload = "/home/pi/trucFirmware/spiffs _*_"+(sz/1048576)+"M.bin"; } vrátiť správu;

Týmto sa nastaví príslušná cesta so zástupnými znakmi pre nasledujúcu funkciu sys, ktorá sa jednoducho spustí

ls - r

Výstup je potom vedený do funkčného uzla „Porovnať verzie“:

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

if (msg.mode == "skica") {

f = f.replace ("/home/pi/trucFirmware/truc_", ""); f = f.náhrada (". ino."+typ správy+". bin", ""); } else {f = f.replace ("/home/pi/trucFirmware/spiffs_", ""); f = f.náhrada (/_ / dM \.bin/, ""); }

if (msg.version <f) {

node.warn („je potrebná aktualizácia“);

node.warn ("vráti"+msg.filename); vrátiť správu; } node.warn („žiadna aktualizácia“); msg.statusCode = 304; msg.payload = ;

vrátiť správu;

Prepínací uzol potom zaistí, aby sa buď odoslala správa 304 „nie je potrebná žiadna aktualizácia“, alebo aby bol vrátený a odoslaný späť do zariadenia skutočný nový binárny súbor.

Krok 6: Pridajte kód do náčrtu a požiadajte o aktualizáciu

Skica musí mať zahrnutý nasledujúci kód, aby sa automaticky aktualizoval pri ďalšom zvýšení čísla verzie:

#zahrnúť

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// TOTO_ZARIADENIE je nastavené skôr v závislosti od rôznych definícií času kompilácie //, ktoré nakoniec definujú typ hw, napr. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // toto je môj server Raspberry Pi, 1880 je predvolený NODE-RED port // /aktualizácia je adresa URL, ktorú som vybral na „počúvanie“servera, za ktorou nasleduje typ zariadenia… bool actualUpdate (bool sketch = false) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (false); if (skica) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // ***************** Toto je riadok, ktorý „robí biznis“} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf ("UPDATE SUCCEEDED");

návrat true; } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf („Inovácia zlyhala“);

}}} return false; }

Krok 7: Nakoniec spustite aktualizáciu

Pri štarte systému alebo možno ako odpoveď na správu MQTT (ako ja) spustite nasledujúci kód:

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

// alebo pre SPIFFS …

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

Zariadenie sa samo aktualizuje a reštartuje pomocou najnovšieho kódu zo servera. Je to pre mňa oveľa jednoduchšie ako manuálna aktualizácia 33 zariadení!

Mnoho ďalších užitočných informácií o domácej automatizácii, IOT a programovaní ESP8266 nájdete na mojom blogu

Odporúča: