Aplazar las actualizaciones del dispositivo

Una aplicación de alto nivel puede aplazar temporalmente las actualizaciones del sistema operativo Azure Sphere y de las imágenes de la aplicación para evitar que la actualización interrumpa el procesamiento crítico. Un dispositivo Azure Sphere en un aparato de cocina, por ejemplo, podría aplazar las actualizaciones durante el uso. Para tener la oportunidad de aplazar las actualizaciones, la aplicación se registra para recibir notificaciones de actualización. Una vez que el sistema operativo descarga la actualización, notifica a la aplicación, que puede obtener detalles sobre la actualización y solicitar el aplazamiento.

En el ejemplo actualización diferida se muestra cómo usar un bucle de eventos y eventos del sistema para aplazar las actualizaciones.

Las aplicaciones compatibles con tiempo real (RTApps) no pueden recibir notificaciones de actualización ni solicitudes de aplazamientos. Una aplicación de alto nivel es responsable de administrar el aplazamiento de actualizaciones en nombre de las RTApps en el dispositivo.

Requisitos de aplazamiento

Las aplicaciones que aplazan actualizaciones deben incluir los archivos de encabezado adecuados y agregar una configuración de aplazamiento al manifiesto de la aplicación.

Archivos de encabezado

Incluya los encabezados eventloop y sysevent en el proyecto:

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

Configuración de manifiesto de la aplicación

Para recibir notificaciones sobre eventos de actualización de software y tener la oportunidad de aplazar dichas actualizaciones, una aplicación incluye dos funcionalidades en el archivo de manifiesto de la aplicación :

  • SystemEventNotifications
  • SoftwareUpdateDeferral

Establezca el campo trueSystemEventNotifications en el archivo app_manifest.json para recibir notificaciones de eventos de actualización del sistema. La aplicación también debe registrarse para las notificaciones de eventos, como se describe en Mecanismo de notificación. Establezca SoftwareUpdateDeferral para true habilitar la aplicación para aplazar y reanudar las actualizaciones.

A continuación se muestra la configuración de app_manifest.json necesaria para habilitar la notificación y el aplazamiento:

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

Mecanismo de notificación

Azure Sphere admite el aplazamiento de la actualización a través de un mecanismo de bucle de eventos y notificación de eventos. La aplicación crea un EventLoop, que es un objeto de subproceso único a través del cual se notifica a la aplicación de eventos pendientes.

Para recibir notificaciones, una aplicación llama a SysEvent_RegisterForEventNotifications, pasando estos parámetros:

  • Un puntero al bucle de eventos
  • Una eventBitmask que especifica los eventos para los que la aplicación solicita notificación
  • Puntero a una función de devolución de llamada definida por la aplicación
  • Puntero de contexto opcional que se pasa a la devolución de llamada

Solo se puede usar un EventLoop objeto con SysEvent_RegisterForEventNotifications por subproceso. Se producirá un error en una segunda llamada a SysEvent_RegisterForEventNotifications con un objeto diferente EventLoop .

Después del registro, la aplicación llama a EventLoop_Run, que invoca la función de devolución de llamada si un evento ha cambiado de estado. La función de devolución de llamada recibe un valor de SysEvent_Events , que identifica el tipo de evento. A su vez, la devolución de llamada SysEvent_Info_GetUpdateData para averiguar si el evento es una actualización del sistema operativo o de la aplicación y cuánto tiempo se puede aplazar la actualización. A continuación, la aplicación puede determinar cómo administrar la notificación del evento.

Azure Sphere puede enviar varias notificaciones de estado para cada evento de actualización:

Estado Descripción
SysEvent_Status_Pending Una advertencia de 10 segundos de que se producirá un evento de actualización, con la oportunidad de aplazar.
SysEvent_Status_Final Advertencia de 10 segundos de que se producirá un evento de actualización, sin la posibilidad de aplazamiento.
SysEvent_Status_Deferred El evento pendiente anteriormente se ha aplazado y se producirá más tarde.
SysEvent_Status_Complete El proceso de actualización de software está completo. Esta notificación de evento se envía solo para las actualizaciones de aplicaciones.

Una aplicación solo puede solicitar el aplazamiento después de recibir una notificación de SysEvent_Status_Pending . Para permitir que la actualización se produzca inmediatamente, la aplicación puede ignorar la notificación.

Para aplazar la actualización, la aplicación llama a SysEvent_DeferEvent, pasando el número de minutos para aplazar la actualización. Para una actualización del sistema operativo, el aplazamiento máximo es de 1440 minutos (24 horas). Para una actualización de la aplicación, el período de aplazamiento máximo es de 10.020 minutos (167 horas).

Una aplicación puede finalizar un aplazamiento de actualización prematuramente llamando a SysEvent_ResumeEvent. Para una aplicación o actualización del sistema operativo, una llamada correcta a SysEvent_ResumeEvent reinicia el proceso de notificación y, por tanto, envía una nueva notificación de SysEvent_Status_Pending . La aplicación no debería volver a llamar a SysEvent_DeferEvent hasta que haya recibido dicha notificación.

Cuando la aplicación recibe la notificación de SysEvent_Status_Final , debe prepararse para recibir una señal SIGTERM del sistema operativo Azure Sphere. Cuando se recibe la señal SIGTERM, la aplicación debe realizar la limpieza final y salir. La aplicación no debe salir antes de que se reciba el SIGTERM; de lo contrario, podría reiniciarse antes de que se envíe el SIGTERM. Para una actualización del sistema operativo, la aplicación debe realizar la limpieza necesaria antes de reiniciar el dispositivo. Para una actualización de la aplicación, la aplicación de alto nivel debe hacer lo que sea necesario antes de que se reinicie o cualquier otra aplicación del dispositivo. La notificación de la aplicación no especifica actualmente qué aplicación se está actualizando.

Cuando la notificación ya no es necesaria, la aplicación debe llamar a SysEvent_UnregisterForEventNotifications y, a continuación, EventLoop_Close liberar la memoria asignada para el objeto de bucle de eventos. Tenga en cuenta que, después de anular el registro de todas las notificaciones de eventos, la aplicación puede usar un nuevo EventLoop objeto.