Я пишу фрагмент кода для небольшого устройства, которое должно выполнять циклическую синхронизацию NTP с интервалом в 1 минуту (более или менее).Вот что я делаю:
sntp_setoperatingmode(SNTP_OPMODE_POLL);
if(sntp_getoperatingmode() != SNTP_OPMODE_POLL){
ESP_LOGE(TAG, "Error setting SNTP operating mode...");
return false;
}
sntp_setservername(0, (char*)NTP_SERVER);
sntp_init();
time(&now);
localtime_r(&now, &timeinfo);
while(timeinfo.tm_year < (2018 - 1900)){
vTaskDelay(1000 / portTICK_PERIOD_MS); // give some time to NTP...
time(&now);
localtime_r(&now, &timeinfo);
}
sntp_stop();
Первая синхронизация NTP проста и идет хорошо, со второй синхронизацией проблема будет в том, что системное время уже будет более или менее равным ожидаемому (дляобязательно значение tm_year), поэтому у меня нет способа понять, работает ли новая синхронизация с NTP или я все еще читаю системное время, установленное на предыдущей итерации (например, за 1 минуту до этого).Есть ли способ узнать, правильно ли синхронизируется NTP?
Конечно, я мог бы установить системное время в прошлом непосредственно перед началом новой синхронизации с NTP, чтобы условие tm_year было выполнено, но я хотел бы сохранитьцелостность системного времени на случай сбоя NTP.
Есть идеи?
РЕДАКТИРОВАТЬ: у меня много устройств, которые должны делать то же самое в то же время, поэтому они мне нужнысинхронизироваться как можно чаще с одним и тем же NTP-сервером.Поскольку я не могу предположить, что у меня есть доступ к реальному NTP-серверу (поскольку мои устройства не всегда будут подключены к сети), я написал функцию, которая вначале пытается синхронизироваться только на сервере из пула NTP, а затемпопробуйте с локальным сервером (который, я знаю, всегда доступен).Очевидно, что проблема заключается в том, что все устройства должны синхронизироваться с одним и тем же NTP-сервером, и я должен иметь возможность проверить, была ли синхронизация с реальным NTP-сервером успешной или нет, прежде чем продолжить необязательный запрос к локальному NTP-серверу.