文章目录
- 一、简介
- 二、示例
- 1、场景一:最基础方式
- 2、场景二:使用回调
- 3、场景三:主动立刻触发时间同步
一、简介
SNTP 指 简单网络时间协议(Simple Network Time Protocol),一个合格的物联网设备,少不了一个准确的钟。通过SNTP,可以使ESP32设备通过网络校准本地时间。使用起来也非常简单!
二、示例
1、场景一:最基础方式
最简单+基础的方式
sntp_setoperatingmode(SNTP_OPMODE_POLL);
sntp_setservername(0, "ntp.aliyun.com");
sntp_init();
但此时,你的ESP32要已联网,否则肯定是获取不了的。
接下来,你可以通过sntp_get_sync_status()
轮询检测同步是否完毕,官方示例提供了这样的代码。除此之外。我们也可以通过回调来完成。更新成功之后,我们就随时可以获取系统时间了:
首先设置时区方法(这只影响下文时间转换,不影响时间同步。如果你有自己的方法,则可以通过自己的方式设置):
设置时区:
setenv("TZ", "CST-8", 1);
tzset();
获取时间
// 获取系统时间戳
time_t now = 0;
time(&now);
// 结合设置的时区,转换为tm结构体
struct tm timeinfo = {0};
localtime_r(&now, &timeinfo);
// 转为字符串(方法随意,不一定要用strftime)
char str[64];
strftime(str, sizeof(str), "%c", &timeinfo);
2、场景二:使用回调
当sntp
成功同步时间后,会有一个异步的回调通知应用做出相应更改,例如:在LVGL等UI框架上弹窗等。只需要下边的函数
sntp_set_time_sync_notification_cb(/* 需要的函数指针 */);
需要的函数声明为形如:
void 函数名(struct timeval* tv);
例如
void fun(struct timeval* tv) {
time_t now = 0;
struct tm timeinfo = {0};
time(&now);
localtime_r(&now, &timeinfo);
char str[64];
strftime(str, sizeof(str), "%c", &timeinfo);
ESP_LOGI("TAG", "time updated: %s", str);
}
3、场景三:主动立刻触发时间同步
调用sntp_init()
会立刻请求服务器同步一次时间。
因此,我们需要主动同步时:
先调用sntp_stop()
、再调用sntp_init()
即可立刻同步一次时间。
经过测试:一定要先stop!不然不会发起同步