immagine copertina del post

Se vuoi aggiornare un nodo IoT in modalità OTA (Over the Air), dovresti dimenticare i setup da hobbisti. Un calo di tensione durante la scrittura della memoria flash potrebbe rovinare il tuo ESP32 e costringerti a sostituire fisicamente il chip.

Strategia consigliata: Ogni dispositivo edge distribuito in campo deve implementare un'architettura di memoria a partizioni isolate (Blue-Green Deployment). Inoltre la state-machine di boot deve essere verificata e sicura prima di lanciare l'aggiornamento. In caso di problemi (CRC fail), potrai sempre ricorrere alla partizione 'factory'.

La Partition Table

Modifica il file partitions.csv e flasha il target direttamente con esptool.py.

# Name,     Type,   SubType, Offset, Size,   Flags
nvs,        data,   nvs,     ,       0x4000,
otadata,    data,   ota,     ,       0x2000,
phy_init,   data,   phy,     ,       0x1000,
factory,    app,    factory, ,       1M,
ota_0,      app,    ota_0,   ,       1M,
ota_1,      app,    ota_1,   ,       1M,

Analisi dei Blocchi di Memoria

PartizioneDimensioneSpecifica RAW
nvs16 KBNon solo SSID in chiaro. Struttura chiave-valore persistente per certificati x509, chiavi private MQTTS e costanti di calibrazione PID (Kp, Ki, Kd) per il tuning ad anello chiuso.
otadata8 KBIl core del routing OTA. Contiene le struct esp_ota_select_entry_t. Il bootloader (Stage 1) legge qui l'indice della partizione attiva. Fallisce il checksum CRC32? Rollback hardcoded alla partizione factory.
factory1 MBCore intoccabile in silicio. Firmware di fallback di fabbrica. Si avvia solo in caso di disastri critici per ripristinare stack di rete e tunnel di management.
ota_0 / ota_11 MBDoppio slot per deploy atomici. Il payload viene scaricato e scritto esclusivamente nello slot passivo, dopodiché si aggiorna il puntatore in otadata e si forza il reset.

Come implementare la OTA

Per gestire l’aggiornamento senza rischi, la logica deve essere deterministica:

il nodo verifica la connessione e interroga il server; se la versione remota è superiore a quella locale, avvia lo streaming del firmware direttamente nello slot di memoria passivo. Non c’è spazio per l’errore: se il download fallisce o il file è corrotto, il sistema interrompe tutto senza intaccare il firmware attivo.

Solo a scrittura completata e validata, il bootloader scambia i puntatori e forza un reset hardware, rendendo il passaggio alla nuova versione immediato e sicuro.

Conclusione

Senza la struttura A/B (Blue-Green) e un ‘fallback factory’ blindato, stai creando un sistema programmato per autodistruggersi al primo glitch di rete o calo di tensione: l’integrità del nodo deve essere garantita a livello hardware e quindi il bootloader deve agire come un ‘giudice’ imparziale. Deve quindi essere capace di scartare un firmware corrotto e di riportare la macchina in uno stato operativo noto (Safe State) senza intervento umano.

Smetti di scrivere codice che ‘spera’ di finire il download. Implementa l’isolamento dei blocchi, segmenta la memoria in modo deterministico e lascia che sia il bootloader a gestire la continuità del servizio. Solo così trasformerai un giocattolo connesso in un vero asset semi professionale.