ESP32的SDK开发之获取SNTP网络时间

本文介绍了如何在ESP32中使用SDK获取SNTP网络时间,主要涉及NTP服务器pool.ntp.org和NTP.ORG.cn,以及在获取时间时需要注意的时区问题,如CST-8和GMT+8。建议初始化后延迟5秒再获取时间,并在成功获取后调用`sntp_stop()`停止NTP请求,以避免设备重启后的时间获取失败。

 

    连接网络后,通常需要获取网络时间,大部分情况下是通过访问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结束的客户端,下次连接服务器时就会出错

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值