ESP32使用NTP同步時間


ESP32在連接了WiFi以后,可以使用NTP來校對本機時間,否則默認的Unix時間戳從0開始。代碼如下:

#include <esp32-hal.h>
#include <lwip/apps/sntp.h>
#include <stdarg.h>
#include <stdlib.h>
#include <time.h>

/**
 * @brief 設置時區和NTP服務器和並校對時間
 * @param[in] posix_tz 表示posix規范的時間戳。例如"UTC-8"表示東八區(北京時間)
 * @param[in] server_cnt NTP服務器的數量,超過三個的會被拋棄
 * @param[in] ... NTP服務器,C風格字符串指針類型,數量應與server_cnt對應
 * @attention 函數不會保證WiFi連接正常
 * @example set_time("UTC-8", 3, "time2.cloud.tencent.com", "ntp1.aliyun.com", "ntp.ntsc.ac.cn");
 * @example set_time("UTC+6", 2, "time2.cloud.tencent.com", "192.168.0.2");
 */
void set_time(const char *const posix_tz, const int server_cnt, ...)
{
	sntp_setoperatingmode(SNTP_OPMODE_POLL);
	va_list ap;
	va_start(ap, server_cnt);
	if (server_cnt > 3)        // sntp_setservername最多支持3個地址
		server_cnt = 3;    // 超過三個的地址會被拋棄
	for (int i = 0; i < server_cnt; ++i)
		sntp_setservername(i, va_arg(ap, char *));
	va_end(ap);
	sntp_init();
	setenv("TZ", posix_tz, 1);
	tzset();
	while (time(NULL) < 1580000000) // 阻塞,直到時間同步
		yield();
	sntp_stop();
}

在使用時,我們可以這樣調用函數:

set_time("UTC-8", 3, "time2.cloud.tencent.com", "ntp1.aliyun.com", "ntp.ntsc.ac.cn");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM