在高階應用程式中管理系統時間和 RTC

RTC (系統時鐘) 用來在裝置電力中斷且裝置重新開機後無法存取網路連線時,在 Azure 球體裝置上保留時間。 這樣一來,即使裝置無法存取 NTP 伺服器,也能在電源中斷期間維護時間。

如果您設定系統時間,當裝置斷電時,系統不會持續使用。 若要在斷電期間持續使用時間,您必須呼叫 Applibs 函 數clock_systohc。 當clock_systohc稱為時,系統時間會推送到 RTC。

RTC 需求

使用 RTC 的應用程式必須包含適當的頁首檔案,並將 RTC 設定新增至 應用程式資訊清單

頁首檔案

在專案中包含 rtc 頁首:

 #include <applibs\rtc.h>

應用程式資訊清單設定

若要使用 RTC 和標準時鐘 API,您必須將應用程式功能新 SystemTime 增至應用程式資訊清單,然後將值設為 trueAzure 球體應用程式資訊清單 具有更多有關應用程式資訊清單的詳細資料。

{
  "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 球體圖庫的一部分,它是未相關腳本、公用程式和函數的集合。

Azure 球體 OS 支援 TZ 環境變數的部分,但並非所有可能的格式:

  • 您可以設定目前時區,包含或不含日光節約時間 (DST) 。 範例:「EST+5」、「EST+5EDT」。 如果本機時區是 Meridian 主要的西部,且如果是東部,則此值為正值。
  • 您無法指定 DST 生效的日期和時間。
  • 您無法指定時區檔案/資料庫。

若要在電源中斷期間維護時區設定,您可以使用 可靜音儲存空間 將時區儲存在持續性儲存空間中,然後在裝置重新開機時回收設定。

指定 NTP 伺服器

NTP 用戶端服務可以設定為從多個來源取得時間。 預設的時間來源是 prod.time.sphere.azure.net ,如 Azure 球體 OS 網路需求中所述。

NTP 用戶端每 15 秒會嘗試同步處理一次,直到同步處理成功為止。 成功同步處理時間之後,它會嘗試每 24 小時重新同步處理一次時間。 當 Azure 球體執行時間同步處理時,會先使用 32678-61000 之間的隨機 UDP 用戶端來源埠。 如果此埠失敗,Azure 球體會嘗試使用埠 124 做為 UDP 用戶端來源埠。

您可以指定系統從 DHCP 伺服器取得時間,也可以透過 Networking_TimeSync_EnableCustomNTPNetworking_TimeSync_EnableDefaultNtp 函數指定應用程式中的時間來源。

如果設定為使用 DHCP 做為時間伺服器來源,Azure 球體會處理 DHCP 選項 042,而 NTP 用戶端只會處理 DHCP 選項中傳送的前兩個專案,且應依喜好設定列出。 這些伺服器將被視為主要伺服器和次要伺服器。

如果您想要透過應用程式指定主要和次要時間伺服器,也可以透過 Networking_TimeSync_EnableCustomNTP 設定時間伺服器。 每次伺服器完整功能變數名稱 (FQDN) 的長度上限為 255 個字元。

後備

  • 如果 NTP 用戶端設定為透過 DHCP 或 API 取得時間伺服器,則需要額外的參數來指定後援行為。

  • 用戶端會先嘗試連絡主要時間伺服器。 如果用戶端無法取得有效的時間伺服器回應,它會嘗試次要時間伺服器 (如果指定) 。

  • 如果指定次要時間伺服器時失敗,或是無法回復到作業系統預設 Networking_NtpOption_FallbackServerEnabled 值的選項,則系統會連絡預設的作業系統時間來源 prod.time.sphere.azure.net。

    • 在接下來的 24 小時同步處理間隔中,作業系統會返回並嘗試查詢主要時間伺服器。
  • 如果您指定 Networking_NtpOption_FallbackServerDisabled,作業系統會每 15 秒繼續查詢主要和次要伺服器,直到成功與其中一個時間伺服器同步處理為止。

多重連線裝置

時間伺服器設定是全域設定,而不是每個介面設定。 如果 Azure 球體裝置已多重連線,且兩個介面都透過 DHCP 取得 NTP 伺服器資訊,則最近處理的 DHCP NTP 選項組會優先。

系統時間範例

[系統時間] 範例示範如何管理系統時間及使用硬體 RTC。 範例應用程式會設定系統時間,然後使用該 clock_systohc 函數來同步處理系統時間與 RTC。

SetTimeFromLocation專案示範如何使用反向 IP 查閱取得位置資訊,然後取得位置時間,以及設定裝置時間。 此專案是 Azure 球體圖庫的一部分,它是未相關腳本、公用程式和函數的集合。

自訂 NTP 樣本

自訂 NTP 範例示範如何設定 NTP 用戶端服務以從多個來源取得時間。