Compartilhar via


Adiar atualizações de dispositivo

Um aplicativo de alto nível pode adiar temporariamente as atualizações para o sistema operacional do Azure Sphere e para imagens de aplicativo para impedir que a atualização interrompa o processamento crítico. Um dispositivo do Azure Sphere em uma cozinha dispositivo, por exemplo, poderia adiar as atualizações durante o uso. Para ter a oportunidade de adiar atualizações, o aplicativo se registra para notificações de atualização. Depois que o sistema operacional baixa a atualização, ele notifica o aplicativo, que pode obter detalhes sobre a atualização e o adiamento da solicitação.

O exemplo de Atualização Adiada mostra como usar um loop de eventos e eventos do sistema para adiar atualizações.

Os RTApps (aplicativos com capacidade em tempo real) não podem receber notificações de atualização ou adiamentos de solicitação. Um aplicativo de alto nível é responsável por gerenciar o adiamento de atualização em nome dos RTApps no dispositivo.

Requisitos de adiamento

Os aplicativos que adiam atualizações devem incluir os arquivos de cabeçalho apropriados e adicionar configurações de adiamento ao manifesto do aplicativo.

Arquivos de cabeçalho

Inclua os cabeçalhos eventloop e sysevent em seu projeto:

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

Configurações do manifesto do aplicativo

Para ser notificado sobre eventos de atualização de software e ter a oportunidade de adiar essas atualizações, um aplicativo inclui duas funcionalidades no arquivo de manifesto do aplicativo :

  • SystemEventNotifications
  • SoftwareUpdateDeferral

Defina o campo SystemEventNotifications como true no arquivo app_manifest.json para receber notificações de eventos de atualização do sistema. O aplicativo também deve se registrar para notificações de evento, conforme descrito no mecanismo de notificação. Defina SoftwareUpdateDeferral para true permitir que o aplicativo adie e retome as atualizações.

O seguinte mostra as configurações app_manifest.json necessárias para habilitar a notificação e o adiamento:

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

Mecanismo de notificação

O Azure Sphere dá suporte ao adiamento de atualização por meio de um mecanismo de notificação de eventos e loop de eventos. O aplicativo cria um EventLoop, que é um objeto de thread único por meio do qual o aplicativo é notificado de eventos pendentes.

Para receber notificações, um aplicativo chama SysEvent_RegisterForEventNotifications, passando esses parâmetros:

  • Um ponteiro para o loop de eventos
  • Um eventBitmask que especifica os eventos para os quais o aplicativo solicita notificação
  • Um ponteiro para uma função de retorno de chamada definida pelo aplicativo
  • Um ponteiro de contexto opcional que é passado para o retorno de chamada

Somente um EventLoop objeto pode ser usado com SysEvent_RegisterForEventNotifications por thread. Uma segunda chamada para SysEvent_RegisterForEventNotifications com um objeto diferente EventLoop falhará.

Após o registro, o aplicativo chama EventLoop_Run, que invoca a função de retorno de chamada se um evento tiver sido alterado status. A função de retorno de chamada recebe um valor SysEvent_Events , que identifica o tipo de evento. Por sua vez, as chamadas de retorno de chamada SysEvent_Info_GetUpdateData para descobrir se o evento é uma atualização do sistema operacional ou do aplicativo e quanto tempo a atualização pode ser adiada. Em seguida, o aplicativo pode determinar como lidar com a notificação do evento.

O Azure Sphere pode enviar várias notificações status para cada evento de atualização:

Status Descrição
SysEvent_Status_Pending Um aviso de 10 segundos de que ocorrerá um evento de atualização, com a oportunidade de adiar.
SysEvent_Status_Final Um aviso de 10 segundos de que ocorrerá um evento de atualização, sem a oportunidade de adiamento.
SysEvent_Status_Deferred O evento anteriormente pendente foi adiado e ocorrerá posteriormente.
SysEvent_Status_Complete O processo de atualização de software está concluído. Essa notificação de evento é enviada apenas para atualizações de aplicativo.

Um aplicativo só pode solicitar o adiamento depois de receber uma notificação SysEvent_Status_Pending . Para permitir que a atualização ocorra imediatamente, o aplicativo pode ignorar a notificação.

Para adiar a atualização, o aplicativo chama SysEvent_DeferEvent, passando o número de minutos para adiar a atualização. Para uma atualização do sistema operacional, o adiamento máximo é de 1440 minutos (24 horas). Para uma atualização de aplicativo, o período máximo de adiamento é de 10.020 minutos (167 horas).

Um aplicativo pode encerrar um adiamento de atualização prematuramente chamando SysEvent_ResumeEvent. Para um aplicativo ou atualização do sistema operacional, uma chamada bem-sucedida para SysEvent_ResumeEvent reinicia o processo de notificação e, portanto, envia uma nova SysEvent_Status_Pending notificação. O aplicativo não deve chamar SysEvent_DeferEvent novamente até receber tal notificação.

Quando o aplicativo recebe a notificação SysEvent_Status_Final , ele deve se preparar para receber um sinal SIGTERM do sistema operacional do Azure Sphere. Quando o sinal SIGTERM for recebido, o aplicativo deverá executar a limpeza e a saída finais. O aplicativo não deve sair antes que o SIGTERM seja recebido; caso contrário, ele pode ser reiniciado antes que o SIGTERM seja enviado. Para uma atualização do sistema operacional, o aplicativo deve fazer qualquer limpeza necessária antes da reinicialização do dispositivo. Para uma atualização de aplicativo, o aplicativo de alto nível deve fazer o que for necessário antes que ele ou qualquer outro aplicativo no dispositivo seja reiniciado. No momento, a notificação do aplicativo não especifica qual aplicativo está sendo atualizado.

Quando a notificação não for mais necessária, o aplicativo deve chamar SysEvent_UnregisterForEventNotifications e , em seguida, EventLoop_Close para liberar a memória alocada para o objeto loop de evento. Observe que, depois que todas as notificações de evento tiverem sido não registradas, o aplicativo pode usar um novo EventLoop objeto.