In uno dei primi articoli di questo tutorial, vi ho parlato del bootloader e della struttura della memoria flash. Nell’articolo scrivevo:
In questo modo è possibile implementare un meccanismo di aggiornamento over-the-air (OTA): si invia la nuova versione dell’applicazione al chip esp32 mentre è in funzione; tale versione viene memorizzata in una nuova partizione
Esistono diversi modi per implementare le funzionalità di aggiornamento OTA per la propria applicazione… oggi vi voglio mostrare come effettuarlo in maniera molto semplice, grazie ad un servizio cloud chiamato Freshen.
Freshen
Freshen è un IoT backend, ovvero uno strumento in cloud (disponibile su Internet) per la gestione di dispositivi IoT.
Dopo aver collegato i propri dispositivi a Freshen (vedremo nel proseguo dell’articolo come fare), è possibile:
[checklist]
- visualizzare la lista dei dispositivi e il loro stato
- inviare comandi ad ogni dispositivo
- gestire i files memorizzati su ogni dispositivo
- aggiornare il firmware over-the-air (OTA)
[/checklist]
Freshen è sviluppato da Cesanta, la compagnia produttrice anche di Mongoose e MongooseOS, molto utilizzati in ambito embedded e compatibili con il chip esp32. Il servizio offre diverse tariffe, inclusa una gratuita:
Per poter utilizzare Freshen è necessario per prima cosa registrarsi, utilizzando il proprio account Github o Google:
Libreria client
Cesanta mette a disposizione una libreria client che possiamo utilizzare per collegare il nostro progetto IoT basato sul chip esp32 alla dashboard di Freshen. La libreria è racchiusa in un solo file header (freshen.h), scaricabile dal sito ufficiale.
La libreria è pienamente compatibile con il framework esp-idf e mette a disposizione tutte le funzionalità del portale:
Il suo utilizzo è molto semplice. Per prima cosa copiamo il file freshen.h nella cartella main del nostro progetto:
Includiamo quindi il file nel nostro programma:
#include "freshen.h" |
Per consentire alla libreria di comunicare con la piattaforma Freshen nel cloud, dobbiamo richiamare periodicamente nel nostro programma la funzione freshen_loop().
Possiamo farlo utilizzando un task apposito:
void freshen_task(void *pvParameter) { while(1) { freshen_loop(FIRMWARE_VERSION, ACCESS_TOKEN); vTaskDelay(2000 / portTICK_RATE_MS); } } |
Il task esegue la funzione ogni 2 secondi. Creiamo il task all’interno di app_main() con:
// start the freshen update task xTaskCreate(&freshen_task, "freshen_task", 10000, NULL, 5, NULL); |
Il metodo freshen_loop() richiede due parametri: la versione del firmware (una stringa a nostra scelta, ad esempio “v1.0”) e l’access token, un codice che ci viene fornito dalla piattaforma dopo aver registrato il dispositivo.
Colleghiamoci quindi alla dashboard e clicchiamo Add new device:
Apparirà un nuovo dispositivo (My Device #n). Possiamo cliccare sul nome per visualizzarne i dettagli.
L’access token del dispositivo è oscurato… è possibile cliccare su click to copy per memorizzarlo nella clipboard del nostro computer e quindi incollarlo nel programma:
La pagina che visualizza i dettagli del dispositivo consente anche di cambiare il suo nome.
Se eseguiamo il nostro semplice programma (lo trovate nel mio repository Github), vedremo – dopo qualche secondo – cambiare lo stato del dispositivo in online, ad indicare che sta correttamente comunicando con la dashboard:
Nella pagina di dettaglio, vedremo ora quali metodi è possibile eseguire da remoto:
Ad esempio se invochiamo il metodo Sys.GetInfo vedremo apparire le informazioni su versione, architettura, data di compilazione:
OTA
Per poter effettuare l’aggiornamento da remoto del nostro dispositivo, dobbiamo ricordarci di utilizzare un layout di partizioni adeguato. Ad esempio possiamo scegliere uno dei layout già forniti con il framework:
Proviamo a modificare la versione del nostro firmware, portandola a “1.1”:
quindi compiliamo il programma ma non diamo il comando di flash. Prendiamo nota del percorso dove è memorizzato il firmware compilato:
Selezioniamo nella dashboard il nostro dispositivo e clicchiamo su OTA update selected:
Scegliamo il file .bin che contiene il nuovo firmware.
Dopo qualche istante, vedremo il dispositivo andare per alcuni secondi offline, quindi tornare online. Se il processo di update si è concluso con successo, invocando nuovamente il metodo Sys.GetInfo vedremo la nuova versione:
Hi Luca, great content, thank you! Do you know if freshen.cc service closed?
Hi, apparently they moved the dashboard to: https://dash.mongoose-os.com/