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时区,设置时区为GMT+8时,时间会快8个小时,这里还是不是很明白这里的问题,所有暂时只能配合CST-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();
}
void stopSNTP(void)
{
	sntp_stop();
}
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.

重点:在成功获取了网络时间后,必须调用 sntp_stop(); 停止NTP请求,不然设备重启后会造成获取网络时间失败的现象,大概是服务器时根据心跳时间来删除客户端的,如果不是stop结束的客户端,下次连接服务器时就会出错

你可能感兴趣的:(ESP32)