Проверить обновление NTP-сервера — при запуске
У меня есть функция для запуска службы NTP сразу после подключения к Wi-Fi (с использованием платы ESP8266).
Время от времени я получаю сообщение об ошибке с указанием даты и времени01-01-1970
... что, как я полагаю, связано с тем, что сервер не доходит, как предполагалось.
Счетчик повторных попыток был добавлен, чтобы дать еще несколько повторных попыток, но почему-то у меня не получается, так как я никогда не получаю ожидаемое сообщение NTP CHECK: #
и номер повторной попытки (при этом получаю неверную дату) .
Я знаю, что NTP.begin()
возвращает логическое значение для описания успеха/неудачи при получении NTP-сервера
EDIT1: использование NtpClientLib
Как это сделать?
void startNTP() {
int counter = 0;
while ( !NTP.begin("pool.ntp.org", 2, true) && counter <=2){
Serial.print("NTP CHECK: #");
Serial.println(counter);
counter +=1;
delay(1000);
};
NTP.setInterval(clockUpdateInt); // в секундах
}
@Guy . D, 👍0
Обсуждение1 ответ
Прочитав код NTPClientLib, я бы сказал, что первая синхронизация даже не предпринимается в течение 1 секунды после вызова
NTP.begin()
в любом случае.
Вы можете сделать это
void startNTP() {
NTP.begin("pool.ntp.org", 2, true);
delay(2000); // по-видимому, есть задержка в 1 секунду перед первой попыткой синхронизации, задержка в 2 секунды позволяет сделать и получить запрос
int counter = 2;
while ( !NTP.getLastNtpSync() && counter <=2) {
Serial.print("NTP CHECK: #");
Serial.println(counter);
counter +=1;
delay(1000);
};
NTP.setInterval(clockUpdateInt); // в секундах
}
или вы можете сделать это
void loop() {
// код, который не зависит от действительного времени
//
// Допустим, этот фрагмент кода требует синхронизированного времени
if (NTP.getLastNtpSync()) {
// это будет работать только после того, как NTP будет синхронизирован хотя бы один раз
}
// больше кода, не требующего времени синхронизации
}
Теперь вы можете проверить, как долго не выполнялась синхронизация в вашем коде, и сделать что-нибудь, если это было слишком долго
- ESP8266: ошибка: 'getLocalTime' was not declared in this scope
- Как разобрать 20180810T143000Z в time_t
- Как найти разницу между двумя timestamp
- Установить time() на ESP8266
- ESP8266 ISO 8601 string to tm struct
- Каков идеальный способ проверить, готово ли время на ESP8266 через NTP?
- Время UNIX в мс в человеческую дату и время
- Не удалось изменить NtpClient для использования статического IP-адреса
какую библиотеку NTP вы используете? «никогда не получать ожидаемое сообщение NTP CHECK: # и номер повторной попытки» — это говорит о том, что NTP.begin возвращает **true**, @Jaromanda X
если вы используете библиотеку https://github.com/gmag11/NtpClient, то единственная причина, по которой start возвращает false, — это передача недопустимых аргументов, @Jaromanda X
@JaromandaX - я использую
NtpClientLib
- и ДА, я знаю, что результатtrue
, но все же дата указана ..., @Guy . Dдело в том, что нет смысла запускать begin снова и снова, поскольку он возвращает false только в том случае, если вы передаете недопустимые аргументы - поскольку вы передаете действительные аргументы, нет необходимости проверять... так, как я бы это сделал, в код, который зависит от действительного времени, проверьте
NTP.getLastNTPSync()
и пропустите код, если результат равен0
, @Jaromanda XНо это аргументы, которые не являются недействительными, @Guy . D
Как я уже сказал, они действительны, поэтому нет смысла проверять, возвращает ли .begin значение true... это так... но .begin не возвращает значение true после синхронизации времени! он возвращает true еще до попытки синхронизировать время, поэтому вам нужно проверить, когда время синхронизируется, @Jaromanda X