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 Gallery の一部であり、管理されていないスクリプト、ユーティリティ、および関数のコレクションです。
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 オプション セットが優先されます。
システム時間のサンプル
System Time サンプルは、システム時刻を管理し、ハードウェア RTC を使用する方法を示しています。 サンプル アプリケーションでは、システム時刻を設定し、 clock_systohc 関数を使用して、システム時刻を RTC と同期します。
SetTimeFromLocation プロジェクトでは、逆引き IP 参照を使用して位置情報を取得し、場所の時刻を取得し、デバイスの時刻を設定する方法を示します。 このプロジェクトは、Azure Sphere Gallery の一部であり、管理されていないスクリプト、ユーティリティ、および関数のコレクションです。
カスタム NTP サンプル
Custom NTP サンプルは、複数のソースから時刻を取得するように NTP クライアント サービスを構成する方法を示しています。