【ESP8266】使用SNTP接口获取时间

在ESP8266给出的官方文档中,提到了SNTP接口,主要有以下函数:


sntp_setserver
功能:通过 IP 地址设置 SNTP 服务器,一共最多支持设置 3 个 SNTP 服务器。
函数定义:void sntp_setserver(unsigned char idx, ip_addr_t *addr)
参数:
unsigned char idx :SNTP 服务器编号,最多⽀持3个 SNTP 服务器(0~2);0 号为主服务器,1号和2 号为备用服务器。
ip_addr_t *addr :IP 地址;用户需自行确保,传入的是合法SNTP服务器。
返回:无

sntp_setservername
功能:通过域名设置 SNTP 服务器,一共最多支持设置 3 个 SNTP 服务器。
函数定义:void sntp_setservername(unsigned char idx, char *server)
参数:
unsigned char idx :SNTP 服务器编号,最多⽀持3个SNTP服务器(0 ~ 2);0号为主服务器,1号和2号为备用服务器。
char *server :域名;用户需自行确保,传入的是合法 SNTP 服务器。
返回:无

sntp_init
功能:SNTP 初始化
函数定义:void sntp_init(void)
参数:无
返回:无

sntp_stop
功能:SNTP 关闭
函数定义:void sntp_stop(void)
参数:无
返回:无

sntp_get_current_timestamp
功能:查询当前距离基准时间( 1970.01.01 00: 00: 00 GMT + 8)的时间戳,单位:秒
函数定义:uint32 sntp_get_current_timestamp()
参数:无
返回:距离基准时间的时间戳


sntp_get_real_time
功能:查询实际时间( GMT + 8)
函数定义:char* sntp_get_real_time(long t)
参数:long t - 与基准时间相距的时间戳
返回:实际时间


在ESP8266上使用STNP也非常简单,上代码:

#include "ets_sys.h"
#include "osapi.h"
#include "user_interface.h"
//#include "ip_addr.h"
//#include "user_wifi_event.h"

os_timer_t sntp_read_timer;
void ICACHE_FLASH_ATTR
sntp_read_timer_callback(void *arg)
{
	uint32_t time = sntp_get_current_timestamp();
	os_printf("time:%d\r\n",time);
	os_printf("date:%s\r\n",sntp_get_real_time(time));
}

void ICACHE_FLASH_ATTR
my_sntp_init(void)
{
	sntp_setservername(0,"0.cn.pool.ntp.org");
	sntp_setservername(1,"1.cn.pool.ntp.org");
	sntp_setservername(2,"2.cn.pool.ntp.org");
	sntp_init();

	os_timer_disarm(&sntp_read_timer);
	os_timer_setfn(&sntp_read_timer, sntp_read_timer_callback , NULL);
	os_timer_arm(&sntp_read_timer,5000,1);
}



user_sntp_init函数首先设置3个STNP的服务器,然后调用sntp_init函数初始化,最后设置一个定时器,每5秒从SNTP接口获取时间并打印出来,打印效果如下:


……

time:1461851702
date:Thu Apr 28 13:55:02 2016

time:1461851707
date:Thu Apr 28 13:55:07 2016

time:1461851712
date:Thu Apr 28 13:55:12 2016

time:1461851717
date:Thu Apr 28 13:55:17 2016

time:1461851722
date:Thu Apr 28 13:55:22 2016
……


另外要注意一些事项:

1、ESP8266要联网。

2、sntp初始化有一定的时间,所以第一次打印时可能会出现「please start sntp first !」警告,等sntp初始化完成了就正常了。

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: ESP8266是一种低成本、高性能的Wi-Fi芯片,广泛应用于物联网(IoT)领域。SNTP(Simple Network Time Protocol)是一种基于UDP协议的时间同步协议,在物联网设备中具有重要的应用价值。 ESP8266通过SNTP协议与互联网中的时间服务器通信,获得准确的时间戳。这些时间戳可用于日志记录、事件触发、时间截止等应用场景。 SNTP协议本身非常简单,可以使用ESP8266的标准库集成到程序中。通过WiFi连接到局域网或互联网后,ESP8266可以与指定的时间服务器同步,获取与本地时间的时间差。为了准确,ES8266通常使用多个时间服务器进行同步,并进行平均计算。 值得注意的是,SNTP协议是基于UDP协议的,因此无法保证在传输过程中的可靠性。为了解决这个问题,ESP8266通常会定期进行时间同步,以保证时间准确性。当然,若是在时间同步失败的情况下采用短时间运行,错误也会相应地累积。因此,一些特殊的应用场景需要采用GPS等时间同步手段来确保时间的准确性。 总之,ESP8266通过SNTP协议可以快速、准确地获取互联网上的时间戳,因此在物联网设备的时间同步方面拥有巨大的应用潜力。 ### 回答2: ESP8266是一款低成本的Wi-Fi芯片,可以方便的接入互联网。SNTP(Simple Network Time Protocol)是一种简单的网络时间协议,用于同步网络设备的时间。 在ESP8266中,可以使用SNTP协议来同步设备的时间。通过连接SNTP服务器,ESP8266可以获取世界标准时间,并将其与本地时间进行比较和更新。这非常有用,因为设备的时间通常需要与其他设备同步,以便它们可以协调它们的操作。 ESP8266支持SNTP协议的库如下: • sntp.h • sntp.c 这些库可以在ESP8266的开发环境中进行安装和使用使用这些库,可以轻松地与SNTP服务进行通信,以便同步设备的时间。在使用这些库时,用户需要提供SNTP服务器的IP地址和端口号。然后,ESP8266会连接到服务器并获取当前的时间。 SNTP协议的一个重要特点是具有低带宽和延迟。这使得设备可以在非常低的成本和能耗下同步时间。由于ESP8266的能源需求非常低,因此使用SNTP协议进行时间同步是非常有效的方法。这使得ESP8266成为物联网设备设计的首选芯片之一。 ### 回答3: ESP8266是一款高性能、低功耗、易于开发的Wi-Fi芯片,可以通过SNTP协议进行时间同步。SNTP(Simple Network Time Protocol)是NTP协议的简化版本,用于进行网络时间同步。 在ESP8266使用SNTP进行时间同步,需要先通过WiFi连接到网络。然后,使用SNTP协议向NTP服务器请求时间信息,并将服务器返回的时间设定为ESP8266的系统时间。这个过程可以使用ESP8266自带的API实现,也可以使用第三方库完成。 使用SNTP同步时间有很多好处,其中最主要的就是可以保证设备时间的准确性。在一些需要高精度时间的应用场景,比如金融、物流等领域,时间同步显得尤为关键。 总之,ESP8266虽然是一款小巧的芯片,但它拥有丰富的功能和强大的性能,可以为各种物联网应用提供稳定可靠的支持。SNTP协议则是保证ESP8266时间准确性的重要手段之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值