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.pswp.cn/web/66318.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66318.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66318.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

性能測試 - Locust WebSocket client

Max.Bai 2024.10 0. 背景 Locust 是性能測試工具,但是默認只支持http協議,就是默認只有http的client,需要其他協議的測試必須自己擴展對于的client,比如下面的WebSocket client。 1. WebSocket test Client “”“ Max.Bai W…

【藍橋杯選拔賽真題63】C++奇數 第十四屆藍橋杯青少年創意編程大賽 算法思維 C++編程選拔賽真題解

目錄 C++奇數 一、題目要求 1、編程實現 2、輸入輸出 二、算法分析 三、程序編寫 四、運行結果 五、考點分析 七、推薦資料 C++奇數 第十四屆藍橋杯青少年創意編程大賽C++選拔賽真題 一、題目要求 1、編程實現 給定兩個正整數N和M(10≤N<M≤10000),請找出N到M…

KubeSphere 與 Pig 微服務平臺的整合與優化:全流程容器化部署實踐

一、前言 近年來,為了滿足越來越復雜的業務需求,我們從傳統單體架構系統升級為微服務架構,就是把一個大型應用程序分割成可以獨立部署的小型服務,每個服務之間都是松耦合的,通過 RPC 或者是 Rest 協議來進行通信,可以按照業務領域來劃分成獨立的單元。但是微服務系統相對…

(學習總結20)C++11 可變參數模版、lambda表達式、包裝器與部分新內容添加

C11 可變參數模版、lambda表達式、包裝器與部分新內容添加 一、可變參數模版基本語法及原理包擴展emplace系列接口 二、lambda表達式lambda表達式語法捕捉列表lambda的原理lambda的應用 三、包裝器bindfunction 四、部分新內容添加新的類功能1.默認的移動構造和移動賦值2.聲明時…

Linux的常用命令(一)

目錄 一、文件處理命令 1.文件處理命令ls 2.文件處理命令cd 3.文件處理命令pwd 4.文件處理命令touch 5.文件處理命令mkdir 6.文件處理命令cp 7.文件處理命令mv 8.文件處理命令rm 9.文件處理命令cat 10.文件處理命令more 11.文件處理命令head 12.文件處理命令tail …

東芝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 失效問題 請不…

《深度學習神經網絡訓練:數據集下載資源列表》

深度學習神經網絡訓練&#xff1a;數據集下載資源列表 一、數據集下載的重要性 在當今數字化時代&#xff0c;數據集下載對于各個領域的研究與發展都具有不可忽視的重要意義。尤其在機器學習、深度學習以及各類數據驅動的科研項目中&#xff0c;數據集更是起到了基礎性的支撐…

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;插入…

OpenCV相機標定與3D重建(56)估計物體姿態(即旋轉和平移)的函數solvePnPRansac()的使用

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 使用RANSAC方案從3D-2D點對應關系中找到物體的姿態。 cv::solvePnPRansac 是 OpenCV 中用于估計物體姿態&#xff08;即旋轉和平移&#xff09;的…

怎么用python寫個喚醒睡眠電腦的腳本?

環境&#xff1a; win10 python3.12 問題描述&#xff1a; 怎么用python寫個喚醒睡眠電腦的腳本&#xff1f; 解決方案&#xff1a; 1.喚醒處于睡眠狀態的電腦通常不是通過編程直接實現的&#xff0c;而是依賴于硬件和操作系統提供的特性。對于Windows系統&#xff0c;可…

基于 HTML5 Canvas 制作一個精美的 2048 小游戲--day 1

基于 HTML5 Canvas 制作一個精美的 2048 小游戲 在這個快節奏的生活中&#xff0c;簡單而富有挑戰性的游戲總能給我們帶來樂趣。2048 是一款受歡迎的益智游戲&#xff0c;不僅考驗智力&#xff0c;還能讓人回味無窮。今天&#xff0c;我帶領大家將一起學習如何使用 HTML5 Canv…

每日進步一點點(網安)

今日練習題目是PHP反序列化&#xff0c;也學習一下說明是序列化和反序列化 1.PHP序列化 序列化是指將數據結構或對象轉換為可傳輸或可儲存的格式的過程。這通常需要將數據轉換為字節流或者其他編碼格式&#xff0c;以便在不同系統和應用程序之間進行傳輸或存儲 在PHP中&…

MySQL數據庫入門到大蛇尚硅谷宋紅康老師筆記 基礎篇 part 5

第05章_排序與分頁 排序 #第05章_排序與分頁#1. 排序# 如果沒有使用排序操作&#xff0c;默認情況下查詢返回的數據是按照添加數據的順序顯示的。 SELECT * FROM employees;# 1.1 基本使用 # 使用 ORDER BY 對查詢到的數據進行排序操作。 # 升序&#xff1a;ASC (ascend) # 降…

【專題一 遞歸】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博客…

Java語言的數據結構

Java 提供了多種內置的數據結構&#xff0c;這些數據結構可以分為兩大類&#xff1a;基本的數組&#xff08;Array&#xff09;和集合框架&#xff08;Collections Framework&#xff09;。集合框架又細分為多個接口和實現類&#xff0c;提供了豐富的功能來管理對象集合。以下是…