ESP32超详细学习记录:NTP同步时间
本来想从开源项目找找灵感的,但是!那些代码真烂!!!!!
开源项目免不了的就是抄抄抄代码,想知道 NTP 是怎么实现的还要读那一堆烂代码,烦!
就算开源项目能怎么样!不还是一样的 烂!代!码!
自己想办法看看 NTP 的相关库是怎么实现的吧。
可以使用 aliyun 的 NTP 服务器。
发现不少开源项目都是用的 aliyun 的 NTP 服务器。
阿里云NTP服务器 - 云服务器 ECS - 阿里云https://help.aliyun.com/document_detail/92704.html
什么是NTP
NTP:Network Time Protocol(网络时间协议)
▶️ NTP 是用于同步网络中计算机时间的协议。它的用途是把计算机的时钟同步到世界协调时UTC。
UTC:Universal Time Coordinated(协调世界时)以原子时秒长为基础。
GMT:Universal Time(世界时)以地球自转为基础。
北京时间采用东八区的区时作为标准时间。北京时间比世界时(UTC)早8小时,北京时间=UTC+8。
使用 NTPClient 库获取时间
▶️ 如果使用 NTPClient 库,其实很简单很简单很简单!!
官方例程里就几个函数就实现了!就四个!
WiFiUDP ntpUDP; //创建UDP实例NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 60 * 60 * 8, 60000); //NTC//UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval//初始化函数
timeClient.begin();//获取时间
timeClient.update();
timeClient.getFormattedTime();
这样,就能直接获取 小时:分钟:秒 的格式的时间了。
有感而发:学习ESP32还是要学一学网络协议啊!
需要说明的函数:
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 60 * 60 * 8, 60000); //NTC//UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval
ntpUDP:UDP实例
"europe.pool.ntp.org":NTP服务器地址
60 * 60 * 8:是换算为东八区的时间需要的参数:秒*分钟*小时
60000:更新时间
在库接口中,只看到了星期、时、分、秒的接口!没有年、月、日。
#include <WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>const char *ssid = "<SSID>";
const char *password = "<PASSWORD>";WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);void setup()
{Serial.begin(115200);WiFi.begin(ssid, password);while ( WiFi.status() != WL_CONNECTED ) {delay ( 500 );Serial.print ( "." );}timeClient.begin();
}void loop()
{timeClient.update();Serial.println(timeClient.getFormattedTime());delay(1000);
}
如果想隔一段时间调用一次这种类似时间中断的功能,可引用 Ticker 库实现定时器功能。
ESP32核心库函数
在 ESP32 的核心文件夹下有 time.c 文件。定义了 configTime 函数用来配置时间。不需要引用头文件可以直接调用函数。
void configTime(long gmtOffset_sec, int daylightOffset_sec, const char* server1, const char* server2, const char* server3)
- gmtOffset_sec:世界时偏移量
- daylightOffset_sec:时间偏移
- server:服务器地址
在 time.c 文件中,还提供了其他的时间设置函数,包括设置时区、获取时区时间等等。
▶️ 获取本地时间,函数同样定义在 time.c 中,但是使用此函数需要 tm 类型的结构体存储时间!
tm 是定义在 C++ 库 time.h 中的结构体。
struct tm - C++ Referencehttps://cplusplus.com/reference/ctime/tm/
struct tm
{
//以下为常规日期
int tm_year; /* 年份,其值从1900开始 */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_sec; /* 秒–取值区间为[0,59] */ int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数–取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/ long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/
const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/
};
▶️ 如果是中国时间,需要注意的是年、月的时间问题!
函数示例:
此处函数参考了:Getting Date & Time From NTP Server With ESP32
#include "Arduino.h"
#include <WiFi.h>
#include "time.h" // 为了使用tm结构体const char* ssid = "<SSID>";
const char* password = "<PASSWORD>";struct tm timeinfo;void setup()
{Serial.begin(115200);Serial.printf("Connecting to %s ", ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println(" CONNECTED");configTime(60*60*8, 0, "ntp3.aliyun.com"); // 用的阿里云的服务器printLocalTime();WiFi.disconnect(true);WiFi.mode(WIFI_OFF);
}void loop()
{struct tm timeinfo;if(!getLocalTime(&timeinfo)){Serial.println("Failed to obtain time");return;}Serial.println(&timeinfo, "%A, %Y-%m-%d %H:%M:%S");delay(1000);
}
不出意外的情况下,会在串口打印如下类似信息:
也可以通过读取结构体的情况,取得
year = timeinfo.tm_year + 1900; // 年份从1900开始
month = timeinfo.tm_mon + 1; // 0表示1月
week = timeinfo.tm_wday; // 这里要注意这是返回的数字,并不是单词!
...
但是这种办法不能自动更新时间,就比较烦一点点!可以加 Ticker 来进行定时执行获取时间。
不使用NTP获取时间的方法:API
其实和前面获取心知天气的文章使用相同的方法:
心知天气天气状况获取,ESP32获取天气信息(含源码)_喜暖知寒的博客-CSDN博客_esp32获取天气ESP32获取天气信息https://blog.csdn.net/qq_41650023/article/details/124697234在网上找到了几个 API 的接口:
例如心知天气API返回的JSON数据:
苏宁返回的数据:http://quan.suning.com/getSysTime.do
甚至还能查网站的 GET 请求获取某些网站API
例如网站:现在北京时间 在线标准北京时间校对
在此网站找到了 GET 请求接口
可发现请求时间的 API 就是这个了:https://www.beijing-time.org/t/time.asp
请求返回值:
有些网站的 API 比较好找,有些比较难找。在此只是提供一个想法!
ESP32超详细学习记录:NTP同步时间相关推荐
- ESP32超详细学习记录:wifi配网,AP配网,浏览器配网,无线配网
不想了解代码实现,可直接到代码部分copy!ESP32亲测可用. 使用设备ESP32开发板(ESP32-WROOM-32) 搜了好多别人写的资料,很多都是copy+copy,也没有什么解释.啪,代码放 ...
- ESP32超详细学习记录:wifi连接最基础方法
2022年05月09日 ESP32连接WiFi 关键函数(抄自官方库.h文件) //WiFiSTA.h wl_status_t begin(const char* wpa2_ssid, wpa2_au ...
- [云计算学习3] Linux基础 : 使用chrony搭建时间服务器并让下游NTP同步时间
Linux基础 : 使用chrony搭建时间服务器并让下游NTP同步时间 第一步 安装Chrony并设置开机启动 第二步 为主机1(服务器)搭建时间服务器 第二步 为主机2(客户端)同步主机1的NTP ...
- Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
所有示例使用的数据表均为Oracle提供的SQL基础数据表(t_employees.sql dept.sql emp.sql salgrade.sql) 熟练掌握多多练习即可达到完成后端开发所需具备的 ...
- Redis超详细学习
Redis超详细学习 一.Redis入门 Redis是什么? Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内 ...
- stm32怎么加载字库_收藏 | STM32单片机超详细学习汇总资料(二)
点击"蓝字"关注我们 3110月 收藏 | STM32单片机超详细学习汇总资料(一) ◆41.DMA仲裁器分为软件和硬件两种.软件部分分为4个等级,分别是很高优先级.高优先级.中等 ...
- 【超全】Go语言超详细学习知识体系
Go语言超详细学习知识体系 Go编程入门 基础语法 环境安装 下载地址 https://golang.google.cn/dl/ GOPATH.GOROOT两个关键环境变量 基础结构 包的概念 程序执 ...
- 嵌入式设备ntp同步时间的一些笔记
本文主要记录平常积累的关于ntp的东东. 为了连接ntp服务器,设备必须连外网,设置方法不尽相同,此处从略. ntp服务器有很多,但有些是用不了的.测试中用的是202.120.2.101,它是上海交通 ...
- 计算机假期计划内容,2019寒假计划,超详细学习计划表
[导语]愉快的寒假已经开始了,基于拓宽知识面的目的,按时学习生活,做事有规律,度过一个快乐充实有意义的寒假,因此制定一个合理的寒假学习计划对初中孩子们是非常有必要的.下面为您制定具体计划如下.以下内容 ...
最新文章
- Android 基础 一 AndroidManifest.xml
- C语言-宏定义#define的用法
- 配置阿里巴巴的数据源
- 3.Java 面试题整理(线程篇)
- 当有多个设备online时,命令行窗口通过adb连接指定设备方法
- pb 数据窗口 *号隐藏_王者荣耀背后的腾讯自研数据库TcaplusDB实践
- 最简单的Qt配置opencv教程
- java xml字符串转换成对象_将XML字符串转换为对象
- 一个android本地txt阅读器的思路与实现
- 等保三级 MySql数据库通用测评知识
- 比特bit,字节Byte,带宽流量和流速的关系,存储容量单位
- 摩莎485通讯测试软件,485串口测试软件1.6 免费版
- R语言单因素分析案例
- uniapp打开pdf文件
- 【Linux】Linux常识28问
- 小麦苗的常用代码--常用命令(仅限自己使用)--下
- python如何停止子线程_【已解决】python 如何结束子线程呢
- 目录没有.kaggle文件夹的解决方法
- 通过深度学习进行高频传感器故障检测和预测性维护
- 基于MS的氢键分析脚本介绍