ESP8266_SNTP(Simple Network Time Protocol)

article/2025/8/21 23:14:36

1、SNTP 简单网络时间协议

SNTP协议采用客户端/服务器的工作方式,以UDP方式通信,SNTP服务器通过接收GPS信号或自带的原子钟作为系统的时间基准。

网络中存在很多台SNTP服务器,客户端会选择几台SNTP服务器使用。如果一台SNTP服务器在工作过程中失去了外部时间源,此时SNTP服务器会告诉SNTP客户端“我失去了外部时间”。当SNTP客户端收到这个信息时,会选择其他的SNTP服务器。

  • 单播模式下,SNTP客户端定期访问SNTP服务器获得准确的时间信息,用于调整客户端自身所在系统的时间,达到同步时间的目的。
  • 广播模式下,SNTP服务器周期性地发送消息给指定的IP广播地址或者IP多播地址。SNTP客户端通过监听这些地址来获得时间信息。

2、参考SDK编程手册的SNTP例程

  • 使能SNTP
    • 设置SNTP服务器,最多可设置3个SNTP服务器,可通过域名或IP地址设置;
    • 初始化SNTP,sntp_init();
  • 设置定时器,检查SNTP时间戳,例程100ms测一次有正确时间则停定时器,我用的是1s循环check;
  • 定时器回调
    • 如果时间戳不为0,则获取当前时间;

 

3、代码、结果

        默认是时间格式:“星期 月 日 时间 年”,比如“Mon Jun 25 23:13:15 2018”,不符合习惯,重新调整格式为“年 月 日 星期 时间”,没有这个需求直接向上面例程一样直接打印也可以;

//SNTP---------------BEGIN------------------------
//	 -----------------------------------------------			 -----------------------------------------------
//	|	  月份		|	英文简写	|	英文全称	|			|	  星期X		|	英文简写	|	英文全称	|
//	 -----------------------------------------------			 -----------------------------------------------
//	| 	  一月		|	  Jan		|	January		|			|	  周一		|	  Mon		|	Monday		|
//	 -----------------------------------------------			 -----------------------------------------------
//	|	  二月		|	  Feb		|	February	|			|	  周二		|	  Tue		|	Tuesday		|
//	 -----------------------------------------------			 -----------------------------------------------
//	| 	  三月		|	  Mar		|	March		|			|	  周三		|	  Wed		|	Wednesday	|
//	 -----------------------------------------------			 -----------------------------------------------
//	| 	  四月		|	  Apr		|	April		|			|	  周四		|	  Thu		|	Thursday	|
//	 -----------------------------------------------			 -----------------------------------------------
//	|  	  五月		|	  May		|	May			|			|	  周五		|	  Fri		|	Friday		|
//	 -----------------------------------------------			 -----------------------------------------------
//	|  	  六月		|	  June		|	June		|			|	  周六		|	  Sat		|	Saturday	|
//	 -----------------------------------------------			 -----------------------------------------------
//	|  	  七月		|	  July		|	July		|			|	  周日		|	  Sun		|	Sunday		|
//	 -----------------------------------------------			 -----------------------------------------------
//	|  	  八月		|	  Aug		|	Aguest		|
//	 -----------------------------------------------
//	|  	  九月		|	  Sept		|	September	|
//	 -----------------------------------------------
//	|  	  十月		|	  Oct		|	October		|
//	 -----------------------------------------------
//	|  	 十一月	    |	  Nov		|	November	|
//	 -----------------------------------------------
//	|  	 十二月	    |	  Dec		|	December	|
//	 -----------------------------------------------os_timer_t timer_SNTP_check;					//检测SNTP的定时器void ICACHE_FLASH_ATTR timer_SNTP_check_callback(void* arg)
{uint32	TimeStamp;		// 时间戳char * Str_RealTime;	// 实际时间的字符串char * Str_Head_Week;		// 【"星期"】字符串首地址char * Str_Head_Month;		// 【"月份"】字符串首地址char * Str_Head_Day;		// 【"日数"】字符串首地址char * Str_Head_Clock;		// 【"时钟"】字符串首地址char * Str_Head_Year;		// 【"年份"】字符串首地址char A_Str_Data[30] = {0};			//调整年月日时间之后的字符串char *T_A_Str_Data = A_Str_Data;	// 缓存数组指针// 查询当前距离基准时间(1970.01.01 00:00:00 GMT+8)的时间戳(单位:秒)TimeStamp = sntp_get_current_timestamp();if(TimeStamp == 0){						// 判断是否获取到偏移时间
//		 os_timer_arm(&timer_SNTP_check,100,0);}else{
//		 os_timer_disarm(&timer_SNTP_check);// 查询实际时间(GMT+8):东八区(北京时间)Str_RealTime = sntp_get_real_time(TimeStamp);// 【实际时间】字符串 == "周 月 日 时:分:秒 年"os_printf("SNTP_TimeStamp = %d\n",TimeStamp);		// 时间戳os_printf("SNTP_InternetTime = %s\n",Str_RealTime);	// 实际时间//只有月份的缩写字符个数是不确定的Str_Head_Week 	= Str_RealTime;							// "星期" 字符串的首地址Str_Head_Month = strstr(Str_Head_Week,	" ") + 1;	// "月份" 字符串的首地址Str_Head_Day 	= strstr(Str_Head_Month,	" ") + 1;	// "日数" 字符串的首地址Str_Head_Clock = strstr(Str_Head_Day,	" ") + 1;	// "时钟" 字符串的首地址Str_Head_Year  = Str_Head_Clock + 9;					//年份os_memcpy(T_A_Str_Data, Str_Head_Year, 4);A_Str_Data[4] = ' ';T_A_Str_Data += 5;if(Str_Head_Day - Str_Head_Month == 4){				//月份是3字节os_memcpy(T_A_Str_Data, Str_Head_Month, 4);		//多的1字节是自带的空格T_A_Str_Data += 4;}else{os_memcpy(T_A_Str_Data, Str_Head_Month, 5);		//多的1字节是自带的空格T_A_Str_Data += 5;}if(Str_Head_Clock - Str_Head_Day == 2){				//day是1字节os_memcpy(T_A_Str_Data, Str_Head_Day, 2);		//多的1字节是自带的空格T_A_Str_Data += 2;}else{													//day是2字节os_memcpy(T_A_Str_Data, Str_Head_Day, 3);		//多的1字节是自带的空格T_A_Str_Data += 3;}os_memcpy(T_A_Str_Data, Str_Head_Week, 4);			//T_A_Str_Data += 4;os_memcpy(T_A_Str_Data, Str_Head_Clock, 8);		//00:00:00T_A_Str_Data += 8;*T_A_Str_Data = '\0';								// 【"日期"】字符串后面添加'\0'os_printf("data = %s\n",A_Str_Data);oled_show_string(0,2,A_Str_Data,FONT_8x16);}
}// 初始化SNTP
void ICACHE_FLASH_ATTR SNTP_initial(void)
{ip_addr_t * addr = (ip_addr_t *)os_zalloc(sizeof(ip_addr_t));//	sntp_setservername(0, "us.pool.ntp.org");	// 服务器_0【域名】sntp_setservername(0, "0.cn.pool.ntp.org");	// 服务器_0【域名】sntp_setservername(1, "ntp.sjtu.edu.cn");	// 服务器_1【域名】ipaddr_aton("210.72.145.44", addr);			// 点分十进制 => 32位二进制sntp_setserver(2, addr);					// 服务器_2【IP地址】os_free(addr);								// 释放addrsntp_init();								// SNTP初始化APIos_timer_disarm(&timer_SNTP_check);os_timer_setfn(&timer_SNTP_check,timer_SNTP_check_callback,NULL);os_timer_arm(&timer_SNTP_check,1000,1);		//1000ms
}//SNTP-------------------END--------------------------------

 

参考链接:

sntp_百度百科 (baidu.com)


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

相关文章

WIFI学习六(SNTP)

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

SNTP简介

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

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

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

使用SNTP协议获取时间

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

sntp协议简介

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

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

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

来聊聊马尔可夫过程

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

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

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

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

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

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

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

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

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

马尔可夫决策过程

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

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

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

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

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

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

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

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

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

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

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

1.3 马尔可夫过程

之前介绍的奖励、智能体、动作、观察和环境可以看成RL的一级概念。以此为基础,我们将探索RL的二级概念,包括状态(state)、事件(episode)、历史(history)、价值(value&…

一文看懂马尔科夫过程

1.马尔科夫决策过程(MDPs)简介 马尔科夫决策过程是对强化学习(RL)问题的数学描述。几乎所有的RL问题都能通过MDPs来描述: 最优控制问题可以用MDPs来描述;部分观测环境可以转化成POMDPs;赌博机问题是只有一个状态的MDPs;注:虽然大部分DL问题都能转化为MDPs,但是以下所描述…

马尔可夫Markov决策过程 MDP、马尔可夫奖励过程MRP

引言 在概率论及统计学中,马尔可夫过程(英语:Markov process)是一个具备了马尔可夫性质的随机过程,因为俄国数学家安德雷马尔可夫得名。马尔可夫过程是不具备记忆特质的(memorylessness)。换言…