Как приложение SNTP компонента lwip устанавливает время получения?

Я пытаюсь узнать время с помощью LWIP и приложения SNTP на плате разработчика Nucleo-F429ZI с использованием STM32Cube, документация по LWIP перечисляет методы инициализации и т. Д., Но ничего не дает о том, как вы на самом деле считываете время. Я предполагаю, что что-то работает в потоке в фоновом режиме, но без чтения и понимания стека LWIP это выше меня.

Есть какие-нибудь указания о том, как просто читать время? Тогда я могу просто сохранять это в RTC один раз в день.


person Richard Handley    schedule 21.05.2020    source источник


Ответы (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.

person Bayrem Gharsellaoui    schedule 12.11.2020