全部產品
Search
文件中心

IoT Platform:使用樣本

更新時間:Jun 30, 2024

./demos/ntp_posix_demo.c使裝置從物聯網平台擷取UTC時間。

背景資訊

  • NTP服務功能的更多資訊,請參見概述

  • NTP服務功能基於MQTT接入,開發過程中涉及MQTT接入的代碼說明,請參見MQTT接入

步驟一:初始化

  1. 添加標頭檔。
    ……
    ……
    
    #include "aiot_ntp_api.h"

  2. 配置底層依賴和日誌輸出。

        aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb);
  3. 調用aiot_ntp_init,建立NTP
        ntp_handle = aiot_ntp_init();
        if (ntp_handle == NULL) {
            demo_mqtt_stop(&mqtt_handle);
            printf("aiot_ntp_init failed\n");
            return -1;
        }

步驟二:配置功能

調用aiot_ntp_setopt,配置以下功能。

  1. 關聯MQTT串連的控制代碼。
    重要 配置NTP服務參數前,請確保已配置裝置認證資訊等相關參數。具體操作,請參見MQTT配置串連參數
    •     aiot_ntp_setopt(ntp_handle, AIOT_NTPOPT_MQTT_HANDLE, mqtt_handle);
    • 配置項樣本說明
      AIOT_NTPOPT_MQTT_HANDLEmqtt_handleNTP服務功能的請求基於MQTT串連,通過該配置項,關聯MQTT串連控制代碼。

  2. 設定時區。
    •     int8_t      time_zone = 8;
          ……
          ……
          aiot_ntp_setopt(ntp_handle, AIOT_NTPOPT_TIME_ZONE, (int8_t *)&time_zone);
    • 配置項樣本說明
      AIOT_NTPOPT_TIME_ZONEtime_zone裝置所在時區。

      範例程式碼定義的時區為time_zone=8,設定裝置的時區為東八區,即北京時間。

      通過設定time_zone的值,設定裝置所在的時區。取值範圍:-12~12。例如,-3為西三區。

  3. 配置訊息回調。
    •     aiot_ntp_setopt(ntp_handle, AIOT_NTPOPT_RECV_HANDLER, (void *)demo_ntp_recv_handler);
    • 配置項樣本值說明
      AIOT_NTPOPT_RECV_HANDLERdemo_ntp_recv_handler接收到NTP服務訊息時,調用該函數。

    1. void demo_ntp_event_handler(void *handle, const aiot_ntp_event_t *event, void *userdata)
      {
          switch (event->type) {
              case AIOT_NTPEVT_INVALID_RESPONSE: {
                  printf("AIOT_NTPEVT_INVALID_RESPONSE\n");
              }
              break;
              case AIOT_NTPEVT_INVALID_TIME_FORMAT: {
                  printf("AIOT_NTPEVT_INVALID_TIME_FORMAT\n");
              }
              break;
              default: {
      
              }
          }
      }


      •     aiot_ntp_setopt(ntp_handle, AIOT_NTPOPT_EVENT_HANDLER, (void *)demo_ntp_event_handler);
      • 配置項樣本值說明
        AIOT_NTPOPT_EVENT_HANDLERdemo_ntp_event_handler

        當裝置串連狀態發生變化時,根據該回呼函數定義的處理邏輯,執行對應的處理。


步驟三:發送請求

調用aiot_ntp_send_request,根據上一步配置的參數,通過Topic /ext/ntp/${YourProductKey}/${YourDeviceName}/request,向伺服器發送一條包含裝置目前時間的請求訊息。

Link SDK通過系統介面,自動上報裝置目前時間。

    res = aiot_ntp_send_request(ntp_handle);
    if (res < STATE_SUCCESS) {
        aiot_ntp_deinit(&ntp_handle);
        demo_mqtt_stop(&mqtt_handle);
        return -1;
    }

步驟四:接收應答

裝置接收NTP服務訊息後,觸發回呼函數demo_ntp_recv_handler,根據回呼函數的設定,執行對應處理。

您可以參考以下內容,編寫回呼函數的處理邏輯:
  • 物聯網平台通過Topic /ext/ntp/${YourProductKey}/${YourDeviceName}/response向裝置發回一條包含時間內容的訊息。

  • 時間訊息的資料結構類型為aiot_ntp_recv_t,可參考範例程式碼擷取時間。
  • 本文範例程式碼對返回的訊息解析處理後,通過packet傳遞,列印該時間訊息。

void demo_ntp_recv_handler(void *handle, const aiot_ntp_recv_t *packet, void *userdata)
{
    switch (packet->type) {
        /* TODO: 含當前時區下, 年月日時分秒的數值, 可在這裡把它們解析儲存起來 */
        case AIOT_NTPRECV_LOCAL_TIME: {
            printf("local time: %llu, %02d/%02d/%02d-%02d:%02d:%02d:%d\n",
                   (long long unsigned int)packet->data.local_time.timestamp,
                   packet->data.local_time.year,
                   packet->data.local_time.mon, packet->data.local_time.day, packet->data.local_time.hour, packet->data.local_time.min,
                   packet->data.local_time.sec, packet->data.local_time.msec);
        }
        break;

        default: {

        }
    }
}

步驟五:退出程式

調用aiot_ntp_deinit,銷毀NTP

    res = aiot_ntp_deinit(&ntp_handle);
    if (res < STATE_SUCCESS) {
        demo_mqtt_stop(&mqtt_handle);
        printf("aiot_ntp_deinit failed: -0x%04X\n", -res);
        return -1;
    }

後續步驟