ESP32 SNTP设置

article/2025/8/21 23:17:08

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。
    在这里插入图片描述

http://chatgpt.dhexx.cn/article/q159gLAf.shtml

相关文章

sntp服务器位置,sntp的服务器地址

sntp的服务器地址 内容精选 换一换 介绍常见的安全组配置示例。如下示例中,出方向默认全通,仅介绍入方向规则配置方法。不同安全组内的云耀云服务器内网互通仅允许特定 IP 地址远程连接云耀云服务器SSH远程连接Linux云耀云服务器RDP远程连接Windows云服务器公网ping云耀云服务…

sntp 校时问题

1、背景 由于项目中的数据对时间比较敏感&#xff0c;目前常常出现校时问题&#xff0c;导致时间偏差&#xff0c;出现曲线数据丢失和曲线数据重复等问题。 因此对sntp源码进行深入分析。 要了解SNTP&#xff0c;首先需要了解NTP协议。SNTP是NTP的子集&#xff0c;简化了NTP…

ESP8266_SNTP(Simple Network Time Protocol)

1、SNTP 简单网络时间协议 SNTP协议采用客户端/服务器的工作方式&#xff0c;以UDP方式通信&#xff0c;SNTP服务器通过接收GPS信号或自带的原子钟作为系统的时间基准。 网络中存在很多台SNTP服务器&#xff0c;客户端会选择几台SNTP服务器使用。如果一台SNTP服务器在工作过程…

WIFI学习六(SNTP)

简介 SNPT&#xff08;Simple Network Time Protocal简单网络时间协议&#xff09;用于跨广域网或局域网时间同步的协议&#xff0c;具有较高的精确度&#xff08;几十毫秒&#xff09;。SNTP是NTP协议的简化版 SNTP的工作方式 SNTP协议采用客户端/服务器的工作方式&#xff0…

SNTP简介

要了解SNTP&#xff0c;首先需要了解NTP协议。SNTP是NTP的子集&#xff0c;简化了NTP的许多算法和步骤&#xff0c;得到了效率&#xff0c;但时间的精度不如NTP&#xff0c;可是对于民用时间来说足够了&#xff0c;大概最多差距几秒的样子。 NTP&#xff08;Network Time Proto…

SNTP原理讲解 客户端 C语言实现

1.定义 SNTP(Simple Network Time Protocal简单网络时间协议)&#xff0c;用于跨广域网或局域网同步时间的协议&#xff0c;具有较高的精确度&#xff08;几十毫秒&#xff09; 这里给出SNTP的详细定义和解释&#xff0c;以及基于C语言的SNTP客户端实现代码&#xff1a;SNTP c…

使用SNTP协议获取时间

要了解SNTP,首先需要了解NTP协议。SNTP是NTP的子集,简化了NTP的许多算法和步骤,得到了效率,但时间的精度不如NTP,可是对于民用时间来说足够了,大概最多差距几秒的样子。 NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服…

sntp协议简介

SNTP(Simple Network Time Protocal简单网络时间协议)&#xff0c;用于跨广域网或局域网同步时间的协议&#xff0c;具有较高的精确度&#xff08;几十毫秒&#xff09;。SNTP是NTP协议的简化版&#xff0c;两者分别在RFC1305和RFC2030介绍。 SNTP工作方式 SNTP采用客户端/服务…

关于马尔可夫过程的一些学习笔记

①马尔可夫性质&#xff1a;已知“现在”的情况下&#xff0c;“未来”与“过去”彼此独立&#xff08;N1仅与N有关&#xff0c;与N以前的所有都无关&#xff09; ②马尔可夫过程&#xff1a;具有马尔可夫性质的随机过程 ③马尔可夫链&#xff1a;马尔可夫过程的原始模型&…

来聊聊马尔可夫过程

相信你对马尔科夫这个词一定不陌生&#xff0c;因为在人工智能机器学习领域&#xff0c;这个词是避不开的&#xff0c;如马尔可夫链&#xff08;Markov chain)&#xff0c;马尔科夫随机场(Markov random field)&#xff0c;马尔可夫过程(Markov process)&#xff0c;隐马尔可夫…

【算法学习】马尔可夫过程及经典例题讲解(含代码实现)

公众号关注 52DATA &#xff0c;获得更多数据分析知识,感谢支持—> 文章目录 马尔可夫过程1. 马尔可夫性2. 马尔可夫链2.1 转移概率矩阵&#xff08;随机矩阵&#xff09;2.2 状态概率2.3 平稳分布 3.一个很经典的例题帮助理解马尔科夫预测方法1.求状态转移概率2.运用状态概…

数学基础(8)-- 马尔可夫链与马尔可夫过程

目录 1. 简介 1.1 定义 1.2 变种 2. 瞬态演变 3. 马尔科夫链性质 3.1 可还原性 3.2 周期性 3.3 重现性 4. 有限状态空间 1. 简介 马尔可夫链&#xff08;英语&#xff1a;Markov chain&#xff09;&#xff0c;又称离散时间马可夫链&#xff08;discrete-time Markov…

部分可观测马尔可夫过程POMDP

POMDP与MDP的一句话区别&#xff1a;POMDP的state具有不确定性&#xff0c;由七元数组定义&#xff0c;多了观测空间、观测函数、初始置信&#xff08;belief&#xff09;&#xff0c;根据观测概率矩阵求出最可能是的状态 利用值迭代法解决POMDP问题 MDP POMDP 状态→动作 信…

马尔可夫 java_马尔可夫过程(以马尔科夫链Markov为例)

马尔可夫过程(以马尔科夫链Markov为例) 马尔可夫过程 马尔可夫过程的大概意思就是未来只与现在有关&#xff0c;与过去无关。 简单理解就是渣男只在乎下一刻会不会爱你只取决于这一时刻对你的新鲜感&#xff0c;而与你之前对这段感情的付出毫无关系。 设有一个随机过程X(t)&…

马尔可夫决策过程

马尔可夫决策过程 一、马尔科夫决策过程&#xff1a;**马尔科夫决策过程****最优决策**值迭代策略迭代MDP中的参数估计 二、代码实战&#xff1a;A、马尔可夫决策过程值迭代B、马尔可夫决策过程策略迭代C、马尔可夫决策过程动态规划版 参考文章 本文介绍了马尔可夫决策过程&…

随机过程第2讲——马尔可夫过程的应用

温习&#xff1a;随机过程第1讲——泊松过程的模拟与检验&#xff1a;https://blog.csdn.net/ChenQihome9/article/details/82871332 去得也突然——不知在什么时候&#xff0c;雨&#xff0c;悄悄地停了。风也屏住了呼吸&#xff0c;山中一下变得非常幽静。远处&#xff0c;一…

强化学习(2): 马尔可夫过程

前言 本文重点介绍MDP&#xff0c;因为MDP是目前最适合表征强化学习问题的模型。 一个具体的赌徒例子&#xff0c;来说明强化学习的算法如何与MDP构建联系&#xff0c;并且求解出最优策略。链接如下&#xff1a;link 一、马尔可夫性 其假设未来的状态仅取决与当前的状态。过…

贝叶斯网络、马尔可夫模型、马尔可夫过程、马尔可夫链、马尔可夫网络基本概念

知识储备与简要概括 可数集【Countable set】&#xff1a; 是指每个元素都能与自然数集N的每个元素之间能建立一一对应的集合。如果将可数集的每个元素标上与它对应的那个自然数记号&#xff0c;那么可数集的元素就可以按自然数的顺序排成一个无穷序列a1&#xff0c;a2&#…

强化学习笔记:马尔可夫过程 马尔可夫奖励过程

1 马尔可夫性质 &#xff08;Markov Property&#xff09; 我们设状态的历史为&#xff08;包含了之前的所有状态&#xff09; 如果一个状态转移是符合马尔可夫性质的&#xff0c;也就是满足如下条件&#xff1a; 也就是说&#xff0c;从当前状态转移到状态的概率&#xff0c;就…

马尔可夫性质、马尔可夫链和马尔可夫过程

关注&#xff1a;灰质&#xff0c;有趣有料的AI技术分享 前言 研究决策问题就一定听说过马尔可夫过程&#xff08;Markov Process&#xff09;&#xff0c;这是一类非常重要的方法。现在非常热门的强化学习都是基于马尔可夫过程方法建立的。马尔可夫决策过程是研究随机序贯决策…