Sommario:
- Passaggio 1: cosa ti serve
- Passaggio 2: creare un repository per contenere firmware binari
- Passaggio 3: creare i file binari
- Passaggio 4: creare il flusso del server
- Passaggio 5: aggiungere la logica del server
- Passaggio 6: aggiungi codice allo schizzo per richiedere un aggiornamento
- Passaggio 7: infine, avvia l'aggiornamento
Video: Configurare un server di aggiornamento automatico ESP8266: 7 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:05
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
- Arduino IDE
- Nucleo ESP8266
- Qualsiasi scheda di sviluppo ESP8266 con 1M o più RAM flash
- Un server Web (anche un umile Raspberry Pi andrà bene - È quello che uso)
- (opzionale) strumento mkspiffs se si desidera aggiornare automaticamente un'immagine del file system SPIFFS
Passaggio 2: creare 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
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:
Tracker di aggiornamento Covid-19 utilizzando ESP8266: 9 passaggi
Covid-19 Update Tracker utilizzando ESP8266: questo è un progetto che mostra i dati attuali dell'epidemia di coronavirus di varie città degli stati dell'India in tempo reale sul display OLED. Questo tracker di stato in tempo reale ti aiuta a monitorare l'aggiornamento covid-19 in tempo reale del tuo distretto. Questo progetto è completamente b
ESP8266 POV Fan con aggiornamento del testo dell'orologio e della pagina Web: 8 passaggi (con immagini)
ESP8266 POV Fan con aggiornamento del testo dell'orologio e della pagina Web: si tratta di una velocità variabile, POV (Persistence Of Vision), Fan che visualizza a intermittenza l'ora e due messaggi di testo che possono essere aggiornati "al volo". è anche un web server a pagina singola che ti permette di cambiare i due messaggi di testo
Configurare Raspberry Pi per un server proxy: 6 passaggi
Configurazione di Raspberry Pi per un server proxy: se vuoi che il tuo Raspberry Pi acceda a Internet tramite un server proxy, dovrai configurare il tuo Pi per utilizzare il server prima di poter accedere a Internet. Esistono due metodi con cui è possibile configurare il server proxy. Ma, comunque nei primi m
Configurare un server FTP usando Filezilla!: 7 passaggi
Configurazione di un server FTP utilizzando Filezilla!: 1. Che cos'è un server FTP? 2. Perché dovrei volerne fare uno? 1. File Transfer Protocol (FTP) è un protocollo di rete utilizzato per trasferire dati da un computer a un altro attraverso una rete, come Internet. FTP è un protocollo di trasferimento file per es
Come configurare Samba (file server): 6 passaggi
Come configurare Samba (file server): questo Instructable ti guiderà attraverso la configurazione di Samba Questo Instructable è basato su Linux Ubuntu 9.04. Le istruzioni su come configurarlo con le versioni più recenti saranno praticamente identiche. Mi concentrerò solo sulla configurazione di un file server in questo Instr