一、SNTP简介

简单网络时间协议(Simple Network Time Protocol),由 NTP 改编而来,主要用来同步因特网中的计算机时钟

二、SNTP接口

SNTP 接口位于 ESP8266_NONOS_SDK/include/sntp.h


三、初始化SNTP

设置三个时间服务器域名并初始化。

/**@brief 初始化SNTP服务@param 无@return 无
*/
void ICACHE_FLASH_ATTR
SNTP_Init(void)
{sntp_setservername(0,"0.cn.pool.ntp.org");sntp_setservername(1,"1.cn.pool.ntp.org");sntp_setservername(2,"2.cn.pool.ntp.org");sntp_init();
}

四、获取SNTP时间

4.1 获取时间字符串

/**@brief 获取SNTP时间@param pRealTime -[in&out] 实时时间@return 无
*/
void ICACHE_FLASH_ATTR
GetSntpTime(char *pRealTime)
{uint32_t time = sntp_get_current_timestamp();os_sprintf(pRealTime, "%s", sntp_get_real_time(time));os_sprintf(pRealTime, "%s", sntpTimeChangeToSimpleDateFormat(pRealTime));
}

由于通过 sntp_get_real_time()函数 获取出来的时间字符串格式为Thu Dec 27 22:40:21 2018,不是我想要的格式,所以需要重新转换格式。

4.2 SNTP时间转化为简单日期格式

typedef struct sntpData_t
{uint8 week;uint8 month;uint8 day;uint8 hour;uint8 minute;uint8 second;uint8 year;
} SntpData_t;/**@brief SNTP时间转化为简单日期格式@param pSntpRealTime -[in] 实时时间@return 简单日期格式时间字符串
*/
static char *ICACHE_FLASH_ATTR
sntpTimeChangeToSimpleDateFormat(char *pSntpRealTime)
{if(!pSntpRealTime){return "";}pSntpRealTime[24] = '\0';                       // 不要年份后面的数据SntpData_t sntpData;uint8 dateType[7] = {3, 3, 2, 2, 2, 2, 4};     // 3-Fri 3-May 2-31 2-11: 2-21: 2-42 4-2019uint8 temp[5];uint8 i = 0, j = 0;while(*pSntpRealTime != '\0'){if(*pSntpRealTime == ' ' || *pSntpRealTime == ':'){pSntpRealTime++;i++;}else{os_memset(temp, '\0', 5);for(j = 0; j < dateType[i]; j++){temp[j] = *pSntpRealTime;pSntpRealTime++;}switch(i){case 0: // 周sntpData.week = checkWahtWeek(temp);break;case 1: // 月sntpData.month = checkWahtMonth(temp);break;case 2: // 日sntpData.day = checkWahtDay(temp);break;case 3: // 时sntpData.hour = checkWahtHour(temp);break;case 4: // 分sntpData.minute = checkWahtMinute(temp);break;case 5: // 秒sntpData.second = checkWahtSecond(temp);break;case 6: // 年sntpData.year = checkWahtYear(temp);break;default:break;}}}os_memset(pSntpRealTime, 0, 24);os_sprintf(pSntpRealTime, "20%x-%02x-%02x %02x:%02x:%02x",sntpData.year, sntpData.month,sntpData.day, sntpData.hour,sntpData.minute, sntpData.second);return pSntpRealTime;
}

4.3 解析年月日时分秒

/**@brief 检查星期几@param pWeek -[in] 待检测字符串@return 星期几
*/
static uint8 ICACHE_FLASH_ATTR
checkWahtWeek(char *pWeek)
{if(!pWeek){return 0;}uint8 week;if(strcmp(pWeek, "Mon") == 0){week = 1;                                   // 星期一}else if(strcmp(pWeek, "Tue") == 0){week = 2;                                    // 星期二}else if(strcmp(pWeek, "Wed") == 0){week = 3;                                    // 星期三}else if(strcmp(pWeek, "Thu") == 0){week = 4;                                    // 星期四}else if(strcmp(pWeek, "Fri") == 0){week = 5;                                    // 星期五}else if(strcmp(pWeek, "Sat") == 0){week = 6;                                    // 星期六}else if(strcmp(pWeek, "Sun") == 0){week = 7;                                    // 星期天}return week;
}/**@brief 检查几月份@param pMonth -[in] 待检测字符串@return 几月份
*/
static uint8 ICACHE_FLASH_ATTR
checkWahtMonth(char *pMonth)
{if(!pMonth){return 0;}uint8 month;if(strcmp(pMonth, "Jan") == 0){month = 1;                                   // 一月}else if(strcmp(pMonth, "Feb") == 0){month = 2;                                   // 二月}else if(strcmp(pMonth, "Mar") == 0){month = 3;                                   // 三月}else if(strcmp(pMonth, "Apr") == 0){month = 4;                                   // 四月}else if(strcmp(pMonth, "May") == 0){month = 5;                                   // 五月}else if(strcmp(pMonth, "Jun") == 0){month = 6;                                   // 六月}else if(strcmp(pMonth, "Jul") == 0){month = 7;                                   // 七月}else if(strcmp(pMonth, "Aug") == 0){month = 8;                                   // 八月}else if(strcmp(pMonth, "Sep") == 0){month = 9;                                   // 九月}else if(strcmp(pMonth, "Oct") == 0){month = 10;                                  // 十月}else if(strcmp(pMonth, "Nov") == 0){month = 11;                                  // 十一月}else if(strcmp(pMonth, "Dec") == 0){month = 12;                                 // 十二月}return month;
}/**@brief 检查几日@param pDay -[in] 待检测字符串@return 几日
*/
static uint8 ICACHE_FLASH_ATTR
checkWahtDay(char *pDay)
{if(!pDay){return 0;}uint8 day = (*pDay & 0x0f) << 4;day = day | (*(pDay+1) & 0x0f);return day;
}/**@brief 检查几时@param pHour -[in] 待检测字符串@return 几时
*/
static uint8 ICACHE_FLASH_ATTR
checkWahtHour(char *pHour)
{if(!pHour){return 0;}uint8 hour = (*pHour & 0x0f) << 4;hour = hour | (*(pHour+1) & 0x0f);return hour;
}/**@brief 检查几分@param pMinute -[in] 待检测字符串@return 几分
*/
static uint8 ICACHE_FLASH_ATTR
checkWahtMinute(char *pMinute)
{if(!pMinute){return 0;}uint8 minute = (*pMinute & 0x0f) << 4;minute = minute | (*(pMinute+1) & 0x0f);return minute;
}/**@brief 检查几秒@param pSecond -[in] 待检测字符串@return 几秒
*/
static uint8 ICACHE_FLASH_ATTR
checkWahtSecond(char *pSecond)
{if(!pSecond){return 0;}uint8 second = (*pSecond & 0x0f) << 4;second = second | (*(pSecond+1) & 0x0f);return second;
}/**@brief 检查几年@param pYear -[in] 待检测字符串@return 几年
*/
static uint8 ICACHE_FLASH_ATTR
checkWahtYear(char *pYear)
{if(!pYear){return 0;}uint8 year = (*(pYear+2) & 0x0f) << 4;year = year | (*(pYear+3) & 0x0f);return year;
}

五、使用方法

首先,在 user_main.cuser_init() 中调用 SNTP_Init() 初始化。

void ICACHE_FLASH_ATTR
user_init(void)
{···SNTP_Init();                                                        // SNTP服务初始化···
}

在其他地方调用 GetSntpTime() 获取时间

uint8 time[25];
GetSntpTime(time);
os_printf("%s\n", time);

获取到时间格式为:
2019-07-31 17:01:01


• 由 Leung 写于 2019 年 7 月 31日

• 参考:esp8266_SNTP时间获取处理成BCD码
    ESP8266 Non-OS SDK API参考[7qq6]

ESP8266学习笔记(11)——SNTP接口使用相关推荐

  1. Hadoop学习笔记—11.MapReduce中的排序和分组

    Hadoop学习笔记-11.MapReduce中的排序和分组 一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出 ...

  2. ESP8266学习笔记(1)——搭建环境、编译烧写(NONOS SDK)

    RTOS SDK环境搭建参看 ESP8266学习笔记(17)--搭建环境.编译烧写(RTOS SDK) 一.搭建环境 1.1 ESP8266 SDK 入门指南 官网下载:https://www.esp ...

  3. esp8266 蓝牙耳机_走进物联网智能家居-手把手带你制作wifi智能开关-ESP8266学习笔记(二)...

    走进物联网智能家居-手把手带你制作wifi智能开关-ESP8266学习笔记(二) 2020-05-09 13:44:11 9点赞 72收藏 6评论 小编注:此篇文章来自即可瓜分10万金币,周边好礼达标 ...

  4. 【白帽子学习笔记11】DVWA Brute Force【暴力破解】

    [白帽子学习笔记11]DVWA Brute Force Brute Force 就是暴力破解的意思,尝试常用的用户名和必然然后使用工具一个一个的去尝试 LOW级别 通过解析源码我们可以发现代码没有任何 ...

  5. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)--依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  6. esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机

    arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...

  7. HALCON 20.11:深度学习笔记(11)---目标检测

    HALCON 20.11:深度学习笔记(11)---目标检测 HALCON 20.11.0.0中,实现了深度学习方法. 本章讲解了如何使用基于深度学习的对象检测. 通过对象检测,我们希望在图像中找到不 ...

  8. 台大李宏毅Machine Learning 2017Fall学习笔记 (11)Convolutional Neural Network

    台大李宏毅Machine Learning 2017Fall学习笔记 (11)Convolutional Neural Network 本博客主要整理自: http://blog.csdn.net/x ...

  9. ESP8266学习笔记:实现ESP8266的局域网内通信

    ESP8266学习笔记:实现ESP8266的局域网内通信 现在就以实例入手.工程使用的是IOT_DEMO,据DEMO文档可以知道ESP8266初始工作模式为softAP+station共存的模式.于是 ...

  10. PhalAPI学习笔记 ——— 第二章接口服务请求

    PhalAPI学习笔记 --- 第二章接口服务请求 前言 接口服务请求 接口服务请求案例 自定义接口路由 开启匹配路由 配置路由规则 nginx apache 服务请求 结束语 前言 公司业务需要转学 ...

最新文章

  1. 基础通俗讲解集成学习算法
  2. python socket编程详细介绍
  3. PC-飞起来!我的Windows XP——五步快速优化Windows XP
  4. export_symbol能对变量使用吗_美缝剂能代替玻璃胶使用吗?
  5. php 简易验证码(GD库)
  6. Flask 和 Google App Engine 部署模型服务
  7. Mac系统设置系统搜索范围的方法
  8. 实验报告(3)-语法分析
  9. 小程序中间放大轮播图_微信小程序实现类3D轮播图
  10. SQLAlchemy session 使用问题
  11. 第六章 字典(访问、修改、遍历)
  12. ISA防火墙策略配置以及服务器的发布
  13. JUL(java.util.logging)java原生官方日志 使用与配置--解决jul不输出显示日志问题
  14. QT 信号toggled triggered区别
  15. unity井字棋和一些重要概念(中山大学3D游戏作业2)
  16. netstat -ano 'netstat' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  17. teradata安装
  18. Scratch Blocks自定义组件之「点阵」
  19. 文本分类从入门到精通—代码展示
  20. android go分析和评述,Pathway和GO功能分析及显著性判断

热门文章

  1. 一款能生成NC文件(雕刻路径文件)的 inkscape ,想必很多人都找不到能用的
  2. 怎么解决家具企业管理的老难题,家具ERP管理系统给出答案
  3. 计算机科学性和标准型,2019级成考计算机科学与技术五年本科复习资料12月份考试资料线性代数复习资料...
  4. ubuntu18.04的Android环境配置
  5. postman 接口测试
  6. android电话拨号器源代码
  7. 宽屏欧式家具电子商务网站模板
  8. java avi转mp4
  9. 多线程MT和多线程MD的区别
  10. 电脑出现无法完成更新,正在撤销更改怎么解决