デバイスの更新プログラムを延期する

高レベルのアプリケーションでは、Azure Sphere OS とアプリケーション イメージの更新を一時的に延期して、更新によって重要な処理が中断されないようにすることができます。 たとえば、キッチン アプライアンスの Azure Sphere デバイスは、使用中に更新プログラムを延期する可能性があります。 更新プログラムを延期する機会を得るために、アプリは更新通知を登録します。 OS が更新プログラムをダウンロードすると、アプリケーションに通知されます。これにより、更新と要求の遅延に関する詳細を取得できます。

遅延更新のサンプルは、イベント ループとシステム イベントを使用して更新プログラムを延期する方法を示しています。

リアルタイム対応アプリケーション (RTApps) は、更新通知を受け取ったり、遅延を要求したりすることはできません。 高度なアプリは、デバイス上の RTApps に代わって更新プログラムの遅延を管理する役割を担います。

遅延要件

更新プログラムを延期するアプリケーションには、適切なヘッダー ファイルを含め、遅延設定を アプリケーション マニフェストに追加する必要があります。

ヘッダー ファイル

プロジェクトに eventloop ヘッダーと sysevent ヘッダーを含めます。

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

アプリケーション マニフェストの設定

ソフトウェア更新イベントに関する通知を受け取り、そのような更新プログラムを延期する機会を得るために、アプリケーションにはアプリケーション マニフェスト ファイルに次の 2 つの機能が含まれています。

  • SystemEventNotifications
  • SoftwareUpdateDeferral

システム更新イベントの通知をtrue受信するには、app_manifest.json ファイルの SystemEventNotifications フィールドを に設定します。 また、「 通知メカニズム」で説明されているように、アプリケーションはイベント通知に登録する必要もあります。 [SoftwareUpdateDeferral] を にtrue設定して、アプリが更新プログラムを延期および再開できるようにします。

通知と遅延の両方を有効にするために必要なapp_manifest.json 設定を次に示します。

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

通知メカニズム

Azure Sphere では、イベント通知とイベント ループ メカニズムを使用した更新の延期がサポートされています。 アプリケーションは、 を EventLoop作成します。これは、アプリケーションが保留中のイベントを通知するシングル スレッド オブジェクトです。

通知を受け取るために、アプリは SysEvent_RegisterForEventNotificationsを呼び出し、次のパラメーターを渡します。

  • イベント ループへのポインター
  • アプリが通知を要求するイベントを指定する 。eventBitmask
  • アプリ定義コールバック関数へのポインター
  • コールバックに渡される省略可能なコンテキスト ポインター

スレッドごとにSysEvent_RegisterForEventNotificationsで使用できるオブジェクトは 1 EventLoop つだけです。 別EventLoopのオブジェクトを持つSysEvent_RegisterForEventNotificationsへの 2 回目の呼び出しは失敗します。

登録後、アプリケーションは 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 オブジェクトを使用できることに注意してください。