ESP8266学习笔记(11)——SNTP接口使用
一、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.c 的 user_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接口使用相关推荐
- Hadoop学习笔记—11.MapReduce中的排序和分组
Hadoop学习笔记-11.MapReduce中的排序和分组 一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出 ...
- ESP8266学习笔记(1)——搭建环境、编译烧写(NONOS SDK)
RTOS SDK环境搭建参看 ESP8266学习笔记(17)--搭建环境.编译烧写(RTOS SDK) 一.搭建环境 1.1 ESP8266 SDK 入门指南 官网下载:https://www.esp ...
- esp8266 蓝牙耳机_走进物联网智能家居-手把手带你制作wifi智能开关-ESP8266学习笔记(二)...
走进物联网智能家居-手把手带你制作wifi智能开关-ESP8266学习笔记(二) 2020-05-09 13:44:11 9点赞 72收藏 6评论 小编注:此篇文章来自即可瓜分10万金币,周边好礼达标 ...
- 【白帽子学习笔记11】DVWA Brute Force【暴力破解】
[白帽子学习笔记11]DVWA Brute Force Brute Force 就是暴力破解的意思,尝试常用的用户名和必然然后使用工具一个一个的去尝试 LOW级别 通过解析源码我们可以发现代码没有任何 ...
- SpringMVC:学习笔记(11)——依赖注入与@Autowired
SpringMVC:学习笔记(11)--依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...
- esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机
arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...
- HALCON 20.11:深度学习笔记(11)---目标检测
HALCON 20.11:深度学习笔记(11)---目标检测 HALCON 20.11.0.0中,实现了深度学习方法. 本章讲解了如何使用基于深度学习的对象检测. 通过对象检测,我们希望在图像中找到不 ...
- 台大李宏毅Machine Learning 2017Fall学习笔记 (11)Convolutional Neural Network
台大李宏毅Machine Learning 2017Fall学习笔记 (11)Convolutional Neural Network 本博客主要整理自: http://blog.csdn.net/x ...
- ESP8266学习笔记:实现ESP8266的局域网内通信
ESP8266学习笔记:实现ESP8266的局域网内通信 现在就以实例入手.工程使用的是IOT_DEMO,据DEMO文档可以知道ESP8266初始工作模式为softAP+station共存的模式.于是 ...
- PhalAPI学习笔记 ——— 第二章接口服务请求
PhalAPI学习笔记 --- 第二章接口服务请求 前言 接口服务请求 接口服务请求案例 自定义接口路由 开启匹配路由 配置路由规则 nginx apache 服务请求 结束语 前言 公司业务需要转学 ...
最新文章
- 基础通俗讲解集成学习算法
- python socket编程详细介绍
- PC-飞起来!我的Windows XP——五步快速优化Windows XP
- export_symbol能对变量使用吗_美缝剂能代替玻璃胶使用吗?
- php 简易验证码(GD库)
- Flask 和 Google App Engine 部署模型服务
- Mac系统设置系统搜索范围的方法
- 实验报告(3)-语法分析
- 小程序中间放大轮播图_微信小程序实现类3D轮播图
- SQLAlchemy session 使用问题
- 第六章 字典(访问、修改、遍历)
- ISA防火墙策略配置以及服务器的发布
- JUL(java.util.logging)java原生官方日志 使用与配置--解决jul不输出显示日志问题
- QT 信号toggled triggered区别
- unity井字棋和一些重要概念(中山大学3D游戏作业2)
- netstat -ano 'netstat' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- teradata安装
- Scratch Blocks自定义组件之「点阵」
- 文本分类从入门到精通—代码展示
- android go分析和评述,Pathway和GO功能分析及显著性判断