Différer les mises à jour de l’appareil

Une application de haut niveau peut différer temporairement les mises à jour du système d’exploitation Azure Sphere et des images d’application pour empêcher la mise à jour d’interrompre le traitement critique. Un appareil Azure Sphere dans une cuisine Appliance, par exemple, peut différer les mises à jour pendant l’utilisation. Pour avoir la possibilité de différer les mises à jour, l’application s’inscrit aux notifications de mise à jour. Une fois que le système d’exploitation a téléchargé la mise à jour, il avertit l’application, qui peut obtenir des détails sur la mise à jour et demander le report.

L’exemple Mise à jour différée montre comment utiliser une boucle d’événements et des événements système pour différer les mises à jour.

Les applications en temps réel (RTApps) ne peuvent pas recevoir de notifications de mise à jour ou de report de demande. Une application de haut niveau est responsable de la gestion du report de mise à jour pour le compte des applications en temps réel sur l’appareil.

Conditions requises pour le report

Les applications qui reportent les mises à jour doivent inclure les fichiers d’en-tête appropriés et ajouter des paramètres de report au manifeste de l’application.

Fichiers d’en-tête

Incluez les en-têtes eventloop et sysevent dans votre projet :

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

Paramètres du manifeste d’application

Pour être avertie des événements de mise à jour logicielle et avoir la possibilité de différer ces mises à jour, une application inclut deux fonctionnalités dans le fichier manifeste de l’application :

  • SystemEventNotifications
  • SoftwareUpdateDeferral

Définissez le champ trueSystemEventNotifications sur dans le fichier app_manifest.json pour recevoir des notifications d’événements de mise à jour du système. L’application doit également s’inscrire aux notifications d’événements, comme décrit dans Mécanisme de notification. Définissez SoftwareUpdateDeferral sur true pour permettre à l’application de différer et de reprendre les mises à jour.

L’exemple suivant montre les paramètres app_manifest.json requis pour activer la notification et le report :

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

Mécanisme de notification

Azure Sphere prend en charge le report de mise à jour via un mécanisme de notification d’événement et de boucle d’événement. L’application crée un EventLoop, qui est un objet monothread par le biais duquel l’application est avertie des événements en attente.

Pour recevoir des notifications, une application appelle SysEvent_RegisterForEventNotifications, en transmettant les paramètres suivants :

  • Pointeur vers la boucle d’événement
  • eventBitmask qui spécifie les événements pour lesquels l’application demande une notification
  • Pointeur vers une fonction de rappel définie par l’application
  • Pointeur de contexte facultatif passé au rappel

EventLoop Un seul objet peut être utilisé avec SysEvent_RegisterForEventNotifications par thread. Un deuxième appel à SysEvent_RegisterForEventNotifications avec un autre EventLoop objet échoue.

Après l’inscription, l’application appelle EventLoop_Run, qui appelle la fonction de rappel si un événement a changé status. La fonction de rappel reçoit une valeur SysEvent_Events , qui identifie le type d’événement. À son tour, le rappel appelle SysEvent_Info_GetUpdateData pour savoir si l’événement est une mise à jour du système d’exploitation ou de l’application et combien de temps la mise à jour peut être différée. L’application peut ensuite déterminer comment gérer la notification d’événement.

Azure Sphere peut envoyer plusieurs notifications status pour chaque événement de mise à jour :

Statut Description
SysEvent_Status_Pending Avertissement de 10 secondes indiquant qu’un événement de mise à jour se produit, avec la possibilité de différer.
SysEvent_Status_Final Avertissement de 10 secondes indiquant qu’un événement de mise à jour se produira, sans possibilité de report.
SysEvent_Status_Deferred L’événement en attente précédemment en attente a été différé et se produira ultérieurement.
SysEvent_Status_Complete Le processus de mise à jour logicielle est terminé. Cette notification d’événement est envoyée uniquement pour les mises à jour de l’application.

Une application ne peut demander le report qu’après avoir reçu une notification SysEvent_Status_Pending . Pour permettre la mise à jour immédiatement, l’application peut ignorer la notification.

Pour différer la mise à jour, l’application appelle SysEvent_DeferEvent, en passant le nombre de minutes pour différer la mise à jour. Pour une mise à jour du système d’exploitation, le report maximal est de 1 440 minutes (24 heures). Pour une mise à jour d’application, la période de report maximale est de 10 020 minutes (167 heures).

Une application peut mettre fin à un report de mise à jour prématurément en appelant SysEvent_ResumeEvent. Pour une mise à jour d’application ou de système d’exploitation, un appel réussi à SysEvent_ResumeEvent redémarre le processus de notification et envoie donc une nouvelle notification SysEvent_Status_Pending . L’application ne doit pas appeler SysEvent_DeferEvent à nouveau tant qu’elle n’a pas reçu une telle notification.

Lorsque l’application reçoit la notification SysEvent_Status_Final , elle doit se préparer à recevoir un signal SIGTERM à partir du système d’exploitation Azure Sphere. Lorsque le signal SIGTERM est reçu, l’application doit effectuer le nettoyage final et se fermer. L’application ne doit pas se fermer avant la réception du SIGTERM ; sinon, il peut être redémarré avant l’envoi du SIGTERM. Pour une mise à jour du système d’exploitation, l’application doit effectuer le nettoyage nécessaire avant le redémarrage de l’appareil. Pour une mise à jour d’application, l’application de haut niveau doit faire tout ce qui est nécessaire avant qu’elle ou toute autre application sur l’appareil ne soit redémarrée. La notification d’application ne spécifie pas actuellement l’application en cours de mise à jour.

Lorsque la notification n’est plus nécessaire, l’application doit appeler SysEvent_UnregisterForEventNotifications , puis EventLoop_Close libérer la mémoire allouée pour l’objet de boucle d’événements. Notez qu’une fois que toutes les notifications d’événements ont été annulées, l’application peut utiliser un nouvel EventLoop objet.