Partilhar via


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.