Actualizaciones diferidas de dispositivos
Importante
Esta es la documentación de Azure Sphere (heredado). Azure Sphere (heredado) se retira el 27 de septiembre de 2027 y los usuarios deben migrar a Azure Sphere (integrado) en este momento. Use el selector de versiones situado encima de la TOC para ver la documentación de Azure Sphere (integrado).
Una aplicación de alto nivel puede aplazar temporalmente las actualizaciones del sistema operativo Azure Sphere y de imágenes de aplicación para evitar que la actualización interrumpa procesos críticos. Por ejemplo, un dispositivo de Azure Sphere en un electrodoméstico de cocina podría diferir las actualizaciones mientras se usa. Para poder diferir las actualizaciones, la aplicación se registra para recibir notificaciones de actualizaciones. Después de que el sistema operativo descargue la actualización, notifica a la aplicación, que puede obtener detalles sobre la actualización y solicitar el aplazamiento.
En el ejemplo de actualización aplazada se muestra cómo usar un bucle de eventos y eventos del sistema para aplazar las actualizaciones.
Las aplicaciones con respuesta en tiempo real (RTApp) no pueden recibir notificaciones de actualizaciones ni solicitar aplazamientos. Una aplicación de alto nivel es responsable de administrar el aplazamiento de actualizaciones en nombre de las RTApp del dispositivo.
Requisitos de aplazamiento
Las aplicaciones que aplazan actualizaciones deben incluir los archivos de encabezado adecuados y agregar la configuración de aplazamiento al manifiesto de aplicación.
Archivos de encabezado
Incluya los encabezados eventloop y sysevent en el proyecto:
#include <applibs/eventloop.h>
#include <applibs/sysevent.h>
Configuración del manifiesto de aplicación
Para recibir notificaciones acerca de los 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 aplicación:
- SystemEventNotifications
- SoftwareUpdateDeferral
Establezca el campo SystemEventNotifications en true
en el archivo app_manifest.json para recibir notificaciones de eventos de actualización del sistema. La aplicación también debe registrarse para recibir notificaciones de eventos, como se describe en Mecanismo de notificación. Establezca SoftwareUpdateDeferral en true
para permitir que la aplicación aplace y reanude las actualizaciones.
A continuación se muestra la configuración de app_manifest.json necesaria para habilitar las notificaciones y el aplazamiento:
"Capabilities": {
"SystemEventNotifications" : true,
"SoftwareUpdateDeferral" : true
}
Mecanismo de notificación
Azure Sphere admite el aplazamiento de actualizaciones mediante un mecanismo de notificación y bucle de eventos. La aplicación crea un EventLoop
, que es un objeto de un único subproceso mediante el 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
- Un valor
eventBitmask
que especifica los eventos para los que la aplicación solicita la notificación - Un puntero a una función de devolución de llamada definida por la aplicación
- Un puntero de contexto opcional que se pasa a la devolución de llamada
Solo se puede usar un objeto EventLoop
con SysEvent_RegisterForEventNotifications por subproceso. Se producirá un error en una segunda llamada a SysEvent_RegisterForEventNotifications con un objeto EventLoop
distinto.
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 SysEvent_Events, que identifica el tipo de evento. A su vez, la devolución de llamada llama a SysEvent_Info_GetUpdateData para averiguar si el evento es una actualización del sistema operativo o de 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 de eventos.
Azure Sphere puede enviar varias notificaciones de estado para cada evento de actualización:
Estado | Descripción |
---|---|
SysEvent_Status_Pending | Advertencia de 10 segundos de que se va a producir un evento de actualización, con la oportunidad de aplazarlo. |
SysEvent_Status_Final | Advertencia de 10 segundos de que se va a producir un evento de actualización, sin la oportunidad de aplazarlo. |
SysEvent_Status_Deferred | El evento pendiente anteriormente se ha aplazado y se producirá más adelante. |
SysEvent_Status_Complete | El proceso de actualización de software ha finalizado. Esta notificación de evento solo se envía para actualizaciones de aplicación. |
Una aplicación puede solicitar el aplazamiento solo después de recibir una notificación de SysEvent_Status_Pending. Para permitir que la actualización se realice inmediatamente, la aplicación puede omitir la notificación.
Para aplazar la actualización, la aplicación llama a SysEvent_DeferEvent y pasa el número de minutos que aplazar la actualización. En el caso de una actualización del sistema operativo, el aplazamiento máximo es de 1440 minutos (24 horas). En el caso de una actualización de aplicación, el aplazamiento máximo es de 10 020 minutos (167 horas).
Una aplicación puede finalizar un aplazamiento de actualización prematuramente mediante una llamada a SysEvent_ResumeEvent. Tanto para una actualización de aplicación como del sistema operativo, una llamada correcta a SysEvent_ResumeEvent reinicia el proceso de notificación y, por tanto, envía una nueva notificación SysEvent_Status_Pending. La aplicación no debe llamar a SysEvent_DeferEvent de nuevo 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 de Azure Sphere. Cuando se recibe la señal SIGTERM, la aplicación debe realizar la limpieza y salida finales. La aplicación no debe salir antes de recibir el SIGTERM; De lo contrario, se podría reiniciar antes de enviar el SIGTERM. En el caso de una actualización del sistema operativo, la aplicación debe realizar cualquier operación de limpieza que sea necesaria antes del reinicio del dispositivo. En el caso de una actualización de aplicación, la aplicación de alto nivel debe hacer lo que sea necesario antes de que esta o cualquier otra aplicación del dispositivo se reinicie. La notificación de la aplicación no especifica actualmente qué aplicación se está actualizando.
Cuando ya no se requieren notificaciones, la aplicación debe llamar a SysEvent_UnregisterForEventNotifications y, a continuación, a EventLoop_Close para liberar la memoria asignada para el objeto de bucle de eventos. Una vez que se haya anulado el registro de todas las notificaciones de eventos, la aplicación podrá usar un nuevo objeto EventLoop
.