• ESP32 之 ESP-IDF 教学(二十)—— SNTP校时


    本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!

    ↓↓↓通过下方对话框进入专栏目录页↓↓↓
    CSDN 请求进入目录       _ O x

    是否进入ESP32教学导航(基于ESP-IDF)?

           确定


    一、简介

    SNTP 指 简单网络时间协议(Simple Network Time Protocol),一个合格的物联网设备,少不了一个准确的钟。通过SNTP,可以使ESP32设备通过网络校准本地时间。使用起来也非常简单!

    二、示例

    1、场景一:最基础方式

    最简单+基础的方式

    sntp_setoperatingmode(SNTP_OPMODE_POLL);
    sntp_setservername(0, "ntp.aliyun.com");
    
    sntp_init();
    
    • 1
    • 2
    • 3
    • 4

    但此时,你的ESP32要已联网,否则肯定是获取不了的。

    接下来,你可以通过sntp_get_sync_status()轮询检测同步是否完毕,官方示例提供了这样的代码。除此之外。我们也可以通过回调来完成。更新成功之后,我们就随时可以获取系统时间了:

    首先设置时区方法(这只影响下文时间转换,不影响时间同步。如果你有自己的方法,则可以通过自己的方式设置):

    设置时区:

    setenv("TZ", "CST-8", 1);
    tzset();
    
    • 1
    • 2

    获取时间

    // 获取系统时间戳
    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2、场景二:使用回调

    sntp成功同步时间后,会有一个异步的回调通知应用做出相应更改,例如:在LVGL等UI框架上弹窗等。只需要下边的函数

    sntp_set_time_sync_notification_cb(/* 需要的函数指针 */);
    
    • 1

    需要的函数声明为形如:

    void 函数名(struct timeval* tv);
    
    • 1

    例如

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3、场景三:主动立刻触发时间同步

    调用sntp_init()会立刻请求服务器同步一次时间。

    因此,我们需要主动同步时:
    先调用sntp_stop()、再调用sntp_init() 即可立刻同步一次时间。

    经过测试:一定要先stop!不然不会发起同步

  • 相关阅读:
    IP分片、TCP分段
    P7071 [CSP-J2020] 优秀的拆分
    PL/SQL Some Advanced Fundamental
    Linux学习-74-NTFS文件系统安装教程
    Top 15 开源3D分子蛋白质建模与渲染软件
    智能工厂和数字化车间有什么不同?
    Mysql调优
    计算机毕业设计Java高校贫困生信息管理系统(源码+系统+mysql数据库+lw文档)
    干货 | 在存储过程中使用事务来防止数据不一致
    Java框架-SpringMVC(基础使用+运行流程+拦截器+统一异常处理等详解)
  • 原文地址:https://blog.csdn.net/m0_50064262/article/details/126690030