C ++, как принудительно обновлять NTP каждые несколько минут и проверять, было ли обновление успешным - PullRequest
0 голосов
/ 06 декабря 2018

Я пишу фрагмент кода для небольшого устройства, которое должно выполнять циклическую синхронизацию 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-серверу.

...