Rinvia gli aggiornamenti dei dispositivi

Un'applicazione di alto livello può rinviare temporaneamente gli aggiornamenti al sistema operativo Azure Sphere e alle immagini dell'applicazione per impedire che l'aggiornamento interrompa l'elaborazione critica. Un dispositivo Azure Sphere in un elettrodomestico da cucina, ad esempio, potrebbe ritardare gli aggiornamenti durante l'uso. Per avere l'opportunità di rinviare gli aggiornamenti, l'app si registra per le notifiche di aggiornamento. Dopo che il sistema operativo ha scaricato l'aggiornamento, invia una notifica all'applicazione, che può ottenere dettagli sull'aggiornamento e richiedere il rinvio.

L'esempio Deferred Update mostra come usare un ciclo di eventi e gli eventi di sistema per rinviare gli aggiornamenti.

Le applicazioni in tempo reale (RTApps) non possono ricevere notifiche di aggiornamento o richiedere rinvii. Un'app di alto livello è responsabile della gestione del rinvio degli aggiornamenti per conto di RTApps nel dispositivo.

Requisiti di rinvio

Le applicazioni che rinviano gli aggiornamenti devono includere i file di intestazione appropriati e aggiungere impostazioni di rinvio al manifesto dell'applicazione.

File di intestazione

Includere le intestazioni eventloop e sysevent nel progetto:

 #include <applibs/eventloop.h>
 #include <applibs/sysevent.h>

Impostazioni del manifesto dell'applicazione

Per ricevere notifiche sugli eventi di aggiornamento software e avere la possibilità di rinviare tali aggiornamenti, un'applicazione include due funzionalità nel file manifesto dell'applicazione :

  • SystemEventNotifications
  • SoftwareUpdateDeferral

Impostare il campo trueSystemEventNotifications su nel file app_manifest.json per ricevere notifiche sugli eventi di aggiornamento di sistema. L'applicazione deve anche registrarsi per le notifiche di eventi, come descritto nel meccanismo di notifica. Imposta SoftwareUpdateDeferral per consentire all'app true di rinviare e riprendere gli aggiornamenti.

Di seguito sono indicate le impostazioni di app_manifest.json necessarie per abilitare la notifica e il rinvio:

"Capabilities": {
        "SystemEventNotifications" : true,
        "SoftwareUpdateDeferral" : true
    }

Meccanismo di notifica

Azure Sphere supporta il rinvio dell'aggiornamento tramite una notifica di evento e un meccanismo di ciclo di eventi. L'applicazione crea un EventLoop, che è un oggetto a thread singolo attraverso il quale l'applicazione viene avvisata di eventi in sospeso.

Per ricevere notifiche, un'app chiama SysEvent_RegisterForEventNotifications passando questi parametri:

  • Puntatore al ciclo di eventi
  • Oggetto eventBitmask che specifica gli eventi per i quali l'app richiede la notifica
  • Puntatore a una funzione di callback definita dall'app
  • Puntatore contestuale facoltativo passato al callback

È possibile usare un solo EventLoop oggetto con SysEvent_RegisterForEventNotifications per thread. Una seconda chiamata per SysEvent_RegisterForEventNotifications con un oggetto diverso EventLoop avrà esito negativo.

Dopo la registrazione, l'applicazione chiama EventLoop_Run, che richiama la funzione di callback se un evento ha modificato lo stato. La funzione di callback riceve un valore di SysEvent_Events che identifica il tipo di evento. A sua volta, le chiamate di callback SysEvent_Info_GetUpdateData per scoprire se l'evento è un aggiornamento del sistema operativo o dell'applicazione e per quanto tempo è possibile posticipare l'aggiornamento. L'app può quindi determinare come gestire la notifica di evento.

Azure Sphere può inviare diverse notifiche di stato per ogni evento di aggiornamento:

Stato Descrizione
SysEvent_Status_Pending Un avviso di 10 secondi che indica che si verificherà un evento di aggiornamento, con l'opportunità di rinviare.
SysEvent_Status_Final Avviso di 10 secondi che indica che si verificherà un evento di aggiornamento, senza la possibilità di rinvio.
SysEvent_Status_Deferred L'evento in sospeso in precedenza è stato posticipato e si verificherà in un secondo momento.
SysEvent_Status_Complete Il processo di aggiornamento software è stato completato. Questa notifica evento viene inviata solo per gli aggiornamenti delle applicazioni.

Un'app può richiedere il rinvio solo dopo aver ricevuto una notifica di SysEvent_Status_Pending . Per consentire l'aggiornamento immediatamente, l'applicazione può ignorare la notifica.

Per rinviare l'aggiornamento, l'applicazione chiama SysEvent_DeferEvent, passando il numero di minuti per rinviare l'aggiornamento. Per un aggiornamento del sistema operativo, il rinvio massimo è di 1440 minuti (24 ore). Per un aggiornamento dell'applicazione, il periodo di differimento massimo è 10.020 minuti (167 ore).

Un'applicazione può terminare un rinvio anticipato di un aggiornamento chiamando SysEvent_ResumeEvent. Per un aggiornamento dell'applicazione o del sistema operativo, una chiamata riuscita per SysEvent_ResumeEvent riavvia il processo di notifica e quindi invia una nuova notifica SysEvent_Status_Pending . L'app non dovrebbe chiamare SysEvent_DeferEvent di nuovo fino a quando non ha ricevuto tale notifica.

Quando l'applicazione riceve la notifica SysEvent_Status_Final , dovrebbe prepararsi a ricevere un segnale SIGTERM dal sistema operativo Azure Sphere. Quando viene ricevuto il segnale SIGTERM, l'app deve eseguire la pulizia finale e uscire. L'applicazione non deve uscire prima della ricezione del SIGTERM; in caso contrario, potrebbe essere riavviata prima dell'invio del SIGTERM. Per un aggiornamento del sistema operativo, l'applicazione deve eseguire la pulizia necessaria prima del riavvio del dispositivo. Per un aggiornamento dell'applicazione, l'applicazione di alto livello deve fare tutto il necessario prima che venga riavviata o qualsiasi altra applicazione nel dispositivo. La notifica dell'applicazione attualmente non specifica quale applicazione deve essere aggiornata.

Quando la notifica non è più necessaria, l'app deve chiamare SysEvent_UnregisterForEventNotifications e quindi EventLoop_Close per rilasciare la memoria allocata per l'oggetto del ciclo di eventi. Si noti che dopo aver annullato la registrazione di tutte le notifiche degli eventi, l'app può usare un nuovo EventLoop oggetto.