Отложить обновления устройств

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

В примере отложенного обновления показано, как использовать цикл событий и системные события для отсрочки обновлений.

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

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

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

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

Включите в проект заголовки 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 указывающий события, для которых приложение запрашивает уведомление.
  • Указатель на определяемую приложением функцию обратного вызова
  • Необязательный указатель контекста, который передается обратному вызову

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

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

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

Статус Описание
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 объект.