高度なアプリケーションでシステム時間と 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 クライアント サービスは、複数のソースから時間を取得するように構成できます。 Azure Sphere OS ネットワーク要件で説明されているように、既定のタイム ソースは prod.time.sphere.azure.net
です。
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 文字です。
フォールバック
DHCP または API を使用してタイム サーバーを取得するように NTP クライアントが構成されている場合は、フォールバック動作を指定するために追加のパラメーターが必要です。
クライアントは最初にプライマリ タイム サーバーへの接続を試みます。 クライアントが有効なタイム サーバー応答を取得できない場合は、セカンダリ タイム サーバー (指定されている場合) が試行されます。
セカンダリ タイム サーバーが指定されていて失敗した場合、または を使用して
Networking_NtpOption_FallbackServerEnabled
OS の既定値にフォールバックするオプションが失敗した場合、システムは既定の OS タイム ソース prod.time.sphere.azure.net に接続します。- 次の 24 時間の同期間隔で、OS は戻り、プライマリ タイム サーバーのクエリを試行します。
Networking_NtpOption_FallbackServerDisabledを指定した場合、OS は、いずれかのタイム サーバーと正常に同期されるまで、15 秒ごとにプライマリ サーバーとセカンダリ サーバーに対してクエリを実行し続けます。
マルチホーム デバイス
タイム サーバーの設定はグローバル設定であり、インターフェイスごとの設定ではありません。 Azure Sphere デバイスがマルチホームで、両方のインターフェイスが DHCP 経由で NTP サーバー情報を取得する場合は、最近処理された DHCP NTP オプション セットが優先されます。
システム時刻のサンプル
システム時刻のサンプルは、システム時刻を管理し、ハードウェア RTC を使用する方法を示しています。 サンプル アプリケーションでは、システム時刻を設定し、関数を clock_systohc
使用してシステム時刻を RTC と同期します。
SetTimeFromLocation プロジェクトでは、逆引き IP 参照を使用して位置情報を取得し、場所の時刻を取得し、デバイスの時刻を設定する方法を示します。 このプロジェクトは、メンテナンスされていないスクリプト、ユーティリティ、および関数のコレクションである Azure Sphere ギャラリーの一部です。
カスタム NTP サンプル
カスタム NTP サンプルは、複数のソースから時間を取得するように NTP クライアント サービスを構成する方法を示しています。