ESP32学习笔记(41)——SNTP接口使用

article/2025/8/21 23:14:35

一、SNTP简介

简单网络时间协议(Simple Network Time Protocol),由 NTP 改编而来,主要用来同步因特网中的计算机时钟。

SNTP 协议是用来同步本地的时间到 unix 时间戳。通常嵌入式设备上电,连接 AP(access point),获取 IP 地址后,就需要使用 SNTP 协议获取全球时间。以便于下一步的应用交互和使用。
SNTP 工作原理比较简单, 通俗来说,就是设备向 SNTP server 发送一包 SNTP 请求,服务器收到请求后回复一包 SNTP reply。其中 SNTP reply 中就含有 unix 时间戳。

ESP-IDF 编程指南——SNTP 时间同步

二、API说明

以下 SNTP 接口位于 lwip/include/apps/esp_sntp.h

2.1 sntp_setoperatingmode

2.2 sntp_setservername

2.3 sntp_set_time_sync_notification_cb

2.4 sntp_init

2.5 sntp_get_sync_status

三、示例代码

根据 examples\protocols\sntp 中的例程修改

在 menuconfig 中配置 SSID 和密码

核心部分:

//设置单播模式
sntp_setoperatingmode(SNTP_OPMODE_POLL);
//设置访问服务器
sntp_setservername(0, "pool.ntp.org");
//初始化SNTP模块
sntp_init();

完整代码:

/* LwIP SNTP exampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES ORCONDITIONS OF ANY KIND, either express or implied.
*/
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_attr.h"
#include "esp_sleep.h"
#include "nvs_flash.h"
#include "protocol_examples_common.h"
#include "esp_sntp.h"static const char *TAG = "example";static void obtain_time(void);
static void initialize_sntp(void);void time_sync_notification_cb(struct timeval *tv)
{ESP_LOGI(TAG, "Notification of a time synchronization event");
}void app_main(void)
{time_t now;struct tm timeinfo;time(&now);localtime_r(&now, &timeinfo);// Is time set? If not, tm_year will be (1970 - 1900).if (timeinfo.tm_year < (2021 - 1900)) {ESP_LOGI(TAG, "Time is not set yet. Connecting to WiFi and getting time over NTP.");obtain_time();// update 'now' variable with current timetime(&now);}char strftime_buf[64];while (1){// update 'now' variable with current timetime(&now);// Set timezone to China Standard Timesetenv("TZ", "CST-8", 1);tzset();localtime_r(&now, &timeinfo);strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);ESP_LOGI(TAG, "The current date/time in Shanghai is: %s", strftime_buf);vTaskDelay(10000 / portTICK_PERIOD_MS);}
}static void obtain_time(void)
{ESP_ERROR_CHECK( nvs_flash_init() );ESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK( esp_event_loop_create_default() );/* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.* Read "Establishing Wi-Fi or Ethernet Connection" section in* examples/protocols/README.md for more information about this function.*/ESP_ERROR_CHECK(example_connect());initialize_sntp();// wait for time to be settime_t now = 0;struct tm timeinfo = { 0 };int retry = 0;const int retry_count = 10;while (sntp_get_sync_status() == SNTP_SYNC_STATUS_RESET && ++retry < retry_count) {ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", retry, retry_count);vTaskDelay(2000 / portTICK_PERIOD_MS);}time(&now);localtime_r(&now, &timeinfo);ESP_ERROR_CHECK( example_disconnect() );
}static void initialize_sntp(void)
{ESP_LOGI(TAG, "Initializing SNTP");sntp_setoperatingmode(SNTP_OPMODE_POLL);sntp_setservername(0, "pool.ntp.org");sntp_set_time_sync_notification_cb(time_sync_notification_cb);sntp_init();
}

查看打印:

四、注意事项

  1. sntp_setservername 除了可以设置域名, 也可以设置 IP 地址, 例如 sntp_setservername(0, "120.25.115.20");
  2. 如果有必要, 请多设置几个 SNTP server,防止某个 SNTP server 暂时关闭服务而导致产品部分功能无法使用, 例如:
sntp_setservername(0, "ntp1.aliyun.com");
sntp_setservername(1, "210.72.145.44");		// 国家授时中心服务器 IP 地址
sntp_setservername(2, "1.cn.pool.ntp.org");        

说明:
默认情况下, ESP8266/ESP32 只允许开启一个 SNTP server(节省资源考虑), 如果用户需开启多个 SNTP server, 请配置:

  • ESP8266 请在 make menuconfig -> Component config -> LWIP -> DHCP -> Maximum bumber of NTP servers 修改为 3
  • ESP32 请在 make menuconfig -> Component config -> LWIP -> SNTP -> Maximum bumber of NTP servers 修改为 3

配置多个 SNTP server 时, 不是同时发送多个 SNTP 请求报文, 而是轮循方式. 第一个处理超时后, 进行和第二个 SNTP server 交互, 这样依次进行到最后一个, 最后一个处理超时后, 会再和第一个 SNTP server 交互

  1. 更新时间请求间隔SNTP_UPDATE_DELAY,到下一次发起更新时间请求的间隔时间,单位是ms,最小不能小于15s,也是通过make menuconfig修改CONFIG_LWIP_SNTP_UPDATE_DELAY
    在 make menuconfig -> Component config -> LWIP -> SNTP -> Request interval to update time (ms).

  2. 最好不在任何 callback 或中断处理函数中调用 obtain_time(), callback/中断中, 调用任何阻塞的 API, 理论上都有死锁的可能.

  3. 任何有校验服务器证书的 TLS 过程 (本地有 CA 证书), 请务必开启 SNTP 功能, 否则会因为校验服务器证书有效期失败而导致 TLS 握手失败

  4. NTP.ORG.cn中国NTP授时快速域名服务提供商

新加坡sgp.ntp.org.cn韩国kr.ntp.org.cn
中国cn.ntp.org.cn中国教育网edu.ntp.org.cn
中国香港hk.ntp.org.cn中国台湾tw.ntp.org.cn
美国us.ntp.org.cn韩国kr.ntp.org.cn
日本jp.ntp.org.cn德国de.ntp.org.cn
印度尼西亚ina.ntp.org.cn
  1. 时区:
  • CST-8:这时区的表示有点混
    CST却同时可以代表如下 4 个不同的时区:
    Central Standard Time (USA) UT-6:00
    Central Standard Time (Australia) UT+9:30
    China Standard Time UT+8:00
    Cuba Standard Time UT-4:00
setenv("TZ", "CST-8", 1);
  • GMT:(Greenwich Mean Time)是格林尼治平时
    GMT+8正好是中国的标准时区
setenv("TZ", "GMT+8", 1);
  1. 在成功获取了网络时间后,必须调用 sntp_stop(); 停止NTP请求,不然设备重启后会造成获取网络时间失败的现象,大概是服务器时根据心跳时间来删除客户端的,如果不是stop结束的客户端,下次连接服务器时就会出错

• 由 Leung 写于 2021 年 7 月 30 日

• 参考:ESP8266/ESP32 基础篇: 时间同步 SNTP 介绍和使用
    ESP32 SNTP配置
    ESP32的SDK开发之获取SNTP网络时间


http://chatgpt.dhexx.cn/article/PJZVddFG.shtml

相关文章

物联网专题27:SNTP

什么是SNTP&#xff08;Simple Network Time Protocol&#xff09;&#xff1f;简单时钟控制协议&#xff0c;主要用来同步因特网中的计算机时钟。 SNTP&#xff0c;使用的默认端口号是 UDP123。 ESP8266中&#xff0c;SNTP相关的API&#xff1a; 1 设置SNTP服务器&#xff08…

ESP8266-----SNTP获取网络时间

目录 前言 user_init IP定时的回调函数 初始化SNTP SNTP定时回调函数 前言 介绍了8266如何获取网络时间 user_init 首先将8266设置为sta模式 void ICACHE_FLASH_ATTR user_init(void) {uart_init(115200,115200); // 初始化串口波特率os_delay_us(10000); // 等待串口…

微软 sntp服务器地址,电脑sntp服务器地址

电脑sntp服务器地址 内容精选 换一换 当创建文件系统后&#xff0c;您需要使用云服务器来挂载该文件系统&#xff0c;以实现多个云服务器共享使用文件系统的目的。本章节以Windows 2012版本操作系统为例进行NFS文件系统挂载&#xff0c;其他版本请参考以下主要步骤根据实际界面…

ESP32 SNTP设置

SNTP&#xff0c;Simple Network Time Protocol&#xff08;简单网络时间协议&#xff09;&#xff0c;用来同步时钟。 百度百科&#xff1a;[SNTP](https://baike.baidu.com/item/sntp/4749147?fraladdin) SNTP协议采用客户端/服务器的工作方式&#xff0c;可以采用单播&…

sntp服务器位置,sntp的服务器地址

sntp的服务器地址 内容精选 换一换 介绍常见的安全组配置示例。如下示例中,出方向默认全通,仅介绍入方向规则配置方法。不同安全组内的云耀云服务器内网互通仅允许特定 IP 地址远程连接云耀云服务器SSH远程连接Linux云耀云服务器RDP远程连接Windows云服务器公网ping云耀云服务…

sntp 校时问题

1、背景 由于项目中的数据对时间比较敏感&#xff0c;目前常常出现校时问题&#xff0c;导致时间偏差&#xff0c;出现曲线数据丢失和曲线数据重复等问题。 因此对sntp源码进行深入分析。 要了解SNTP&#xff0c;首先需要了解NTP协议。SNTP是NTP的子集&#xff0c;简化了NTP…

ESP8266_SNTP(Simple Network Time Protocol)

1、SNTP 简单网络时间协议 SNTP协议采用客户端/服务器的工作方式&#xff0c;以UDP方式通信&#xff0c;SNTP服务器通过接收GPS信号或自带的原子钟作为系统的时间基准。 网络中存在很多台SNTP服务器&#xff0c;客户端会选择几台SNTP服务器使用。如果一台SNTP服务器在工作过程…

WIFI学习六(SNTP)

简介 SNPT&#xff08;Simple Network Time Protocal简单网络时间协议&#xff09;用于跨广域网或局域网时间同步的协议&#xff0c;具有较高的精确度&#xff08;几十毫秒&#xff09;。SNTP是NTP协议的简化版 SNTP的工作方式 SNTP协议采用客户端/服务器的工作方式&#xff0…

SNTP简介

要了解SNTP&#xff0c;首先需要了解NTP协议。SNTP是NTP的子集&#xff0c;简化了NTP的许多算法和步骤&#xff0c;得到了效率&#xff0c;但时间的精度不如NTP&#xff0c;可是对于民用时间来说足够了&#xff0c;大概最多差距几秒的样子。 NTP&#xff08;Network Time Proto…

SNTP原理讲解 客户端 C语言实现

1.定义 SNTP(Simple Network Time Protocal简单网络时间协议)&#xff0c;用于跨广域网或局域网同步时间的协议&#xff0c;具有较高的精确度&#xff08;几十毫秒&#xff09; 这里给出SNTP的详细定义和解释&#xff0c;以及基于C语言的SNTP客户端实现代码&#xff1a;SNTP c…

使用SNTP协议获取时间

要了解SNTP,首先需要了解NTP协议。SNTP是NTP的子集,简化了NTP的许多算法和步骤,得到了效率,但时间的精度不如NTP,可是对于民用时间来说足够了,大概最多差距几秒的样子。 NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服…

sntp协议简介

SNTP(Simple Network Time Protocal简单网络时间协议)&#xff0c;用于跨广域网或局域网同步时间的协议&#xff0c;具有较高的精确度&#xff08;几十毫秒&#xff09;。SNTP是NTP协议的简化版&#xff0c;两者分别在RFC1305和RFC2030介绍。 SNTP工作方式 SNTP采用客户端/服务…

关于马尔可夫过程的一些学习笔记

①马尔可夫性质&#xff1a;已知“现在”的情况下&#xff0c;“未来”与“过去”彼此独立&#xff08;N1仅与N有关&#xff0c;与N以前的所有都无关&#xff09; ②马尔可夫过程&#xff1a;具有马尔可夫性质的随机过程 ③马尔可夫链&#xff1a;马尔可夫过程的原始模型&…

来聊聊马尔可夫过程

相信你对马尔科夫这个词一定不陌生&#xff0c;因为在人工智能机器学习领域&#xff0c;这个词是避不开的&#xff0c;如马尔可夫链&#xff08;Markov chain)&#xff0c;马尔科夫随机场(Markov random field)&#xff0c;马尔可夫过程(Markov process)&#xff0c;隐马尔可夫…

【算法学习】马尔可夫过程及经典例题讲解(含代码实现)

公众号关注 52DATA &#xff0c;获得更多数据分析知识,感谢支持—> 文章目录 马尔可夫过程1. 马尔可夫性2. 马尔可夫链2.1 转移概率矩阵&#xff08;随机矩阵&#xff09;2.2 状态概率2.3 平稳分布 3.一个很经典的例题帮助理解马尔科夫预测方法1.求状态转移概率2.运用状态概…

数学基础(8)-- 马尔可夫链与马尔可夫过程

目录 1. 简介 1.1 定义 1.2 变种 2. 瞬态演变 3. 马尔科夫链性质 3.1 可还原性 3.2 周期性 3.3 重现性 4. 有限状态空间 1. 简介 马尔可夫链&#xff08;英语&#xff1a;Markov chain&#xff09;&#xff0c;又称离散时间马可夫链&#xff08;discrete-time Markov…

部分可观测马尔可夫过程POMDP

POMDP与MDP的一句话区别&#xff1a;POMDP的state具有不确定性&#xff0c;由七元数组定义&#xff0c;多了观测空间、观测函数、初始置信&#xff08;belief&#xff09;&#xff0c;根据观测概率矩阵求出最可能是的状态 利用值迭代法解决POMDP问题 MDP POMDP 状态→动作 信…

马尔可夫 java_马尔可夫过程(以马尔科夫链Markov为例)

马尔可夫过程(以马尔科夫链Markov为例) 马尔可夫过程 马尔可夫过程的大概意思就是未来只与现在有关&#xff0c;与过去无关。 简单理解就是渣男只在乎下一刻会不会爱你只取决于这一时刻对你的新鲜感&#xff0c;而与你之前对这段感情的付出毫无关系。 设有一个随机过程X(t)&…

马尔可夫决策过程

马尔可夫决策过程 一、马尔科夫决策过程&#xff1a;**马尔科夫决策过程****最优决策**值迭代策略迭代MDP中的参数估计 二、代码实战&#xff1a;A、马尔可夫决策过程值迭代B、马尔可夫决策过程策略迭代C、马尔可夫决策过程动态规划版 参考文章 本文介绍了马尔可夫决策过程&…

随机过程第2讲——马尔可夫过程的应用

温习&#xff1a;随机过程第1讲——泊松过程的模拟与检验&#xff1a;https://blog.csdn.net/ChenQihome9/article/details/82871332 去得也突然——不知在什么时候&#xff0c;雨&#xff0c;悄悄地停了。风也屏住了呼吸&#xff0c;山中一下变得非常幽静。远处&#xff0c;一…