SNTP,Simple Network Time Protocol(简单网络时间协议),用来同步时钟。

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

初始化

  1. NTP服务器的地址可以从NTP Pool Project了解详情。
    设置模式使用APIsntp_setoperatingmode(),SNTP_OPMODE_POLL表示单播模式,
  2. SNTP_OPMODE_LISTENONLY表示广播模式。
// sntp.h 47
/* SNTP operating modes: default is to poll using unicast.The mode has to be set before calling sntp_init(). */
#define SNTP_OPMODE_POLL            0
#define SNTP_OPMODE_LISTENONLY      1
// sntp.c 713
/**1. @ingroup sntp2. Sets the operating mode.3. @param operating_mode one of the available operating modes*/
void
sntp_setoperatingmode(u8_t operating_mode)
{LWIP_ASSERT_CORE_LOCKED();LWIP_ASSERT("Invalid operating mode", operating_mode <= SNTP_OPMODE_LISTENONLY);LWIP_ASSERT("Operating mode must not be set while SNTP client is running", sntp_pcb == NULL);sntp_opmode = operating_mode;
}
  1. 设置NTP服务器地址使用APIsntp_setservername()。这里的SNTP_MAX_SERVERS控制了服务器数量,后面有说明在哪里修改。
// sntp.c 865
/*** Initialize one of the NTP servers by name** @param idx the index of the NTP server to set must be < SNTP_MAX_SERVERS* @param server DNS name of the NTP server to set, to be resolved at contact time*/
void
sntp_setservername(u8_t idx, const char *server)
{LWIP_ASSERT_CORE_LOCKED();if (idx < SNTP_MAX_SERVERS) {sntp_servers[idx].name = server;}
}
  1. SNTP同步时间是一个异步的操作,所以需要注册回调函数在时间同步时自动调用,使用APIsntp_set_time_sync_notification_cb(),后面有说明回调函数怎么处理。
// sntp.c 69
// set a callback function for time synchronization notification
void sntp_set_time_sync_notification_cb(sntp_sync_time_cb_t callback)
{time_sync_notification_cb = callback;
}
  1. 最后还需要调用APIsntp_init()来初始化SNTP模块。
  2. 以下是使用时的例子。
const char *g_apcNtpServer[] = {"0.pool.ntp.org","1.pool.ntp.org","2.pool.ntp.org","3.pool.ntp.org",
};
static void utc_sntp_init(void)
{sntp_setoperatingmode(SNTP_OPMODE_POLL);uint8_t ucServNum = sizeof(g_apcNtpServer) / sizeof(g_apcNtpServer[0]);for (uint8_t cnt = 0; cnt < ucServNum; cnt++){sntp_setservername(cnt, g_apcNtpServer[cnt]);}sntp_set_time_sync_notification_cb(&sntp_set_time_sync_callback);sntp_init();
}

回调函数

  1. 回调函数最终在sntp_sync_time()里被调用,形参是结构体指针类型struct timeval *,可以直接得到长整型的UTC时间(秒和毫秒)。
  2. 以下是使用时的例子。
void sntp_set_time_sync_callback(struct timeval *tv)
{struct tm timeinfo = {0};ESP_LOGI(UTC_TAG, "tv_sec: %lld", (uint64_t)tv->tv_sec);localtime_r((const time_t *)&(tv->tv_sec), &timeinfo);ESP_LOGI(UTC_TAG, "%d %d %d %d:%d:%d", timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday,timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);// sntp_stop();// utc_set_time((uint64_t)tv->tv_sec);
}

配置参数

  1. 最大NTP服务器数量SNTP_MAX_SERVERS,也就是CONFIG_LWIP_DHCP_MAX_NTP_SERVERS,在make menuconfig中修改。
// sntp_opts.h 59
/** The maximum number of SNTP servers that can be set */
#if !defined SNTP_MAX_SERVERS || defined __DOXYGEN__
#define SNTP_MAX_SERVERS           LWIP_DHCP_MAX_NTP_SERVERS
#endif
// opt.h 952
/*** The maximum of NTP servers requested*/
#if !defined LWIP_DHCP_MAX_NTP_SERVERS || defined __DOXYGEN__
#define LWIP_DHCP_MAX_NTP_SERVERS       1
#endif
// lwipopts.h 812
#define LWIP_DHCP_MAX_NTP_SERVERS       CONFIG_LWIP_DHCP_MAX_NTP_SERVERS
// sdkconfig.h
#define CONFIG_LWIP_DHCP_MAX_NTP_SERVERS 4
  1. 更新时间请求间隔SNTP_UPDATE_DELAY,到下一次发起更新时间请求的间隔时间,单位是ms,最小不能小于15s,也是通过make menuconfig修改CONFIG_LWIP_SNTP_UPDATE_DELAY。
// sntp.c 74
#ifndef SNTP_SUPPRESS_DELAY_CHECK
#if SNTP_UPDATE_DELAY < 15000
#error "SNTPv4 RFC 4330 enforces a minimum update time of 15 seconds (define SNTP_SUPPRESS_DELAY_CHECK to disable this error)!"
#endif
#endif
// sntp_opts.h 167
/** SNTP update delay - in milliseconds* Default is 1 hour. Must not be beolw 60 seconds by specification (i.e. 60000)*/
#if !defined SNTP_UPDATE_DELAY || defined __DOXYGEN__
#define SNTP_UPDATE_DELAY           3600000
#endif
// lwipopts.h 829
#define SNTP_UPDATE_DELAY              CONFIG_LWIP_SNTP_UPDATE_DELAY
// sdkconfig.h
#define CONFIG_LWIP_SNTP_UPDATE_DELAY 600000
  1. 使用make menuconfig修改参数,在Component config - LWIP - SNTP。

ESP32 SNTP设置相关推荐

  1. linux下VScode开发ESP32,VsCode设置ESP32工具链+刨根问底点灯

    unplash 今天教大家ESP32在vscode上面的配置,以及点灯时的具体引脚定义. 已下软件都是要提前准备的,还有Python环境,不低于3.6 https://cmake.org/ 首先下载c ...

  2. 乐鑫(ESPRESSIF) ESP32 ESP-IDF设置环境变量出现“安全频道支持出错”问题的解决办法

    本文文字大多数是我敲的,但是参考网络上很多文章. 乐鑫官网文章连接是:(本文写作日期是2020年3月28日,下面连接内容可能因时间推移而进一步更新) https://docs.espressif.co ...

  3. ESP32 SNTP配置

    SNTP,Simple Network Time Protocol(简单网络时间协议),用来同步时钟. 百度百科:SNTP SNTP协议采用客户端/服务器的工作方式,可以采用单播(点对点)或者广播(一 ...

  4. ESP32 wifi设置station笔记

    一:了解wifi完成初始化需要的步骤 1.初始化LWIP,初始化事件中断回调函数 2.启动wifi init 后才能使用其他wifi设置的api 3.注册中断回调函数,收到wifi事件或者ip事件都将 ...

  5. ESP32学习笔记(41)——SNTP接口使用

    一.SNTP简介 简单网络时间协议(Simple Network Time Protocol),由 NTP 改编而来,主要用来同步因特网中的计算机时钟. SNTP 协议是用来同步本地的时间到 unix ...

  6. 关于esp32的省电模式的WiFi连接

    对于ESP32,其作为一款集成了2.4GHz WiFi和蓝牙双模块的单芯片,所有基于wifi和蓝牙开发是学习esp32的重要一环,今天WiFi原理和网络结构 可以点击链接进行详细的了解,这里就不做详细 ...

  7. 使用Arduino开发ESP32(06):Ethernet的使用(基于LAN8720)

    文章目录 目的 基本说明 接线定义 使用步骤 常用方法说明 使用演示 数据通讯 事件响应 其他说明 PHY地址 时钟 通讯应用 总结 目的 ESP32除了可以使用无线网络外还可以通过外接PHY模块来使 ...

  8. 乐鑫Esp32学习之旅 23 安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  9. ESP32学习(3):ESP32上运行ILI9341驱动LCD

    系列文章目录 ESP32学习(1):ESP-IDF基于Visual Studio Code环境 ESP32学习(2):ESP32-S3上运行hello world 目录 系列文章目录 前言 一.硬件连 ...

最新文章

  1. 大数据驱动线上线下场景融合和零售数字化营销(有福利)
  2. 解决 Cycript 信息显示不全的问题
  3. Android BLE学习(一): Android搜索BLE设备
  4. 软件设计师习题笔记-重点习题一
  5. 第七届蓝桥杯javaB组真题解析-抽签(第五题)
  6. android if else,Android对很多if和else条件
  7. windows 2003 server IIS权限设置
  8. iso12233测试方法_详解ISO12233 Chart(分辨率测试标板)使用方法
  9. 亿图图示专家Edraw Max v10.5.2 中文免费版(附安装教程)
  10. java材质转基岩版_我的世界java版材质包转换导入基岩版教程
  11. 74cms v5.0.1存在远程连接命令/代码执行漏洞
  12. 机器人阿莫西_HELLO!阿莫西 本田机器人ASIMO
  13. 纯电动汽车整车控制器(VCU)详细介绍
  14. 初中英语语法(006)-特殊疑问句·祈使句·感叹句
  15. qchart 怎么点击一下 出一条线_动漫日系雨伞怎么画?教你用集中线尺画一把日本雨伞!...
  16. 运营商 sni 服务器,加密或者丢失:加密SNI的工作机制
  17. python-基于python程序设计基础第二版
  18. 查找文件及文件内容查找
  19. 使用Mock进行单元测试
  20. 我从600场技术面试中总结出的5个常见问题

热门文章

  1. HITRAN数据库的获取
  2. 关于FPGA的多功能引脚(multi-function pin)
  3. Jenkins进阶篇-臧雪园-专题视频课程
  4. java顶级内功心法(1) —— 可见性、MESI、volatile精讲 (8000字由浅入深)
  5. package ‘**’ is not available for this version of R
  6. oracle锁概念,阻塞
  7. Java GUI之贪吃蛇---[观看bilibili-狂神说Java--学习笔记]
  8. 千万不要在朋友圈发“原图”,不然你的信息分分钟泄露(一)
  9. JPA @Modifying注解 jpql语句更新以及删除
  10. 正版七日杀服务器存档,七日杀网吧存档保存步骤图解 如何在网吧保存你的游戏存档...