Cuprins:

Configurați un server de actualizare automată ESP8266: 7 pași
Configurați un server de actualizare automată ESP8266: 7 pași

Video: Configurați un server de actualizare automată ESP8266: 7 pași

Video: Configurați un server de actualizare automată ESP8266: 7 pași
Video: ESP8266 07 2024, Noiembrie
Anonim
Configurați un server de actualizare automată ESP8266
Configurați un server de actualizare automată ESP8266

Mulți oameni folosesc acum ESP8266 în numeroasele sale variante (ESP-01S, Wemos D1, NodeMCU, Sonoff etc.) pentru sisteme de automatizare a casei. Dacă scrieți propriul cod (așa cum fac eu), actualizarea fiecăruia dintre acestea separat chiar și prin OTA (prin antenă) devine puțin plictisitoare.

Sistemul meu, de exemplu, are 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV și un NodeMCU care partajează o bază de cod comună, deci sunt 33 de dispozitive în total pentru actualizare când fac un cod simplu Schimbare.

Dar există o modalitate mai ușoară: un „server de actualizare”. Excelentul nucleu Arduino IDE + ESP8266 are o bibliotecă pentru a face cea mai mare parte a lucrului (ESP8266httpUpdate), dar trebuie să știți cum să vă configurați propriul server pentru ca acesta să funcționeze.

Acest instructable vă arată cum se utilizează un server NODE-RED, dar aceeași logică se aplică oricărei tehnologii de server la alegere, de ex. Apache + PHP etc.

Pasul 1: De ce aveți nevoie

  1. IDE Arduino
  2. Miez ESP8266
  3. Orice placă dev ESP8266 cu RAM de 1M sau mai mult
  4. Un server Web (chiar și un umil zmeură Pi va face - este ceea ce folosesc eu)
  5. (opțional) instrument mkspiffs dacă doriți să actualizați automat o imagine a sistemului de fișiere SPIFFS

Pasul 2: Creați un depozit pentru a păstra firmware-uri binare

Creați un depozit pentru a păstra firmware-uri binare
Creați un depozit pentru a păstra firmware-uri binare

Pe serverul meu, am un folder numit / home / pi / trucFirmware care conține diferitele firmware-uri ale dispozitivelor și imaginile SPIFFS

Păstrez un binar separat pentru fiecare tip de hardware (dintr-un singur fișier sursă cu câteva # definiții) și când este pregătită o nouă versiune, folosesc comanda de meniu Arduino IDE „schiță / Export binar compilat” pentru fiecare dispozitiv țintă. deși există 5 tipuri diferite de hardware, există doar două binare SPIFFS: o versiune 1M și o versiune 4M - construită cu instrumentul mkspiffs - deoarece toate dispozitivele au 1M sau 4M bliț.

Pasul 3: Creați binare

Folosind opțiunea de meniu Arduino IDE schiță / Export binar compilat, creați firmware-ul care va fi încărcat pe dispozitiv atunci când îl solicită de la serverul de actualizare.

Dacă aveți nevoie de un binar SPIFFS, va trebui să instalați instrumentul mkspiffs.

Odată ce îl ai, construirea binarului SPIFFS este simplă. Am un fișier batch de o linie pentru versiunea 1M, care ia numărul versiunii ca parametru (% 1)

mkspiffs -c data / spiffs_% 1_1M.bin

și altul pentru versiunea 4M:

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

Copiez apoi toate binarele compilate și fișierele SPIFFS.binary în depozit

Pasul 4: Creați fluxul de server

Creați fluxul de server
Creați fluxul de server

Folosesc NODE-RED, dar logica simplă va fi aceeași pe orice tehnologie / limbaj de server.

a) Definiți o adresă URL care va asculta cererea ESP8266httpUpdate. Seravr-ul meu raspberryPi este pe 192.168.1.4 și ascultă pe portul 1880 pentru / actualizare cu tipul de hardware anexat. Deci, dacă voi solicita un binar pentru un Wemos D1 Mini, adresa URL se termină astfel:

192.168.1.4:1880/update/d1_mini

b) Creați cod pentru a gestiona următoarea logică:

ESP8266: "Bună, rulez versiunea firmware a.b.c, aveți o versiune mai nouă?" Server: "Lasă-mă să văd … ah da, am a.b.d - aici vine …"

Dacă există o versiune mai nouă, serverul o trimite doar ca o încărcare de date binare în răspunsul http. Clasa ESP8266httpUpdate face partea dificilă a copierii binarului în memorie, schimbând adresa de încărcare a firmware-ului în noul cod decât (dacă se solicită) repornirea dispozitivului pentru a rula noul cod.

Dacă, pe de altă parte, nu există o versiune superioară, aceasta răspunde cu o eroare http 304 care spune efectiv: „Nu am nimic pentru tine” și codul tău continuă să ruleze normal.

Pasul 5: Adăugați logica serverului

Primul nod din flux „ascultă” o solicitare http de a adresa URL https://192.168.1.4:1880/update cu tipul de dispozitiv adăugat. Trece acest lucru la nodul funcției „Construct căi de căutare” care are următorul cod javascript:

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

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

if (msg.mode == "schiță") {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"; } returnează msg;

Aceasta doar configurează calea corespunzătoare cu metacaracter pentru funcția sys care urmează, care pur și simplu rulează

ls - r

Ieșirea este apoi alimentată la nodul funcției „Compară versiunile”:

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

if (msg.mode == "schiță") {

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 ("este necesar upgrade");

node.warn ("va reveni" + msg.filename); returnează msg; } node.warn ("fără upgrade"); msg.statusCode = 304; msg.payload = ;

returnează msg;

Nodul de comutare asigură apoi că fie mesajul 304 „nu este nevoie de actualizare”, fie noul binar real este returnat și trimis înapoi la dispozitiv.

Pasul 6: Adăugați cod în schiță pentru a solicita o actualizare

Schița trebuie să conțină următorul cod, astfel încât să se actualizeze automat la următoarea creștere a numărului de versiune:

#include

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE este setat mai devreme în funcție de diferitele timpuri de compilare definite // care definesc în cele din urmă tipul hw, de ex. #define THIS_DEVICE "d1_mini" const char * updateUrl = "https://192.168.1.4:1880/update/" THIS_DEVICE; // acesta este serverul meu raspberry Pi, 1880 este portul implicit NODE-RED // / update este adresa URL pe care am ales-o pentru server pentru „ascultare”, urmată de tipul dispozitivului … bool actualizare actualizată (schiță bool = falsă) {String msg; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate (fals); if (schiță) {ret = ESPhttpUpdate.update (updateUrl, TRUC_VERSION); // **************** Aceasta este linia care „face afacerea”} else {ret = ESPhttpUpdate.updateSpiffs (updateUrl, SPIFFS_VERSION); } if (ret! = HTTP_UPDATE_NO_UPDATES) {if (ret == HTTP_UPDATE_OK) {

Serial.printf („ACTUALIZARE REZULTATĂ”);

întoarcere adevărată; } else {if (ret == HTTP_UPDATE_FAILED) {

Serial.printf („Upgrade eșuat”);

}}} returnează fals; }

Pasul 7: În cele din urmă, inițiați actualizarea

La boot, sau poate ca răspuns la un mesaj MQTT (așa cum fac eu), rulați următorul cod:

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

// sau pentru SPIFFS …

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

Dispozitivul se va actualiza singur și va reporni rulând cel mai recent cod de pe server. Este mult mai simplu pentru mine decât actualizarea manuală a 33 de dispozitive!

Mai multe informații utile despre Home Automation, IOT și programarea ESP8266 pot fi găsite pe Blogul meu

Recomandat: