文章目录

  • 一、简介
  • 二、示例
  • 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!不然不会发起同步