ESP8266_SNTP(Simple Network Time Protocol)
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)
ESP8266_SNTP(Simple Network Time Protocol)相关推荐
- SOAP(Simple Object Access Protocol )简单对象访问协议
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelo ...
- Linux 服务器内网搭建NTP时间服务器(Network Time Protocol)
文章目录 Linux 服务器内网搭建NTP时间服务器(Network Time Protocol) 一.在主服务器端安装NTP时间服务器 二.在客户端安装NTP时间服务器 三.Xhell 同时控制多个 ...
- 网管软件最常用协议SNMP(Simple Network Management Protocol)介绍
SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理协议".SNMP首先是由Internet工 ...
- ICMP(Internet Control Message Protocol)网际控制报文协议初识
ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息是指网 ...
- C语言libcurl:RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议
RTSP是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学.网景和RealNetworks公司提交的IETF RFC标准. /** Copyright (c) 2011 - 2019, Jim ...
- LDAP(Lightweight Directory Access Protocol)介绍
LDAP(Lightweight Directory Access Protocol)介绍 LDAP是个啥? LDAP基本结构及术语 基本结构 条目(Entry) 识别名(DN) 相对识别名(RDN) ...
- 网际协议(IP,Internet Protocol)
网际协议(IP)是开放系统互联模型(OSI model)的一个主要协议,也是TCP/IP中完整的一部分.尽管"因特网"(Internet)这个词在协议的名字里出现,但其使用范围却超 ...
- PPP(Point to Point Protocol)——点对点协议
目录 一.PPP组件 1.基本介绍 2.PPP优势 3.PPP的3类子协议 (1)LCP(链路控制协议) (2)NCP(网络层控制协议) (3)CHAP(质询握手认证协议)和PAP(密码认证协议) 二 ...
- PYNQ开发板使用-使用DMA进行数据搬移(Simple DMA transfer 模式)
该篇是学习使用PYNQ开发板,实际上是对ZYNQ PL端AXI_CDMA 核的应用.实验步骤参照官网的教程,一步一步地做,但是由于在硬件资源布置方面与官方教程稍有出入,所以在SDK的源码里也进行了修改 ...
最新文章
- 跟我学Springboot开发后端管理系统7:Matrxi-Web权限设计
- elasticsearch使用指南之Elasticsearch Document Index API详解、原理与示例
- [转]Oracle 执行计划(Explain Plan) 说明
- 响应键盘delete键的删除功能
- ES6新功能-模板字符串
- Angular自学笔记(?)ContentChild和ContentChildren
- 平果手机桌面计算机,苹果手机便签记事本怎么在Windows电脑桌面上使用?
- 用python设计数独的心得体会_python实现数独算法实例
- 基于jsp+Spring+mybatis的SSM企业门户网站设计和实现
- 一道考查request导致的安全性问题的ctf题
- mysql 5.1主从_MySQL5.1版本的主从复制搭建 | 学步园
- VSS2005源代码管理
- android百度云和谐,视频总被百度云和谐?这个小工具帮你完美解决
- OCX控件注册及无法注册的原因总结
- ACM的奇计淫巧系列
- 程序员跳槽和面试,猎头不会告诉你的那些事儿
- MATLAB 残差分析
- raw格式(裸数据)格式文件读写
- excel插入页码_当EXCEL遇上PPT 学做抢手人气王
- 华为存储系统运维管理