延迟设备更新
高级应用程序可以暂时延迟对 Azure Sphere OS 和应用程序映像的更新,以防止更新中断关键处理。 例如,厨房设备中的 Azure Sphere 设备可能会在使用过程中延迟更新。 为了有机会延迟更新,应用会注册更新通知。 OS 下载更新后,它会通知应用程序,该应用程序可以获取有关更新的详细信息并请求延迟。
延迟更新示例演示如何使用事件循环和系统事件来延迟更新。
支持实时的应用程序 (RTApps) 无法接收更新通知或请求延迟。 高级应用负责代表设备上的 RTApps 管理更新延迟。
延迟要求
延迟更新的应用程序必须包含相应的头文件,并将延迟设置添加到 应用程序清单。
头文件
在项目中包括 eventloop 和 sysevent 标头:
#include <applibs/eventloop.h>
#include <applibs/sysevent.h>
应用程序清单设置
为了收到有关软件更新事件的通知并有机会延迟此类更新,应用程序 在应用程序清单 文件中包括两项功能:
- SystemEventNotifications
- SoftwareUpdateDeferral
在 app_manifest.json 文件中将 SystemEventNotifications 字段设置为 true
以接收系统更新事件的通知。 应用程序还必须注册事件通知,如 通知机制中所述。 将 SoftwareUpdateDeferral 设置为 , true
使应用能够延迟和恢复更新。
下面显示了启用通知和延迟所需的 app_manifest.json 设置:
"Capabilities": {
"SystemEventNotifications" : true,
"SoftwareUpdateDeferral" : true
}
通知机制
Azure Sphere 支持通过事件通知和事件循环机制进行更新延迟。 应用程序创建一个 EventLoop
,这是一个单线程对象,通过该对象向应用程序通知挂起的事件。
为了接收通知,应用会调用 SysEvent_RegisterForEventNotifications,并传递以下参数:
- 指向事件循环的指针
- 一个
eventBitmask
,指定应用请求通知的事件 - 指向应用定义的回调函数的指针
- 传递给回调的可选上下文指针
每个线程只能将一个 EventLoop
对象用于 SysEvent_RegisterForEventNotifications 。 对具有不同 EventLoop
对象的SysEvent_RegisterForEventNotifications的第二次调用将失败。
注册后,应用程序调用 EventLoop_Run,如果事件状态已更改,则调用回调函数。 回调函数接收 SysEvent_Events 值,该值标识事件的类型。 反过来,回调调用 SysEvent_Info_GetUpdateData ,以确定事件是 OS 更新还是应用程序更新,以及更新可以延迟多长时间。 然后,应用可以确定如何处理事件通知。
Azure Sphere 可能会为每个更新事件发送多个状态通知:
地位 | 描述 |
---|---|
SysEvent_Status_Pending | 10 秒警告,指示将发生更新事件,并有机会延迟。 |
SysEvent_Status_Final | 一个 10 秒警告,指示将发生更新事件,没有延迟的机会。 |
SysEvent_Status_Deferred | 以前挂起的事件已延迟,稍后将发生。 |
SysEvent_Status_Complete | 软件更新过程已完成。 此事件通知仅针对应用程序更新发送。 |
应用只能在收到 SysEvent_Status_Pending 通知后请求延迟。 若要允许立即进行更新,应用程序可以忽略通知。
为了延迟更新,应用程序调用 SysEvent_DeferEvent,传递延迟更新的分钟数。 对于 OS 更新,最大延迟为 1440 分钟 (24 小时) 。 对于应用程序更新,最大延迟时间为 10,020 分钟 (167 小时) 。
应用程序可以通过调用 SysEvent_ResumeEvent 提前结束更新延迟。 对于应用程序或 OS 更新,成功调用 SysEvent_ResumeEvent 会重启通知进程,从而发送新的 SysEvent_Status_Pending 通知。 在收到此类通知之前,应用不应再次调用 SysEvent_DeferEvent 。
当应用程序收到 SysEvent_Status_Final 通知时,它应准备好接收来自 Azure Sphere OS 的 SIGTERM 信号。 收到 SIGTERM 信号后,应用应执行最终清理和退出。 在收到 SIGTERM 之前,应用程序不应退出;否则,可以在发送 SIGTERM 之前重启它。 对于 OS 更新,应用程序应在设备重新启动之前执行所需的任何清理操作。 对于应用程序更新,高级应用程序应在重启设备或任何其他应用程序之前执行任何必要的操作。 应用程序通知当前未指定要更新的应用程序。
当不再需要通知时,应用应调用 SysEvent_UnregisterForEventNotifications ,然后 EventLoop_Close 释放为事件循环对象分配的内存。 请注意,取消注册所有事件通知后,应用可以使用新 EventLoop
对象。