Sommario:

Configurare un server di aggiornamento automatico ESP8266: 7 passaggi
Configurare un server di aggiornamento automatico ESP8266: 7 passaggi

Video: Configurare un server di aggiornamento automatico ESP8266: 7 passaggi

Video: Configurare un server di aggiornamento automatico ESP8266: 7 passaggi
Video: ESP-01S : Programmare ESP8266 con Arduino IDE (primi passi) 2024, Luglio
Anonim
Configurare un server di aggiornamento automatico ESP8266
Configurare un server di aggiornamento automatico ESP8266

Molte persone ora utilizzano ESP8266 nelle sue numerose forme (ESP-01S, Wemos D1, NodeMCU, Sonoff ecc.) Per i sistemi di automazione domestica. Se scrivi il tuo codice (come faccio io) aggiornare ciascuno di questi separatamente anche tramite OTA (over the air) diventa un po' noioso.

Il mio sistema, ad esempio, ha 8x ESP-01S, 6x Wemos D1, 4x Sonoff Basic 12x Sonoff S20, 2x Sonoff SV e un NodeMCU che condividono una base di codice comune, quindi sono 33 dispositivi in tutto da aggiornare quando creo un codice semplice modificare.

Ma c'è un modo più semplice: un "server di aggiornamento". L'eccellente core Arduino IDE + ESP8266 ha una libreria per fare la maggior parte del lavoro (ESP8266httpUpdate), ma devi sapere come configurare il tuo server per farlo funzionare.

Questo Instructable ti mostra come utilizzare un server NODE-RED, ma la stessa logica si applica a qualsiasi tecnologia server di tua scelta, ad es. Apache + PHP ecc

Passaggio 1: cosa ti serve

  1. Arduino IDE
  2. Nucleo ESP8266
  3. Qualsiasi scheda di sviluppo ESP8266 con 1M o più RAM flash
  4. Un server Web (anche un umile Raspberry Pi andrà bene - È quello che uso)
  5. (opzionale) strumento mkspiffs se si desidera aggiornare automaticamente un'immagine del file system SPIFFS

Passaggio 2: creare un repository per contenere firmware binari

Crea un repository per contenere firmware binari
Crea un repository per contenere firmware binari

Sul mio server, ho una cartella chiamata /home/pi/trucFirmware che contiene i vari firmware dei dispositivi e le immagini SPIFFS

Mantengo un binario separato per ogni tipo di hardware (da un singolo file sorgente con alcuni #defines) e quando una nuova versione è pronta utilizzo il comando di menu "schizzo/Esporta binario compilato" dell'IDE Arduino per ogni dispositivo di destinazione. Nota che anche sebbene ci siano 5 diversi tipi di hardware, ci sono solo due binari SPIFFS: una versione 1M e una versione 4M - costruite con lo strumento mkspiffs - poiché tutti i dispositivi hanno flash da 1M o 4M.

Passaggio 3: creare i file binari

Utilizzando l'opzione del menu Arduino IDE sketch/Export Compiled Binary, creare il firmware che verrà caricato sul dispositivo quando lo richiede dal server di aggiornamento.

Se hai bisogno di un binario SPIFFS dovrai installare lo strumento mkspiffs.

Una volta che lo hai, costruire il binario SPIFFS è semplice. Ho un file batch di una riga per la versione 1M che prende il numero di versione come parametro (%1)

mkspiffs -c data/ spiffs_%1_1M.bin

e un altro per la versione 4M:

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

Quindi copio tutti i binari compilati e i file SPIFFS.binary nel repository

Passaggio 4: creare il flusso del server

Crea il flusso del server
Crea il flusso del server

Sto usando NODE-RED, ma la semplice logica sarà la stessa su qualsiasi tecnologia/linguaggio server.

a) Definire un URL che ascolterà la richiesta ESP8266httpUpdate. Il mio raspberryPi serevr è su 192.168.1.4 e ascolta sulla porta 1880 per /update con il tipo di hardware aggiunto. Quindi, se ho intenzione di richiedere un binario per un Wemos D1 Mini, l'URL finisce come:

192.168.1.4:1880/update/d1_mini

b) Creare codice per gestire la seguente logica:

ESP8266: "Ciao, sto eseguendo la versione del firmware a.b.c, hai una versione più recente?" Server: "Fammi vedere… ah sì, ho a.b.d - ecco che arriva…"

Se esiste una versione più recente, il server la invia semplicemente come carico di dati binari nella risposta http. La classe ESP8266httpUpdate fa la parte difficile della copia del binario in memoria, modificando l'indirizzo di avvio del firmware con il nuovo codice piuttosto che (se richiesto) riavviando il dispositivo per eseguire il nuovo codice.

Se d'altra parte non esiste una versione superiore, risponde con un errore http 304 che dice effettivamente: "Non ho niente per te" e il tuo codice continua a funzionare normalmente.

Passaggio 5: aggiungere la logica del server

Il primo nodo nel flusso "ascolta" una richiesta http all'URL https://192.168.1.4:1880/update con il tipo di dispositivo aggiunto. Lo passa al nodo funzione "Costruisci percorso di ricerca" che ha il seguente codice 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=="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"; } restituisce il messaggio;

Questo imposta solo il percorso appropriato con il carattere jolly per la funzione sys che segue, che viene semplicemente eseguita

ls - r

L'output viene quindi inviato al nodo funzione "Confronta versioni":

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

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

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(versione.msg < f){

node.warn("aggiornamento richiesto");

node.warn("restituirà "+msg.filename); messaggio di ritorno; } node.warn("nessun aggiornamento"); msg.statusCode=304; msg.payload=;

messaggio di ritorno;

Il nodo switch garantisce quindi che venga inviato il messaggio 304 "nessun aggiornamento necessario" o che il nuovo binario effettivo venga restituito e rispedito al dispositivo.

Passaggio 6: aggiungi codice allo schizzo per richiedere un aggiornamento

Lo schizzo deve avere il seguente codice incluso in esso in modo che si aggiorni automaticamente la prossima volta che si aumenta il numero di versione:

#includere

#define TRUC_VERSION "0_4_99"

#define SPIFFS_VERSION "0_5_0"

// THIS_DEVICE è impostato in precedenza a seconda delle varie definizioni in fase di compilazione // che alla fine definiscono il tipo hw, ad es. #define THIS_DEVICE "d1_mini" const char * updateUrl="https://192.168.1.4:1880/update/"THIS_DEVICE; // questo è il mio server Raspberry Pi, il 1880 è la porta NODE-RED predefinita // /update è l'URL che ho scelto per il server da "ascoltare", seguito dal tipo di dispositivo … bool realUpdate(bool sketch=false) { Stringa messaggio; t_httpUpdate_return ret; ESPhttpUpdate.rebootOnUpdate(false); if(schizzo){ ret=ESPhttpUpdate.update(updateUrl, TRUC_VERSION); // **************** Questa è la riga che "fa il lavoro" } else { ret=ESPhttpUpdate.updateSpiffs(updateUrl, SPIFFS_VERSION); } if(ret!=HTTP_UPDATE_NO_UPDATES){ if(ret==HTTP_UPDATE_OK){

Serial.printf("AGGIORNAMENTO RIUSCITO");

restituire vero; } else { if(ret==HTTP_UPDATE_FAILED){

Serial.printf("Aggiornamento fallito");

} } } restituisce falso; }

Passaggio 7: infine, avvia l'aggiornamento

Al momento dell'avvio, o forse in risposta a un messaggio MQTT (come faccio io), esegui il seguente codice:

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

// o per SPIFFS…

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

Il dispositivo si aggiornerà e si riavvierà eseguendo il codice più recente dal server. È molto più semplice per me che aggiornare manualmente 33 dispositivi!

Molte altre informazioni utili su Home Automation, IOT e programmazione di ESP8266 possono essere trovate su My Blog

Consigliato: