Diferir atualizações de dispositivos
Uma aplicação de alto nível pode adiar temporariamente as atualizações para o SO do Azure Sphere e para as imagens da aplicação para impedir que a atualização interrompa o processamento crítico. Um dispositivo do Azure Sphere numa aplicação de cozinha, por exemplo, pode diferir as atualizações durante a utilização. Para ter a oportunidade de diferir atualizações, a aplicação regista-se para notificações de atualização. Depois de o SO transferir a atualização, notifica a aplicação, que pode obter detalhes sobre a atualização e o adiamento do pedido.
O exemplo de Atualização Diferida mostra como utilizar um ciclo de eventos e eventos do sistema para diferir atualizações.
As aplicações com capacidade em tempo real (RTApps) não podem receber notificações de atualização ou diferimentos de pedidos. Uma aplicação de alto nível é responsável por gerir o diferimento de atualizações em nome do RTApps no dispositivo.
Requisitos de diferimento
As aplicações que diferim atualizações têm de incluir os ficheiros de cabeçalho adequados e adicionar definições de diferimento ao manifesto da aplicação.
Ficheiros de cabeçalho
Inclua os cabeçalhos eventloop e sysevent no seu projeto:
#include <applibs/eventloop.h>
#include <applibs/sysevent.h>
Definições do manifesto da aplicação
Para ser notificada sobre eventos de atualização de software e ter a oportunidade de diferir essas atualizações, uma aplicação inclui duas capacidades no ficheiro de manifesto da aplicação :
- SystemEventNotifications
- SoftwareUpdateDeferral
Defina o campo SystemEventNotifications como true
no ficheiro app_manifest.json para receber notificações de eventos de atualização do sistema. A aplicação também tem de se registar para notificações de eventos, conforme descrito no Mecanismo de notificação. Defina SoftwareUpdateDeferral para true
permitir que a aplicação adie e retome as atualizações.
O seguinte mostra as definições de app_manifest.json necessárias para ativar a notificação e o diferimento:
"Capabilities": {
"SystemEventNotifications" : true,
"SoftwareUpdateDeferral" : true
}
Mecanismo de notificação
O Azure Sphere suporta o diferimento de atualizações através de um mecanismo de notificação de eventos e ciclo de eventos. A aplicação cria um EventLoop
, que é um objeto de thread único através do qual a aplicação é notificada de eventos pendentes.
Para receber notificações, uma aplicação chama SysEvent_RegisterForEventNotifications, transmitindo estes parâmetros:
- Um ponteiro para o ciclo de eventos
- Um
eventBitmask
que especifica os eventos para os quais a aplicação pede notificação - Um ponteiro para uma função de chamada de retorno definida pela aplicação
- Um ponteiro de contexto opcional que é transmitido para a chamada de retorno
Apenas um EventLoop
objeto pode ser utilizado com SysEvent_RegisterForEventNotifications por thread. Uma segunda chamada para SysEvent_RegisterForEventNotifications com um objeto diferente EventLoop
falhará.
Após o registo, a aplicação chama EventLoop_Run, que invoca a função de chamada de retorno se um evento tiver alterado o estado. A função de chamada de retorno recebe um valor de SysEvent_Events , que identifica o tipo de evento. Por sua vez, a chamada de retorno chama SysEvent_Info_GetUpdateData para saber se o evento é uma atualização do SO ou da aplicação e durante quanto tempo a atualização pode ser diferida. Em seguida, a aplicação pode determinar como processar a notificação de evento.
O Azure Sphere pode enviar várias notificações de estado para cada evento de atualização:
Estado | Descrição |
---|---|
SysEvent_Status_Pending | Um aviso de 10 segundos de que ocorrerá um evento de atualização, com a oportunidade de diferir. |
SysEvent_Status_Final | Um aviso de 10 segundos de que ocorrerá um evento de atualização, sem a oportunidade de diferimento. |
SysEvent_Status_Deferred | O evento anteriormente pendente foi adiado e ocorrerá mais tarde. |
SysEvent_Status_Complete | O processo de atualização de software está concluído. Esta notificação de evento é enviada apenas para atualizações de aplicações. |
Uma aplicação só pode pedir o adiamento depois de receber uma notificação de SysEvent_Status_Pending . Para permitir que a atualização ocorra imediatamente, a aplicação pode ignorar a notificação.
Para diferir a atualização, a aplicação chama SysEvent_DeferEvent, passando o número de minutos para diferir a atualização. Para uma atualização do SO, o diferimento máximo é de 1440 minutos (24 horas). Para uma atualização da aplicação, o período de diferimento máximo é de 10 020 minutos (167 horas).
Uma aplicação pode terminar uma atualização prematuramente ao chamar SysEvent_ResumeEvent. Para uma aplicação ou atualização do SO, uma chamada com êxito para SysEvent_ResumeEvent reinicia o processo de notificação e, assim, envia uma nova notificação de SysEvent_Status_Pending . A aplicação não deve chamar SysEvent_DeferEvent novamente até receber essa notificação.
Quando a aplicação receber a notificação de SysEvent_Status_Final , deve preparar-se para receber um sinal SIGTERM do SO do Azure Sphere. Quando o sinal SIGTERM é recebido, a aplicação deve efetuar a limpeza final e sair. A aplicação não deve sair antes de o SIGTERM ser recebido; caso contrário, pode ser reiniciado antes de o SIGTERM ser enviado. Para uma atualização do SO, a aplicação deve fazer a limpeza necessária antes do reinício do dispositivo. Para uma atualização da aplicação, a aplicação de alto nível deve fazer o que for necessário antes de ser reiniciada ou qualquer outra aplicação no dispositivo. Atualmente, a notificação da aplicação não especifica que aplicação está a ser atualizada.
Quando a notificação já não for necessária, a aplicação deve chamar SysEvent_UnregisterForEventNotifications e , em seguida, EventLoop_Close para libertar a memória alocada para o objeto de ciclo de eventos. Tenha em atenção que, após o registo de todas as notificações de eventos, a aplicação pode utilizar um novo EventLoop
objeto.