1. 程式人生 > >ESP32的SDK開發之獲取SNTP網路時間

ESP32的SDK開發之獲取SNTP網路時間

    連線網路後,通常需要獲取網路時間,大部分情況下是通過訪問pool.ntp.org伺服器獲取,官網點這裡

pool.ntp.org 是一個以時間伺服器的大虛擬叢集為上百萬的客戶端提供可靠的易用的網路時間協議(NTP)服務的專案NTP池正在為世界各地成百上千萬的系統提供服務。 它是絕大多數主流Linux發行版和許多網路裝置的預設“時間伺服器” 。每個地區都會有不同的訪問地址。

阿拉伯聯合大公國 ae.pool.ntp.org (2) 阿富汗 af.pool.ntp.org
亞美尼亞 am.pool.ntp.org (5) 亞塞拜然 az.pool.ntp.org (1)
 孟加拉國  bd.pool.ntp.org(2) 巴林  bh.pool.ntp.org(0)
bn.pool.ntp.org(0) 不丹 bt.pool.ntp.org(0)
cc.pool.ntp.org(0) 中國  cn.pool.ntp.org(48)
聖誕島  cx.pool.ntp.org(0) 塞普勒斯 cy.pool.ntp.org( 3)
喬治亞 ge.pool.ntp.org(2) 香港 hk.pool.ntp.org(12)
印度尼西亞  id.pool.ntp.org(21) 以色列 il.pool.ntp.org(0)
印度  in.pool.ntp.org(3) io.pool.ntp.org(0)
伊拉克 iq.pool.ntp.org(2) 伊朗 ir.pool.ntp.org(10)
約旦 jo.pool.ntp.org(0) 日本 jp.pool.ntp.org(45)
kg.pool.ntp.org(1) 柬埔寨 kh.pool.ntp.org(2)
韓國  kp.pool.ntp.org(0) 科威特 kw.pool.ntp.org(0)
哈薩克  kz.pool.ntp.org(2) la.pool.ntp.org(1)
黎巴嫩 lb.pool.ntp.org(0) 斯里蘭卡 lk.pool.ntp.org(2)
緬甸 mm.pool.ntp.org(1) 蒙古  mn.pool.ntp.org(0)
澳門 mo.pool.ntp.org(1) 馬爾地夫 mv.pool.ntp.org(5)
馬來西亞 my.pool.ntp.org(1) 尼泊爾 np.pool.ntp.org(0)
阿曼  om.pool.ntp.org(0) 菲律賓 ph.pool.ntp.org(4)
巴基斯坦 pk.pool.ntp.org(1) ps.pool .ntp.org(0)
卡達 qa.pool.ntp.org(0) 沙烏地阿拉伯 sa.pool.ntp.org(4)
新加坡 sg.pool.ntp.org(47) sy.pool.ntp.org(0)
泰國 th.pool.ntp.org(7) 塔吉克 tj.pool.ntp.org(0)
帝汶 tl.pool.ntp.org(0) 土庫曼  tm.pool.ntp.org(0)
臺灣 tw.pool.ntp.org(14) uz.pool.ntp.org(3)
越南 vn.pool.ntp.org(3) 葉門 ye.pool.ntp.org(0)

NTP.ORG.cn中國NTP授時快速域名服務提供商

新加坡 sgp.ntp.org.cn 韓國 kr.ntp.org.cn
中國 cn.ntp.org.cn 中國教育網 edu.ntp.org.cn
中國香港 hk.ntp.org.cn 中國臺灣 tw.ntp.org.cn
美國 us.ntp.org.cn 韓國 kr.ntp.org.cn
日本 jp.ntp.org.cn 德國 de.ntp.org.cn
印度尼西亞 ina.ntp.org.cn

ESP32軟體實現:

呼叫initialize_sntp()初始化後,最好延時5S後再去訪問獲取網路時間,等待SNTP初始化完成。

要點:

1、NTP伺服器提供商:暫時找到2個,前面的“cn”表示中國地區

      國外提供商: 只能配合CST-8時區    

cn.pool.ntp.org

    中國提供商:配合CST-8時區  和GMT+8時區

cn.ntp.org.cn

2、時區:

      CST-8:這時區的表示有點混

CST卻同時可以代表如下 4 個不同的時區:              Central Standard Time (USA) UT-6:00             Central Standard Time (Australia) UT+9:30             China Standard Time UT+8:00             Cuba Standard Time UT-4:00 

      GMT:(Greenwich Mean Time)是格林尼治平時

             GMT+8正好是中國的標準時區


void initialize_sntp(void)
{
    ESP_LOGI(TAG, "------------Initializing SNTP");
    sntp_setoperatingmode(SNTP_OPMODE_POLL);
//    sntp_setservername(0, "cn.pool.ntp.org");	//設定訪問伺服器	國外提供商
    sntp_setservername(0, "cn.ntp.org.cn");	//設定訪問伺服器	中國提供商

    sntp_init();
    // Set timezone to China Standard Time
//    setenv("TZ", "CST-8", 1);
    setenv("TZ", "GMT+8", 1);
    tzset();
}

struct tm getNowTime(void)
{
	time_t now = 0;
    struct tm timeinfo = { 0 };
    char strftime_buf[72];

    time(&now);	//獲取網路時間, 64bit的秒計數
    localtime_r(&now, &timeinfo);	//轉換成具體的時間引數
//    strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
    ESP_LOGI(TAG, "-------當前時間:%d:%d:%d:%d:%d:%d:%d:%d:%d",
    		timeinfo.tm_isdst, timeinfo.tm_yday,
			timeinfo.tm_wday, timeinfo.tm_year,
			timeinfo.tm_mon, timeinfo.tm_mday,
			timeinfo.tm_hour, timeinfo.tm_min,
			timeinfo.tm_sec);
    strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
    ESP_LOGI(TAG, "The current date/time in New York is: %s", strftime_buf);
	return timeinfo;
}

時間引數:

struct tm
{
  int	tm_sec;    //秒鐘
  int	tm_min;    //分鐘
  int	tm_hour;    //小時
  int	tm_mday;    //日期:日,從1開始
  int	tm_mon;    //日期:月,從0開始
  int	tm_year;    //年,距離1900年的差值,預設是70
  int	tm_wday;    //星期,1對應星期一
  int	tm_yday;    //一年的過去的天數
  int	tm_isdst;    //是否為夏時制
#ifdef __TM_GMTOFF
  long	__TM_GMTOFF;
#endif
#ifdef __TM_ZONE
  const char *__TM_ZONE;
#endif
};

專案中判斷是否成功獲取了網路時間可以判斷tm_year是否為70.