./demos/ntp_posix_demo.c使裝置從物聯網平台擷取UTC時間。
背景資訊
步驟一:初始化
- 添加標頭檔。
…… …… #include "aiot_ntp_api.h" 配置底層依賴和日誌輸出。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);- 調用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,配置以下功能。
- 關聯MQTT串連的控制代碼。重要 配置NTP服務參數前,請確保已配置裝置認證資訊等相關參數。具體操作,請參見MQTT配置串連參數。
aiot_ntp_setopt(ntp_handle, AIOT_NTPOPT_MQTT_HANDLE, mqtt_handle);配置項 樣本 說明 AIOT_NTPOPT_MQTT_HANDLE mqtt_handle NTP服務功能的請求基於MQTT串連,通過該配置項,關聯MQTT串連控制代碼。
- 設定時區。
int8_t time_zone = 8; …… …… aiot_ntp_setopt(ntp_handle, AIOT_NTPOPT_TIME_ZONE, (int8_t *)&time_zone);配置項 樣本 說明 AIOT_NTPOPT_TIME_ZONE time_zone 裝置所在時區。 範例程式碼定義的時區為
time_zone=8,設定裝置的時區為東八區,即北京時間。通過設定
time_zone的值,設定裝置所在的時區。取值範圍:-12~12。例如,-3為西三區。
- 配置訊息回調。
aiot_ntp_setopt(ntp_handle, AIOT_NTPOPT_RECV_HANDLER, (void *)demo_ntp_recv_handler);配置項 樣本值 說明 AIOT_NTPOPT_RECV_HANDLER demo_ntp_recv_handler 接收到NTP服務訊息時,調用該函數。
- 。
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_HANDLER demo_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;
}