ESP32S3基于espidf接入网络获取NTP时间

ESP32S3基于espidf接入网络获取NTP时间


  • 📌 相关篇《ESP32S3基于espidf接入网络配置介绍》
  • 📍官方相关SNTP 时间同步介绍文档:https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/system/system_time.html?highlight=ntp#sntp

✨本文不包含环境搭建等相关介绍内容,仅介绍ESP32接入Wi-Fi连接后,通过NTP获取时间相关的代码实现。

  • ESP32S3 wifi直接入网内容,可以参考上面的相关篇内容。

📘SNTP配置内容

  1. 配置 NTP 服务器

通过esp_sntp_setservername配置 NTP 服务器函数,设置 NTP 服务器地址。

  • 网络收集的NTP服务器地址参考
ntp1.aliyun.com 
ntp2.aliyun.com 
ntp3.aliyun.com 
ntp4.aliyun.com 
ntp5.aliyun.com 
ntp6.aliyun.com 
ntp7.aliyun.com
210.72.145.44  (国家授时中心服务器IP地址)
pool.ntp.org
cn.pool.ntp.org
  1. 初始化 SNTP 服务

使用 esp_sntp 组件初始化 SNTP 服务,并设置回调函数以在时间同步完成后执行操作。

// SNTP 初始化
void initialize_sntp() {ESP_LOGI(TAG, "Initializing SNTP");#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)// 设置时间服务器(默认使用 pool.ntp.org)esp_sntp_setoperatingmode(SNTP_OPMODE_POLL);// 添加 NTP 服务器esp_sntp_setservername(0, "pool.ntp.org"); // 默认服务器esp_sntp_setservername(1, "cn.pool.ntp.org"); // 中国 NTP 服务器esp_sntp_setservername(2, "ntp1.aliyun.com"); //阿里云 NTP 服务器// 初始化 SNTPesp_sntp_init();
#elsesntp_setoperatingmode(SNTP_OPMODE_POLL);sntp_setservername(0, "pool.ntp.org");sntp_setservername(1, "cn.pool.ntp.org");sntp_setservername(2, "ntp1.aliyun.com");sntp_init();// 初始化 SNTP
#endif// 设置时区(例如:北京时间 UTC+8)setenv("TZ", "CST-8", 1);tzset();
}
  1. 获取时间并打印

时间同步完成后,可以使用 time 函数或 localtime 函数获取当前时间,将时间结构体中的信息转换为可读的格式并打印。

// 打印当前时间
void print_current_time() {time_t now;struct tm timeinfo;char strftime_buf[64];// 获取当前时间戳time(&now);localtime_r(&now, &timeinfo); // 将时间戳转换为本地时间// 格式化时间strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);ESP_LOGI(TAG, "Current time: %s", strftime_buf);//Current time: Thu Jan 16 12:57:12 2025
}
  • 🔖单独参数打印
        // 打印当前时间的详细信息ESP_LOGI(TAG, "Current time: %04d-%02d-%02d %02d:%02d:%02d",timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday,timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);//Current time: 2025-01-16 12:57:12
  • 🔖使用asctime()函数打印
// 打印当前时间
void print_current_time() {time_t now;struct tm timeinfo;// 获取当前时间戳time(&now);// 将时间戳转换为本地时间localtime_r(&now, &timeinfo);// 打印时间戳ESP_LOGI(TAG, "Timestamp: %ld", now);// 使用 asctime 打印时间char *time_str = asctime(&timeinfo);if (time_str != NULL) {// 去掉 asctime 输出的换行符time_str[strlen(time_str) - 1] = '\0';ESP_LOGI(TAG, "Current time: %s", time_str);} else {ESP_LOGE(TAG, "Failed to convert time to string");}
}
  • 🔖格式化打印
// 打印当前时间戳和格式化时间
void print_timestamp() {time_t now;struct tm timeinfo;char strftime_buf[64];// 获取当前时间戳time(&now);// 打印时间戳ESP_LOGI(TAG, "Timestamp: %ld", now);// 将时间戳转换为本地时间localtime_r(&now, &timeinfo);// 格式化时间strftime(strftime_buf, sizeof(strftime_buf), "%Y-%m-%d %H:%M:%S", &timeinfo);ESP_LOGI(TAG, "Formatted time: %s", strftime_buf);
}
📙strftime 函数简介
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);
  • 参数
  • str:指向存储结果字符串的缓冲区。
    maxsize:缓冲区的最大长度。
    format:格式字符串,指定如何格式化时间。
    timeptr:指向 struct tm 结构体的指针,表示要格式化的时间。
  • 返回值
    返回写入缓冲区的字符数(不包括终止符 \0)。如果缓冲区长度不足,则返回 0。
📒格式字符串

strftime的格式字符串由普通字符和格式说明符组成。格式说明符以 % 开头,用于表示时间的不同部分。以下是一些常用的格式说明符:

格式说明符	描述		示例
%Y	年份(4 位数)	2023
%y	年份(2 位数)	23
%m	月份(01-1210
%d	日期(01-3112
%H	小时(24 小时制,00-2314
%I	小时(12 小时制,01-1202
%M	分钟(00-5934
%S	秒(00-5956
%A	完整的星期几名称	Wednesday
%a	缩写的星期几名称	Wed
%B	完整的月份名称	October
%b	缩写的月份名称	Oct
%p	AM 或 PM	PM
%Z	时区名称	CST
%z	时区偏移(相对于 UTC)	+0800
%F	日期(等同于 %Y-%m-%d)	2023-10-12
%T	时间(等同于 %H:%M:%S)	14:34:56
%c	完整的日期和时间	Wed Oct 12 14:34:56 2023
%x	本地日期表示	10/12/23
%X	本地时间表示	14:34:56
%%	百分号(%%

📄完整驱动代码

 #include "esp_err.h"
#include "esp_sntp.h"
#include "esp_netif.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"#define WIFI_SSID "########"	//注意替换wifi信息
#define WIFI_PASS "********"static const char *TAG = "NTP_TIME";void initialize_nvs() {esp_err_t ret = nvs_flash_init();// 初始化NVS, 并检查是否需要擦除NVSif (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {ESP_ERROR_CHECK(nvs_flash_erase());ret = nvs_flash_init();}ESP_ERROR_CHECK(ret);
}// SNTP 初始化
void initialize_sntp() {ESP_LOGI(TAG, "Initializing SNTP");#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)// 设置时间服务器(默认使用 pool.ntp.org)esp_sntp_setoperatingmode(SNTP_OPMODE_POLL);// 添加 NTP 服务器esp_sntp_setservername(0, "pool.ntp.org"); // 默认服务器esp_sntp_setservername(1, "cn.pool.ntp.org"); // 中国 NTP 服务器esp_sntp_setservername(2, "ntp1.aliyun.com"); //阿里云 NTP 服务器// 初始化 SNTPesp_sntp_init();
#elsesntp_setoperatingmode(SNTP_OPMODE_POLL);sntp_setservername(0, "pool.ntp.org");sntp_setservername(1, "cn.pool.ntp.org");sntp_setservername(2, "ntp1.aliyun.com");sntp_init();// 初始化 SNTP
#endif// 设置时区(例如:北京时间 UTC+8)setenv("TZ", "CST-8", 1);tzset();
}// 打印当前时间
void print_current_time() {time_t now;struct tm timeinfo;// char buffer[64];// 获取当前时间戳time(&now);// 将时间戳转换为本地时间localtime_r(&now, &timeinfo);// 格式化时间// 使用 strftime 格式化时间// strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &timeinfo);// ESP_LOGI(TAG, "Formatted time: %s", buffer);// strftime(buffer, sizeof(buffer), "%A, %B %d, %Y %I:%M:%S %p", &timeinfo);// ESP_LOGI(TAG, "Formatted time: %s", buffer);// strftime(buffer, sizeof(buffer), "Today is %A, %B %d, %Y. The time is %I:%M %p.", &timeinfo);// ESP_LOGI(TAG, "Formatted time: %s", buffer);// 使用 asctime 打印时间char *time_str = asctime(&timeinfo);if (time_str != NULL) {// 去掉 asctime 输出的换行符time_str[strlen(time_str) - 1] = '\0';ESP_LOGI(TAG, "Current time: %s", time_str);} else {ESP_LOGE(TAG, "Failed to convert time to string");}
}
//事件回调
void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {esp_wifi_connect();} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {esp_wifi_connect();} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;ESP_LOGI("WIFI", "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));ESP_LOGI(TAG, "Wi-Fi connected, initializing SNTP...");initialize_sntp();}
}void initialize_wifi() {esp_netif_init();esp_event_loop_create_default();esp_netif_create_default_wifi_sta();wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));// 注册WiFi事件处理程序ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL));// 注册IP事件处理程序wifi_config_t wifi_config = {.sta = {.ssid = WIFI_SSID,.password = WIFI_PASS,},};ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));// 设置为STA模式ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));// 设置WiFi配置ESP_ERROR_CHECK(esp_wifi_start());// 启动WiFi
}// 打印 Wi-Fi 信息
void print_wifi_info() {wifi_config_t wifi_config;esp_wifi_get_config(ESP_IF_WIFI_STA, &wifi_config);esp_netif_ip_info_t ip_info;esp_netif_t* netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");if (netif && esp_netif_get_ip_info(netif, &ip_info) == ESP_OK) {ESP_LOGI(TAG, "Wi-Fi SSID: %s", (char*)wifi_config.sta.ssid);ESP_LOGI(TAG, "Wi-Fi Password: %s", (char*)wifi_config.sta.password);ESP_LOGI(TAG, "IP Address: " IPSTR, IP2STR(&ip_info.ip));} else {ESP_LOGE(TAG, "Failed to get IP information");}
}
void app_main(void)
{initialize_nvs();// 初始化NVSinitialize_wifi();  // 初始化Wi-Fiwhile (1){// 检查时间是否已同步time_t now;struct tm timeinfo;time(&now);localtime_r(&now, &timeinfo);//将时间戳转换为本地时间。// 打印当前时间的详细信息ESP_LOGI(TAG, "Current time: %04d-%02d-%02d %02d:%02d:%02d",timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday,timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);// 如果时间已同步(年份大于 2020)if (timeinfo.tm_year > (2020 - 1900)) {print_current_time();} else {ESP_LOGI(TAG, "Waiting for time synchronization...");}vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);print_wifi_info() ;}
}
  • 调试信息打印:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯选拔赛真题63】C++奇数 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

目录 C++奇数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 七、推荐资料 C++奇数 第十四届蓝桥杯青少年创意编程大赛C++选拔赛真题 一、题目要求 1、编程实现 给定两个正整数N和M(10≤N<M≤10000),请找出N到M…

(学习总结20)C++11 可变参数模版、lambda表达式、包装器与部分新内容添加

C11 可变参数模版、lambda表达式、包装器与部分新内容添加 一、可变参数模版基本语法及原理包扩展emplace系列接口 二、lambda表达式lambda表达式语法捕捉列表lambda的原理lambda的应用 三、包装器bindfunction 四、部分新内容添加新的类功能1.默认的移动构造和移动赋值2.声明时…

东芝e-STUDIO2829A复印机提示“维护”该如何操作

东芝e-STUDIO2829A复印机基本参数: 产品类型 数码复合机 颜色类型 黑白 涵盖功能 复印/打印/扫描 最大原稿尺寸 A3 处 理 器 500MHz 内存容量 标配:512MB,选配:1GB 供纸容量 标配纸盒:350页(A4),最大容…

春秋杯-WEB

SSTI 可以看到主页那里有个登录测试之后为ssti {{4*4}} fenjing梭哈即可得到payload {{((g.pop.__globals__.__builtins__.__import__(os)).popen(cat flag)).read()}}file_copy 看到题目名字为file_copy&#xff0c; 当输入路径时会返回目标文件的大小&#xff0c; 通…

警惕IDEA 2024版重大Bug问题:LomBok失效、Gradle冲突、Spring Boot启动错误

一直以来我认为工具类的软件是越新越好&#xff0c;因为工具代表着一定的先进性&#xff1b;但是IDEA 2024好好的给我上了一课&#xff0c;比如lombok 不起作用、比如Spring Boot 3.4.x 启动报错、再比如MyBatis log plus冲突、再比如Gradle插件冲突. 一、Lombok 失效问题 请不…

GPT-5 传言:一场正在幕后发生的 AI 变革

新的一年&#xff0c;让我们从一个引人入胜的话题开始&#xff1a;如果我告诉你&#xff0c;GPT-5 并非虚构&#xff0c;而是真实存在呢&#xff1f;它不仅真实存在&#xff0c;而且正在你看不见的地方悄然塑造着世界。我的基本假设是&#xff1a;OpenAI 已经秘密开发出 GPT-5&…

【Unity3D】利用Hinge Joint 2D组件制作绳索效果

目录 一、动态绳索 &#xff08;可移动根节点&#xff09; 二、静态绳索 三、利用Skinning Editor(Unity2022.3.15f1正常使用) 四、注意事项 一、动态绳索 &#xff08;可移动根节点&#xff09; 动态绳索 DynamicRope空物体 Anchor和whitecircle是相同位置的物体&#xff…

【12】Word:张老师学术论文❗

目录 题目 ​NO2 NO3 NO4 NO5 NO6 NO7.8 题目 NO2 布局→页面设置→纸张&#xff1a;A4→页边距&#xff1a;上下左右边距→文档网格&#xff1a;只指定行网格→版式&#xff1a;页眉和页脚&#xff1a;页脚距边界&#xff1a;1.4cm居中设置论文页码&#xff1a;插入…

每日进步一点点(网安)

今日练习题目是PHP反序列化&#xff0c;也学习一下说明是序列化和反序列化 1.PHP序列化 序列化是指将数据结构或对象转换为可传输或可储存的格式的过程。这通常需要将数据转换为字节流或者其他编码格式&#xff0c;以便在不同系统和应用程序之间进行传输或存储 在PHP中&…

【专题一 递归】21. 合并两个有序链表

1.题目解析 2.讲解算法原理 解法:递归-> 重复的子问题 重复子问题 ->函数头的设计 合并两个有序链表--->Node dfs(l1&#xff0c;l2) 只关心某一个子问题在做什么事情 ->函数体的设计 比大小l1→next dfs( l1.next, l2)return l1 递归的出口 if(l1null)return l2…

OpenCV基础:获取子矩阵的几种方式

目录 相关阅读 方法一&#xff1a;使用切片操作 方法二&#xff1a;使用高级索引 方法三&#xff1a;使用条件筛选 方法四&#xff1a;使用 numpy 的 take 函数 相关阅读 OpenCV基础&#xff1a;矩阵的创建、检索与赋值-CSDN博客 OpenCV基础&#xff1a;图像运算-CSDN博客…

Visual Studio Community 2022(VS2022)安装方法

废话不多说直接上图&#xff1a; 直接上步骤&#xff1a; 1&#xff0c;首先可以下载安装一个Visual Studio安装器&#xff0c;叫做Visual Studio installer。这个安装文件很小&#xff0c;很快就安装完成了。 2&#xff0c;打开Visual Studio installer 小软件 3&#xff0c…

学习threejs,使用OrbitControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.OrbitControls 相机控…

【2024年华为OD机试】 (B卷,100分)- 流水线(Java JS PythonC/C++)

一、问题描述 题目描述 一个工厂有 m 条流水线&#xff0c;来并行完成 n 个独立的作业&#xff0c;该工厂设置了一个调度系统&#xff0c;在安排作业时&#xff0c;总是优先执行处理时间最短的作业。 现给定流水线个数 m&#xff0c;需要完成的作业数 n&#xff0c;每个作业…

opencv图像基础学习

2.3图像的加密解密 源码如下&#xff1a; import cv2 import numpy as np import matplotlib.pyplot as plt def passImg():imgcv2.imread(./image/cat.jpg,0)h,wimg.shape#生成一个密码&#xff0c;加密key_imgnp.random.randint(0,256,size(h,w),dtypenp.uint8)img_addmcv2…

【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在当今数字化浪潮汹涌澎湃的时代&#xff0c;零售行业正站在转型升级的十字路口。市场竞争的白热化使得企业必须另辟蹊径&#xff0…

Navicat Premium 原生支持阿里云 PolarDB 数据库

近日&#xff0c;我司旗下的 Navicat Premium 软件通过了阿里云 PolarDB 数据库产品生态集成认证&#xff0c;这标志着 Navicat 通过原生技术全面实现了对秒级弹性、高性价比、稳定可靠的PolarDB 数据库三大引擎&#xff08;PolarDB MySQL版、PolarDB PostgreSQL版和 PolarDB f…

【SpringBoot应用篇】SpringBoot+MDC+自定义Filter操作traceId实现日志链路追踪

【SpringBoot应用篇】SpringBootMDC自定义Filter操作traceId实现日志链路追踪 解决的问题解决方案MDC具体逻辑ymllogback-spring.xmlTraceIdUtil操作工具类TraceIdFilter自定义过滤器GlobalExceptionHandler全局异常处理类TraceIdAspect切面UserController测试验证 多线程处理M…

python如何解析word文件格式(.docx)

python如何解析word文件格式&#xff08;.docx&#xff09; .docx文件遵从开源的“Office Open XML标准”&#xff0c;这意味着我们能用python的文本操作对它进行操作&#xff08;实际上PPT和Excel也是&#xff09;。而且这并不是重复造轮子&#xff0c;因为市面上操作.docx的…

python爬虫报错日记

python爬虫报错日记 类未定义 原因&#xff1a;代码检查没有问题**&#xff0c;位置错了**&#xff0c;测试代码包含在类里…… UnicodedecodeError错误 原因&#xff1a;字符没有自动转换成utf-8格式 KeyError&#xff1a;“href” 原因&#xff1a;前面运行正常&#x…