0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用SNTP协议获取ESP8266网络时间

CHANBAEK 来源:嵌入式攻城狮 作者:安迪西 2023-04-18 15:07 次阅读

1. NTP和SNTP协议

NTP是网络时间协议(Network Time Protocol),用来同步网络设备(如PC、手机)的时间的协议

SNTP由 NTP改编而来(简单网络时间协议,Simple NTP)大大简化了 NTP协议,同时也能保证时间达到一定的精确度。在实际应用中,SNTP协议主要被用来同步因特网上计算机的时间

SNTP协议采用客户端/服务器的工作方式,可以采用单播(点对点)或者广播(一点对多点)模式操作。SNTP服务器通过接收 GPS信号或自带的原子钟作为系统的时间基准。单播模式下,SNTP客户端能够通过定期访问 SNTP服务器获得准确的时间信息,用于调整客户端自身所在系统的时间,达到同步时间的目的。广播模式下,SNTP服务器周期性地发送消息给指定的 IP广播地址或者 IP多播地址。SNTP客户端通过监听这些地址来获得时间信息

一些常见的 NTP服务器

  • 最常见的NTP服务器:www.pool.ntp.org/zone/cn
  • 其国内地址为:cn.pool.ntp.org
  • Windows系统上自带的两个:time.windows.com 和 time.nist.gov
  • Mac OS上自带的两个:time.apple.com 和 time.asia.apple.com

图片

2. SNTP接口说明

设置SNTP服务器:通过IP地址设置SNTP服务器,最多支持设置3个

void sntp_setserver(unsigned char idx, ip_addr_t *addr)
//idx 服务器编号,最多⽀持3个(0~2);0为主服务器,1和2为备用
//addr 服务器IP地址;需自行确保传入的是合法SNTP服务器地址

设置SNTP服务器:通过域名设置SNTP服务器,最多支持设置3个

void sntp_setservername(unsigned char idx, char *server)
//idx 服务器编号,最多⽀持3个(0~2);0号为主服务器,1和2号为备用
//server 服务器域名;需自行确保传入的是合法SNTP服务器域名

初始化和关闭SNTP

void sntp_init(void)
void sntp_stop(void)

查询当前距离基准时间(1970.01.01 00:00:00 GMT+8)的时间戳,单位为秒

uint32 sntp_get_current_timestamp()
//返回值:距离基准时间的时间戳

查询实际时间(GMT+8)

char* sntp_get_real_time(long t)
//t 与基准时间相距的时间戳
//返回值:实际时间

3. SNTP功能实现

SNTP功能开发:在 freeRTOS下新建 SNTP任务,实现定时5秒串口打印一次网络时间

任务流程如下示:

图片

实现步骤如下:

ESP8266_RTOS_SDK目录下新建sntp文件夹,把ESP8266开发环境搭建中的 app目录下所有文件拷贝到该文件夹中

在user目录下新建 user_sntp.c文件,并添加如下代码

/*******************user_sntp.c********************************/
char* SntpServerNames[3] ={
"ntp1.aliyun.com",
"ntp2.aliyun.com",
"ntp3.aliyun.com"
};
//ATaskSntp任务
void ATaskSntp( void *pvParameters ){
  STATION_STATUS Status;
  uint32 time;
  do{
    Status = wifi_station_get_connect_status();
    vTaskDelay(100);   
  }while(Status != STATION_GOT_IP);
  printf("task is SNTP
");
  printf("STATION_GOT_IP!
");
  sntp_setservername(0,SntpServerNames[0]);
  sntp_setservername(1,SntpServerNames[1]);
  sntp_setservername(2,SntpServerNames[2]);
  sntp_init();
  for(;;){
    time = sntp_get_current_timestamp();
    if(time){
      printf("current date:%s
",sntp_get_real_time(time));
    }
    vTaskDelay(500);
  }
  vTaskDelete(NULL);
}
//Sntp_init 初始化
void Sntp_init(void){
  xTaskCreate(ATaskSntp, "Sntp", 512, NULL, 4, NULL);
}

在include目录下新建 user_sntp.h文件,并添加声明

void ATaskSntp(void *pvParameters);
void Sntp_init(void);

在user_main.c文件中的 user_init()函数下添加如下代码

#define SSID "Hotspot"    //ESP8266要加入的无线网
#define PASSWORD "88888888"
void ICACHE_FLASH_ATTR
user_init(void){
  printf("SDK version:%s
", system_get_sdk_version());
  Led_init();
  wifi_set_opmode(STATION_MODE);
  struct station_config *config = (struct station_config *)        zalloc(sizeof(struct station_config));
  sprintf(config->ssid,SSID);
  sprintf(config->password,PASSWORD);
  wifi_station_set_config(config);
  free(config);
  wifi_station_set_auto_connect(TRUE);    
  Sntp_init();
  xTaskCreate(ATaskLed, "LED", 256, NULL, 2, NULL);
}

在ESP8266编译器中编译完成,烧写 bin文件到 ESP8266,打开串口助手,每5秒输出一次实时时间

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    7488

    浏览量

    87854
  • 服务器
    +关注

    关注

    12

    文章

    9123

    浏览量

    85331
  • NTP
    NTP
    +关注

    关注

    1

    文章

    169

    浏览量

    13892
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    44965
  • sntp
    +关注

    关注

    0

    文章

    5

    浏览量

    3703
收藏 人收藏

    评论

    相关推荐

    ESP8266简易WIFI天气时钟

    本篇介绍了http获取网络天气的基本原理,并通过实践,使用ESP8266获取网络天气和
    的头像 发表于 06-06 09:31 7502次阅读
    <b class='flag-5'>ESP8266</b>简易WIFI天气时钟

    请问如何在ESP8266上使用sntp协议连接到ssl中的服务器?

    我正在使用带有 C 语言的 esp-open-sdk 的ESP8266。 我尝试使用此代码来获取时间戳,但每次都失败 - 我只得到 0 : snt
    发表于 07-19 07:30

    请问STM32+ESP8266如何获取网络时间

    请问STM32+ESP8266如何获取网络时间
    发表于 01-19 06:15

    ESP8266获取网络时间的方法

    ESP8266获取网络时间1、注意事项:本文用到了我自己的阿里云服务器,请各位使用的时候频率稍微低一点,不然压力很大哈。2、登录可以用esp8266
    发表于 01-25 07:17

    ESP8266使用AT指令获取网络时间的步骤

    再优化一下,恰巧有一个正在吃灰的装了AT固件库的esp8266,可以让stm32去获取网络时钟从而校正本地时间网络时钟用淘宝的API,它返
    发表于 08-26 15:27

    ESP8266的基础知识,怎么获取网络同步时间(北京时间

    要想获取网络时间首先要有提供网络时间的网站,免费提供网络时间
    的头像 发表于 05-09 14:33 6.3w次阅读
    <b class='flag-5'>ESP8266</b>的基础知识,怎么<b class='flag-5'>获取</b><b class='flag-5'>网络</b>同步<b class='flag-5'>时间</b>(北京<b class='flag-5'>时间</b>)

    基于ESP8266网络授时的时钟源代码免费下载

    本文档的主要内容详细介绍的是基于ESP8266网络授时的时钟源代码免费下载。
    发表于 09-21 08:00 28次下载
    基于<b class='flag-5'>ESP8266</b><b class='flag-5'>网络</b>授时的时钟源代码免费下载

    使用STM32和ESP8266获取网络天气的源代码程序免费下载

    本文档的主要内容详细介绍的是使用STM32和ESP8266获取网络天气的源代码程序免费下载。
    发表于 01-18 08:00 12次下载
    使用STM32和<b class='flag-5'>ESP8266</b><b class='flag-5'>获取</b><b class='flag-5'>网络</b>天气的源代码程序免费下载

    正点原子ESP8266获取网络天气适配战舰V3

    正点原子ESP8266获取网络天气适配战舰V3
    发表于 04-06 14:36 25次下载
    正点原子<b class='flag-5'>ESP8266</b><b class='flag-5'>获取</b><b class='flag-5'>网络</b>天气适配战舰V3

    基于STM32的ESP8266天气时钟(2)--------MCU获取天气数据

    stm32通过ESP8266模块获取天气,时间
    发表于 11-18 18:36 38次下载
    基于STM32的<b class='flag-5'>ESP8266</b>天气时钟(2)--------MCU<b class='flag-5'>获取</b>天气数据

    ESP8266获取网络时间获取天气

    ESP8266获取网络时间1、注意事项:本文用到了我自己的阿里云服务器,请各位使用的时候频率稍微低一点,不然压力很大哈。2、登录可以用esp8266
    发表于 11-30 16:21 12次下载
    <b class='flag-5'>ESP8266</b><b class='flag-5'>获取</b><b class='flag-5'>网络</b><b class='flag-5'>时间</b>、<b class='flag-5'>获取</b>天气

    ESP8266通过MQTT协议连接ONENET

    将介绍通过MQTT协议连接ONENET,实现ESP8266与ONENET平台数据交互一、设计目标实现ESP8266通过MQTT协议连接ONENET实现DHT11温湿度数据的
    发表于 01-12 19:58 53次下载
    <b class='flag-5'>ESP8266</b>通过MQTT<b class='flag-5'>协议</b>连接ONENET

    使用Arduino IDE创建ESP8266网络服务器

    电子发烧友网站提供《使用Arduino IDE创建ESP8266网络服务器.zip》资料免费下载
    发表于 02-02 16:58 1次下载
    使用Arduino IDE创建<b class='flag-5'>ESP8266</b><b class='flag-5'>网络</b>服务器

    使用ESP8266 OLED和Visuino从NIST TIME服务器获取日期和时间

    电子发烧友网站提供《使用ESP8266 OLED和Visuino从NIST TIME服务器获取日期和时间.zip》资料免费下载
    发表于 06-28 09:55 0次下载
    使用<b class='flag-5'>ESP8266</b> OLED和Visuino从NIST TIME服务器<b class='flag-5'>获取</b>日期和<b class='flag-5'>时间</b>

    ESP8266网络天气时钟OLED显示

    基于ESP8266实现网络获取天气和时钟并OLED显示
    的头像 发表于 06-28 04:46 1120次阅读
    <b class='flag-5'>ESP8266</b><b class='flag-5'>网络</b>天气时钟OLED显示