lwip组件的SNTP app如何设置接收时间?
Posted
技术标签:
【中文标题】lwip组件的SNTP app如何设置接收时间?【英文标题】:How does the SNTP app of the lwip component set the time it receives? 【发布时间】:2020-09-07 23:29:57 【问题描述】:我正在尝试使用 LWIP 和使用 STM32Cube 的 Nucleo-F429ZI 开发板上的 SNTP 应用程序读取时间,LWIP 的文档列出了初始化方法等,但没有提供您实际读取时间的方式。我猜有些东西在后台的线程上运行,但是没有阅读和理解 LWIP 堆栈,这超出了我的范围。
关于如何简单地读取时间的任何指针?然后我可以简单地将其存储到 RTC 中,每天一次。
【问题讨论】:
【参考方案1】:LwIP SNTP 应用通过定期从服务器获取时间并将其保存到用户提供的系统时间(在您的情况下为 RTC)来工作。
1. 为此,您首先需要向 SNTP 应用程序提供自己的函数来设置 RTC 时间,这可以在 sntp.c 中像以下那样完成:
.
.
#include "your_rtc_driver.h"
.
.
/* Provide your function declaration */
static void sntp_set_system_time_us(u32_t t, u32_t us);
.
.
/* This is the macro that will be used by the SNTP app to set the time every time it contacts the server */
#define SNTP_SET_SYSTEM_TIME_NTP(sec, us) sntp_set_system_time_us(sec, us)
.
.
/* Provide your function definition */
static void sntp_set_system_time_us(sec, us)
your_rtc_driver_set_time(sec, us);
2.现在要在您的应用中使用 SNTP,请确保在您的 lwipopts.h 文件中启用以下 SNTP 定义,如下所示:
#define SNTP_SUPPORT 1
#define SNTP_SERVER_DNS 1
#define SNTP_UPDATE_DELAY 86400
3. 然后在您的用户代码中:
#include "lwip/apps/sntp.h"
.
.
.
/* Configure and start the SNTP client */
sntp_setoperatingmode(SNTP_OPMODE_POLL);
sntp_setservername(0, "pool.ntp.org");
sntp_init();
.
.
.
/* Now if you read the RTC you'll find the date and time set by the SNTP client */
read_date_time_from_rtc();
就是这样,现在每 SNTP_UPDATE_DELAY 毫秒,SNTP 应用程序将从服务器读取时间并将其保存到 RTC,您需要在代码中做的就是启动 SNTP 应用程序并从 RTC 读取。
【讨论】:
以上是关于lwip组件的SNTP app如何设置接收时间?的主要内容,如果未能解决你的问题,请参考以下文章
TCP/IP传输层协议实现 - TCP报文接收/发送(lwip)
uCOSII +Lwip移植,如何解决以太网接受数据阻塞的问题
TCP/IP应用层协议实现 - 数据收发send/recv(lwip)
TCP/IP应用层协议实现 - 数据收发send/recv(lwip)