Поделиться через


Отсрочка обновления устройства

Внимание

Это документация по Azure Sphere (устаревшая версия). Служба Azure Sphere (устаревшая версия) выходит на пенсию 27 сентября 2027 г., и к этому времени пользователи должны перейти в Azure Sphere (интегрированная). Используйте селектор версий, расположенный над toC, чтобы просмотреть документацию по Azure Sphere (интегрированная).

Высокоуровневое приложение может временно отложить обновления для ОС Azure Sphere и образов приложений, чтобы обновление не прерывало процесс критически важной обработки. Например, устройство Azure Sphere в кухонных принадлежностях может отложить обновления во время их применения. Для возможности отложить обновления приложение регистрируется для получения уведомлений об обновлениях. После скачивания обновления ОС уведомляет приложение, которое может получить сведения об обновлении и запросить отсрочку.

Пример отложенного обновления демонстрирует, как с помощью цикла событий и системных событий откладывать обновления.

Приложения, поддерживающие режим реального времени (RTApps), не могут получать уведомления об обновлениях или запрашивать отсрочки. Высокоуровневое приложение отвечает за управление отсрочкой обновления от имени RTApps на устройстве.

Требования к отсрочке

Приложения, в которых откладываются обновления, должны содержать соответствующие файлы заголовков. Кроме того, параметры откладывания должны быть включены в соответствующий манифест приложения.

Файлы заголовков

Включите заголовки eventloop и sysevent в свой проект:

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

Параметры в манифесте приложения

Чтобы получать уведомления о событиях обновления программного обеспечения и иметь возможность отложить такие обновления, приложение содержит две возможности в файле манифеста приложения:

  • SystemEventNotifications
  • SoftwareUpdateDeferral

Установите для параметра SystemEventNotifications значение true в файле app_manifest.json, чтобы получать уведомления о событиях обновления системы. Приложение также должно зарегистрироваться для получения уведомлений о событиях, как описано в разделе Механизм уведомлений. Установите для параметра SoftwareUpdateDeferral значение true, чтобы приложение могло откладывать и возобновлять обновления.

Ниже приведены параметры в файле app_manifest.json, необходимые для включения уведомлений и отсрочки.

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

Механизм уведомлений

Azure Sphere поддерживает отсрочку обновления через механизм уведомлений о событиях и цикл обработки событий. Приложение создает однопоточный объект EventLoop, через который оно получает уведомления об ожидающих событиях.

Чтобы получать уведомления, приложение вызывает SysEvent_RegisterForEventNotifications, передавая следующие параметры:

  • указатель на цикл событий;
  • параметр eventBitmask, указывающий события, для которых приложение запрашивает уведомления;
  • указатель на определяемую приложением функцию обратного вызова;
  • необязательный указатель контекста, который передается в обратный вызов.

Только один объект EventLoop может использоваться с SysEvent_RegisterForEventNotifications на один поток. Второй вызов SysEvent_RegisterForEventNotifications с другим объектом EventLoop завершится сбоем.

После регистрации приложение вызывает функцию EventLoop_Run, которая вызывает функцию обратного вызова, если событие изменило состояние. Функция обратного вызова получает значение SysEvent_Events, которое определяет тип события. Обратный вызов, в свою очередь, вызывает SysEvent_Info_GetUpdateData, чтобы выяснить, является ли событие обновлением ОС или приложения и на какой период его можно отложить. Затем приложение может определить способ обработки уведомления о событиях.

Azure Sphere может отправлять несколько уведомлений о состоянии для каждого события обновления:

Состояние Description
SysEvent_Status_Pending 10-секундное предупреждение о том, что возникнет событие обновления с возможностью отсрочки.
SysEvent_Status_Final 10-секундное предупреждение о том, что возникнет событие обновления без возможности отсрочки.
SysEvent_Status_Deferred Ранее ожидаемое событие было отложено и будет выполнено позже.
SysEvent_Status_Complete Процесс обновления программного обеспечения завершен. Это уведомление о событии отправляется только для обновлений приложения.

Приложение может запросить отсрочку только после того, как будет получено уведомление SysEvent_Status_Pending. Чтобы обновление выполнялось немедленно, приложение может игнорировать уведомление.

Чтобы отложить обновление, приложение вызывает SysEvent_DeferEvent, передавая количество минут для отсрочки обновления. Для обновления ОС максимальная отсрочка составляет 1440 минут (24 часа). Для обновления приложения максимальный период отсрочки составляет 10 020 минут (167 часов).

Приложение может преждевременно завершить отсрочку обновления, вызвав SysEvent_ResumeEvent. Для обновления приложения или ОС успешный вызов SysEvent_ResumeEvent перезапускает процесс уведомления и, таким образом, отправляет новое уведомление SysEvent_Status_Pending. Приложение не должно снова вызывать SysEvent_DeferEvent, пока не получит такое уведомление.

Когда приложение получает уведомление SysEvent_Status_Final , оно должно подготовиться к получению сигнала SIGTERM от ОС Azure Sphere. При получении сигнала SIGTERM приложение должно выполнить окончательную очистку и выход. Приложение не должно выйти до получения SIGTERM; в противном случае его можно перезапустить до отправки SIGTERM. Для обновления ОС приложение должно выполнить необходимую очистку перед перезагрузкой устройства. Для обновления приложения высокоуровневое приложение должно выполнить все необходимые операции, прежде чем оно или любое другое приложение на устройстве будет перезапущено. В уведомлении приложения сейчас не указывается, какое приложение обновляется.

Когда уведомление больше не требуется, приложение должно вызвать SysEvent_UnregisterForEventNotifications, а затем EventLoop_Close, чтобы освободить память, выделенную для объекта цикла событий. Обратите внимание: после того как регистрация всех уведомлений о событиях была отменена, приложение может использовать новый объект EventLoop.