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)

TCP/IP传输层协议实现 - TCP接收窗口/发送窗口/通告窗口(lwip)

如何通过lwip协议栈发送数据给上位机