Share via


Zurückstellen von Geräteupdates

Eine allgemeine Anwendung kann Updates für das Azure Sphere-Betriebssystem und für Anwendungsimages vorübergehend zurückstellen, um zu verhindern, dass das Update die kritische Verarbeitung unterbricht. Ein Azure Sphere-Gerät in einer Küche Anwendung kann beispielsweise Updates während der Verwendung zurückstellen. Um die Möglichkeit zu haben, Updates zurückstellen zu können, registriert sich die App für Updatebenachrichtigungen. Nachdem das Betriebssystem das Update heruntergeladen hat, benachrichtigt es die Anwendung, die Details zum Update und zur Anforderungsverzögerung abrufen kann.

Im Beispiel für verzögertes Update wird gezeigt, wie Sie eine Ereignisschleife und Systemereignisse verwenden, um Updates zu verzögern.

Echtzeitfähige Anwendungen (RTApps) können keine Updatebenachrichtigungen empfangen oder Verzögerungen anfordern. Eine allgemeine App ist für die Verwaltung der Updateverzögerung im Auftrag von RTApps auf dem Gerät verantwortlich.

Zurückstellungsanforderungen

Anwendungen, die Updates zurückstellen, müssen die entsprechenden Headerdateien enthalten und dem Anwendungsmanifest Zurückstellungseinstellungen hinzufügen.

Headerdateien

Schließen Sie die Header eventloop und sysevent in Ihr Projekt ein:

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

Anwendungsmanifesteinstellungen

Um über Softwareupdateereignisse benachrichtigt zu werden und die Möglichkeit zu haben, solche Updates zurückzuweisen, enthält eine Anwendung zwei Funktionen in der Anwendungsmanifestdatei :

  • SystemEventNotifications
  • SoftwareUpdateDeferral

Legen Sie das Feld SystemEventNotifications in der Datei app_manifest.json auf fest true , um Benachrichtigungen über Systemupdateereignisse zu empfangen. Die Anwendung muss sich auch für Ereignisbenachrichtigungen registrieren, wie unter Benachrichtigungsmechanismus beschrieben. Legen Sie SoftwareUpdateDeferral auf fest true , damit die App Updates zurückstellen und fortsetzen kann.

Im Folgenden werden die app_manifest.json-Einstellungen veranschaulicht, die erforderlich sind, um sowohl Benachrichtigungen als auch Verzögerung zu aktivieren:

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

Benachrichtigungsmechanismus

Azure Sphere unterstützt die Updateverzögerung über einen Ereignisbenachrichtigungs- und Ereignisschleifenmechanismus. Die Anwendung erstellt ein EventLoop-Objekt, bei dem es sich um ein Singlethreadobjekt handelt, über das die Anwendung über ausstehende Ereignisse benachrichtigt wird.

Zum Empfangen von Benachrichtigungen ruft eine App SysEvent_RegisterForEventNotifications auf und übergibt die folgenden Parameter:

  • Ein Zeiger auf die Ereignisschleife
  • Ein eventBitmask , der die Ereignisse angibt, für die die App Benachrichtigungen anfordert
  • Ein Zeiger auf eine von der App definierte Rückruffunktion
  • Ein optionaler Kontextzeiger, der an den Rückruf übergeben wird

Nur ein EventLoop Objekt kann mit SysEvent_RegisterForEventNotifications pro Thread verwendet werden. Ein zweiter Aufruf von SysEvent_RegisterForEventNotifications mit einem anderen EventLoop Objekt schlägt fehl.

Nach der Registrierung ruft die Anwendung EventLoop_Run auf, die die Rückruffunktion aufruft, wenn sich ein Ereignis status geändert hat. Die Rückruffunktion empfängt einen SysEvent_Events Wert, der den Typ des Ereignisses angibt. Der Rückruf ruft wiederum SysEvent_Info_GetUpdateData auf, um herauszufinden, ob es sich bei dem Ereignis um ein Betriebssystem- oder Anwendungsupdate handelt und wie lange das Update verzögert werden kann. Die App kann dann bestimmen, wie die Ereignisbenachrichtigung behandelt wird.

Azure Sphere kann für jedes Updateereignis mehrere status Benachrichtigungen senden:

Status Beschreibung
SysEvent_Status_Pending Eine 10-Sekunden-Warnung, dass ein Updateereignis eintritt, mit der Möglichkeit zum Zurückstellen.
SysEvent_Status_Final Eine 10-Sekunden-Warnung, dass ein Updateereignis eintritt, ohne die Möglichkeit einer Verzögerung.
SysEvent_Status_Deferred Das zuvor ausstehende Ereignis wurde zurückgestellt und tritt später ein.
SysEvent_Status_Complete Der Softwareupdateprozess ist abgeschlossen. Diese Ereignisbenachrichtigung wird nur für Anwendungsupdates gesendet.

Eine App kann eine Verzögerung erst anfordern, nachdem sie eine SysEvent_Status_Pending Benachrichtigung erhalten hat. Damit das Update sofort ausgeführt werden kann, kann die Anwendung die Benachrichtigung ignorieren.

Um das Update zu verzögern, ruft die Anwendung SysEvent_DeferEvent auf und übergibt dabei die Anzahl der Minuten zum Zurückstellen des Updates. Bei einem Betriebssystemupdate beträgt die maximale Verzögerung 1440 Minuten (24 Stunden). Für ein Anwendungsupdate beträgt der maximale Verzögerungszeitraum 10.020 Minuten (167 Stunden).

Eine Anwendung kann eine Updateverzögerung vorzeitig beenden, indem sie SysEvent_ResumeEvent aufruft. Bei einem Anwendungs- oder Betriebssystemupdate startet ein erfolgreicher Aufruf von SysEvent_ResumeEvent den Benachrichtigungsprozess neu und sendet somit eine neue SysEvent_Status_Pending Benachrichtigung. Die App sollte SysEvent_DeferEvent erst dann erneut aufrufen, wenn sie eine solche Benachrichtigung erhalten hat.

Wenn die Anwendung die SysEvent_Status_Final Benachrichtigung empfängt, sollte sie sich auf den Empfang eines SIGTERM-Signals vom Azure Sphere-Betriebssystem vorbereiten. Wenn das SIGTERM-Signal empfangen wird, sollte die App die endgültige Bereinigung durchführen und beenden. Der Antrag sollte nicht vor Eingang der SIGTERM beendet werden; Andernfalls könnte es vor dem Senden der SIGTERM neu gestartet werden. Bei einem Betriebssystemupdate sollte die Anwendung vor dem Neustart des Geräts alle erforderlichen Bereinigungen durchführen. Für ein Anwendungsupdate sollte die allgemeine Anwendung alles tun, was erforderlich ist, bevor sie oder eine andere Anwendung auf dem Gerät neu gestartet wird. Die Anwendungsbenachrichtigung gibt derzeit nicht an, welche Anwendung aktualisiert wird.

Wenn keine Benachrichtigung mehr erforderlich ist, sollte die App SysEvent_UnregisterForEventNotifications aufrufen und dann EventLoop_Close , um den für das Ereignisschleifenobjekt zugewiesenen Arbeitsspeicher freizugeben. Beachten Sie, dass die App ein neues EventLoop -Objekt verwenden kann, nachdem die Registrierung aller Ereignisbenachrichtigungen aufgehoben wurde.