高度なアプリケーションでシステム時間と RTC を管理する

RTC (リアルタイム クロック) は、デバイスの電源が失われ、デバイスの再起動後にネットワーク接続にアクセスできない場合に、Azure Sphere デバイスの時間を維持するために使用されます。 これにより、デバイスが NTP サーバーにアクセスできない場合でも、電源喪失中に時間を維持できます。

システム時刻を設定した場合、デバイスの電源が失われると、システム時刻は保持されません。 電力損失中に時間を保持するには、Applibs 関数 clock_systohcを呼び出す必要があります。 clock_systohcが呼び出されると、システム時刻が RTC にプッシュされます。

RTC の要件

RTC を使用するアプリケーションには、適切なヘッダー ファイルを含め、 アプリケーション マニフェストに RTC 設定を追加する必要があります。

ヘッダー ファイル

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

 #include <applibs\rtc.h>

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

RTC と標準クロック API を使用するには、アプリケーション機能を SystemTime アプリケーション マニフェストに追加し、値 trueを . Azure Sphere アプリケーション マニフェストには、アプリケーション マニフェスト の詳細が含まれています。

{
  "SchemaVersion": 1,
  "Name" : "Mt3620App3_RTC",
  "ComponentId" : "bb267cbd-4d2a-4937-8dd8-3603f48cb8f6",
  "EntryPoint": "/bin/app",
  "CmdArgs": [],
   "Capabilities": {
    "AllowedConnections": [],
    "AllowedTcpServerPorts": [],
    "AllowedUdpServerPorts": [],
    "HardwareAddressConfig": true,
    "Gpio": [],
    "Uart": [],
    "WifiConfig": false,
    "NetworkConfig": false,
    "SystemTime": true,
    "TimeSyncConfig": true
  }
}

システム時刻を取得する

システム時刻を取得するには、標準 clock_gettime 関数を呼び出します。

システム時刻を設定する

システム時刻を設定するには、標準 clock_settime 関数を呼び出します。

システム時刻を RTC と同期する

システム時刻が設定されている場合、デバイスの電源が失われると、システム時刻は保持されません。 電力損失中に時間を保持するには、Applibs clock_systohc 関数を呼び出します。 clock_systohcが呼び出されると、システム時刻が RTC にプッシュされます。

NTP クライアント サービスを構成する

NTP クライアント サービスは既定で有効になっています。 NTP クライアント サービスが有効になっている間にシステム時刻を設定すると、デバイスにインターネット接続がある UTC 時刻が上書きされます。 NTP クライアント サービスを無効にできます。ただし、システム時刻と NTP サーバー時間の差が大きすぎる場合、デバイスのクラウド更新が失敗する可能性があります。

タイム ゾーンを設定する

システム時刻と RTC 時刻は、GMT/UTC で格納されます。 アプリケーションで使用されるタイム ゾーンを変更するには、関数を setenv 呼び出して TZ 環境変数を更新し、関数を tzset 呼び出します。

SetTimeFromLocation プロジェクトでは、逆引き IP 参照を使用して位置情報を取得し、場所の時刻を取得し、デバイス時刻を設定する方法を示します。 このプロジェクトは、メンテナンスされていないスクリプト、ユーティリティ、関数のコレクションである Azure Sphere ギャラリーの一部です。

Azure Sphere OS では、 TZ 環境変数で使用できる形式の一部がサポートされていますが、すべてではありません。

  • 現在のタイム ゾーンは、夏時間 (DST) の有無にかかわらず設定できます。 例: "EST+5"、"EST+5EDT"。 この値は、ローカル タイム ゾーンが Prime Meridian の西にあり、東の場合は負の値です。
  • DST が有効になる日付と時刻を指定することはできません。
  • タイム ゾーン ファイル/データベースを指定することはできません。

電源喪失中にタイム ゾーンの設定を維持するには、 変更可能なストレージ を使用して永続ストレージにタイム ゾーンを格納し、デバイスが再起動したときに設定を思い出すことができます。

NTP サーバーの指定

NTP クライアント サービスは、複数のソースから時間を取得するように構成できます。 既定の時間ソースは、 prod.time.sphere.azure.netAzure Sphere OS のネットワーク要件に関する記事に示されているようにです。

NTP クライアントは、同期が成功するまで 15 秒ごとに時刻を同期しようとします。 時間の同期が正常に完了すると、24 時間ごとに時刻の再同期が試行されます。 Azure Sphere で時刻同期が実行されると、最初に 32678 から 61000 の間でランダムな UDP クライアント ソース ポートが使用されます。 このポートが失敗した場合、Azure Sphere は UDP クライアントソース ポートとしてポート 124 を使用しようとします。

システムが DHCP サーバーから時刻を取得することを指定することも、 Networking_TimeSync_EnableCustomNTPまたはNetworking_TimeSync_EnableDefaultNTP を使用してアプリケーションの時刻ソース 指定することもできます。

タイム サーバー ソースに DHCP を使用するように構成されている場合、Azure Sphere は DHCP オプション 042 を処理し、NTP クライアントは DHCP オプションで送信された最初の 2 つのエントリのみを処理します。これは優先順に一覧表示されます。 これらはプライマリ サーバーとセカンダリ サーバーと見なされます。

アプリケーションを使用してプライマリ タイム サーバーとセカンダリ タイム サーバーを指定する場合は、 Networking_TimeSync_EnableCustomNTP を使用してタイム サーバーを構成することもできます。 サーバー完全修飾ドメイン名 (FQDN) の最大長は 255 文字です。

フォールバック

  • NTP クライアントが DHCP または API を介してタイム サーバーを取得するように構成されている場合は、フォールバック動作を指定するために追加のパラメーターが必要です。

  • クライアントは、最初にプライマリ タイム サーバーへの接続を試みます。 クライアントが有効なタイム サーバー応答を取得できない場合は、セカンダリ タイム サーバー (指定されている場合) が試行されます。

  • セカンダリ タイム サーバーが指定されていて失敗した場合、または OS の既定値 Networking_NtpOption_FallbackServerEnabled にフォールバックするオプションが失敗した場合、システムは既定の OS タイム ソース prod.time.sphere.azure.net に接続します。

    • 次の 24 時間の時刻同期間隔で、OS は戻ってプライマリ タイム サーバーに対するクエリを試行します。
  • Networking_NtpOption_FallbackServerDisabledを指定した場合、OS は、いずれかのタイム サーバーと正常に同期されるまで、プライマリ サーバーとセカンダリ サーバーに対して 15 秒ごとにクエリを実行し続けます。

マルチホーム デバイス

タイム サーバー設定は、インターフェイスごとの設定ではなく、グローバル設定です。 Azure Sphere デバイスがマルチホームであり、両方のインターフェイスが DHCP 経由で NTP サーバー情報を取得する場合は、最後に処理された DHCP NTP オプションセットが優先されます。

システム時刻のサンプル

System Time サンプルは、システム時刻を管理し、ハードウェア RTC を使用する方法を示しています。 サンプル アプリケーションはシステム時刻を設定し、関数を clock_systohc 使用してシステム時刻を RTC と同期します。

SetTimeFromLocation プロジェクトでは、逆引き IP 参照を使用して位置情報を取得し、場所の時刻を取得し、デバイス時刻を設定する方法を示します。 このプロジェクトは、メンテナンスされていないスクリプト、ユーティリティ、関数のコレクションである Azure Sphere ギャラリーの一部です。

カスタム NTP サンプル

カスタム NTP サンプルは、複数のソースから時刻を取得するように NTP クライアント サービスを構成する方法を示しています。