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

    文章

    6652

    浏览量

    84571
  • 服务器
    +关注

    关注

    12

    文章

    8125

    浏览量

    82542
  • NTP
    NTP
    +关注

    关注

    1

    文章

    95

    浏览量

    13784
  • ESP8266
    +关注

    关注

    50

    文章

    947

    浏览量

    43985
  • sntp
    +关注

    关注

    0

    文章

    4

    浏览量

    3646
收藏 人收藏

    评论

    相关推荐

    ESP8266简易WIFI天气时钟

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

    请问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如何获取上传固件的日期和时间

    用每个esp8266固件都是*.bin文件,如果我没理解错的话。每个文件都有创建时间。问题是 - esp8266 是否存储固件的日期和时间,通过 OTA(或更新)上传,是否有任何 Ar
    发表于 02-22 06:05

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

    要想获取网络时间首先要有提供网络时间的网站,免费提供网络时间
    的头像 发表于 05-09 14:33 6.2w次阅读
    <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引脚

    /IP协议中,由于这个任意微控制器可以与任何Wi-Fi网络来连接。它有监督的任何其他设备的电源,也可以很容易地下放Wi-Fi网络与其它系统连接。它有片上变异的巨量这是好的为最小的外部电路。该模块是一个极其成本效益的板。
    发表于 11-27 11:39 24.7w次阅读
    <b class='flag-5'>esp8266</b>简介与<b class='flag-5'>esp8266</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之硬件机理

    上的wifi4.4找到你要接入的wifi,添加账号和密码4.5获取此时esp8266的IP地址4.6开启多通道模式4.7开启服务器,设置服务端口5.esp8266的定位总结1.ESP8266
    发表于 12-09 12:21 31次下载
    <b class='flag-5'>ESP8266</b>之硬件机理

    小白快速入门esp8266 获取传感器状态

    WebServer.h>#define led LED_BUILTIN #esp8266板子上面的LED灯ESP8266WiFiMulti wifimulti; // 建立wifimulti对象ESP8266WebServer
    发表于 12-29 18:58 8次下载
    小白快速入门<b class='flag-5'>esp8266</b> <b class='flag-5'>获取</b>传感器状态

    ESP8266使用教程之初识

    串口与MCU通信,内置 TCP/IP 协议栈,实现串口与 WiFi 之间的装换。​ 通过正点原子的 ATK-ESP8266,传统的串口设备只需要通过串口配置,就可以通过网络传输自己的数据。二.引...
    发表于 01-04 18:59 80次下载
    <b class='flag-5'>ESP8266</b>使用教程之初识

    ESP8266通过MQTT协议连接ONENET

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

    使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

    在本教程中,我们将使用 ESP8266 NodeMCU 从 NTP 服务器获取当前时间和日期,并将其显示在 OLED 显示屏上。
    的头像 发表于 09-01 16:09 1.7w次阅读
    使用<b class='flag-5'>ESP8266</b>从NTP服务器<b class='flag-5'>获取</b><b class='flag-5'>时间</b>并在OLED显示器上显示