本来想从开源项目找找灵感的,但是!那些代码真烂!!!!!

开源项目免不了的就是抄抄抄代码,想知道 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同步时间相关推荐

  1. ESP32超详细学习记录:wifi配网,AP配网,浏览器配网,无线配网

    不想了解代码实现,可直接到代码部分copy!ESP32亲测可用. 使用设备ESP32开发板(ESP32-WROOM-32) 搜了好多别人写的资料,很多都是copy+copy,也没有什么解释.啪,代码放 ...

  2. ESP32超详细学习记录:wifi连接最基础方法

    2022年05月09日 ESP32连接WiFi 关键函数(抄自官方库.h文件) //WiFiSTA.h wl_status_t begin(const char* wpa2_ssid, wpa2_au ...

  3. [云计算学习3] Linux基础 : 使用chrony搭建时间服务器并让下游NTP同步时间

    Linux基础 : 使用chrony搭建时间服务器并让下游NTP同步时间 第一步 安装Chrony并设置开机启动 第二步 为主机1(服务器)搭建时间服务器 第二步 为主机2(客户端)同步主机1的NTP ...

  4. Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)

    所有示例使用的数据表均为Oracle提供的SQL基础数据表(t_employees.sql dept.sql emp.sql salgrade.sql) 熟练掌握多多练习即可达到完成后端开发所需具备的 ...

  5. Redis超详细学习

    Redis超详细学习 一.Redis入门 Redis是什么? Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内 ...

  6. stm32怎么加载字库_收藏 | STM32单片机超详细学习汇总资料(二)

    点击"蓝字"关注我们 3110月 收藏 | STM32单片机超详细学习汇总资料(一) ◆41.DMA仲裁器分为软件和硬件两种.软件部分分为4个等级,分别是很高优先级.高优先级.中等 ...

  7. 【超全】Go语言超详细学习知识体系

    Go语言超详细学习知识体系 Go编程入门 基础语法 环境安装 下载地址 https://golang.google.cn/dl/ GOPATH.GOROOT两个关键环境变量 基础结构 包的概念 程序执 ...

  8. 嵌入式设备ntp同步时间的一些笔记

    本文主要记录平常积累的关于ntp的东东. 为了连接ntp服务器,设备必须连外网,设置方法不尽相同,此处从略. ntp服务器有很多,但有些是用不了的.测试中用的是202.120.2.101,它是上海交通 ...

  9. 计算机假期计划内容,2019寒假计划,超详细学习计划表

    [导语]愉快的寒假已经开始了,基于拓宽知识面的目的,按时学习生活,做事有规律,度过一个快乐充实有意义的寒假,因此制定一个合理的寒假学习计划对初中孩子们是非常有必要的.下面为您制定具体计划如下.以下内容 ...

最新文章

  1. Android 基础 一 AndroidManifest.xml
  2. C语言-宏定义#define的用法
  3. 配置阿里巴巴的数据源
  4. 3.Java 面试题整理(线程篇)
  5. 当有多个设备online时,命令行窗口通过adb连接指定设备方法
  6. pb 数据窗口 *号隐藏_王者荣耀背后的腾讯自研数据库TcaplusDB实践
  7. 最简单的Qt配置opencv教程
  8. java xml字符串转换成对象_将XML字符串转换为对象
  9. 一个android本地txt阅读器的思路与实现
  10. 等保三级 MySql数据库通用测评知识
  11. 比特bit,字节Byte,带宽流量和流速的关系,存储容量单位
  12. 摩莎485通讯测试软件,485串口测试软件1.6 免费版
  13. R语言单因素分析案例
  14. uniapp打开pdf文件
  15. 【Linux】Linux常识28问
  16. 小麦苗的常用代码--常用命令(仅限自己使用)--下
  17. python如何停止子线程_【已解决】python 如何结束子线程呢
  18. 目录没有.kaggle文件夹的解决方法
  19. 通过深度学习进行高频传感器故障检测和预测性维护
  20. 基于MS的氢键分析脚本介绍

热门文章

  1. 在word中通过endnote打入文献标签
  2. 图像处理之角点检测与亚像素角点定位
  3. Google的招聘问题
  4. 追风去,不如造风来——致敬蚂蚁区块链创新大赛中的参与者们
  5. JMM到底如何理解?JMM与MESI到底有没有关系?
  6. QQ和360干起来了,中国互联网2大服务商进行白刃战
  7. java签到功能的实现_java实现的签到系统
  8. 基于多普勒效应的动作检测
  9. 唯样商城:从黑暗到光明,LED照明演变史知多少?内有彩蛋
  10. tar命令解压.zip文件出错:gzip: stdin has more than one entry--rest ignored