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.