From de22fa250239a30ce130d2cf4981af8ea93e4e76 Mon Sep 17 00:00:00 2001 From: liulinna Date: Thu, 17 Mar 2022 18:45:36 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=91=E7=BB=9C=E7=8A=B6=E6=80=81=E4=B8=8D?= =?UTF-8?q?=E5=A5=BD=E6=97=B6=E9=97=B4=E6=97=B6=E5=8C=BA=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guduhanyan --- .../time_manager/include/ntp_update_time.h | 1 + services/time_manager/src/ntp_update_time.cpp | 56 ++++++++++++++++--- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/services/time_manager/include/ntp_update_time.h b/services/time_manager/include/ntp_update_time.h index 6daa234..47f5aa7 100644 --- a/services/time_manager/include/ntp_update_time.h +++ b/services/time_manager/include/ntp_update_time.h @@ -42,6 +42,7 @@ private: void SubscriberNITZTimeChangeCommonEvent(); void StartTimer(); void SetSystemTime(); + bool ThreadSetSystemTime(); void RefreshNextTriggerTime(); bool CheckStatus(); bool IsNITZTimeInvalid(); diff --git a/services/time_manager/src/ntp_update_time.cpp b/services/time_manager/src/ntp_update_time.cpp index 43505cb..7237286 100644 --- a/services/time_manager/src/ntp_update_time.cpp +++ b/services/time_manager/src/ntp_update_time.cpp @@ -32,13 +32,15 @@ using namespace std::chrono; namespace OHOS { namespace MiscServices { namespace { -constexpr uint64_t NANO_TO_MILESECOND = 1000000; +constexpr uint64_t NANO_TO_MILLISECOND = 1000000; constexpr uint64_t DAY_TO_MILLISECOND = 86400000; +constexpr uint64_t MINUTES_TO_SECOND = 60; const std::string AUTOTIME_FILE_PATH = "/data/misc/zoneinfo/autotime.json"; const std::string NETWORK_TIME_STATUS_ON = "ON"; const std::string NETWORK_TIME_STATUS_OFF = "OFF"; -const std::string NTP_CN_SERVER = "1.cn.pool.ntp.org"; +const std::string NTP_CN_SERVER = "ntp.aliyun.com"; const int64_t INVALID_TIMES = -1; +const int MAX_RETRY = 10; } NtpUpdateTime::NtpUpdateTime() {}; @@ -64,6 +66,19 @@ void NtpUpdateTime::Init() if (autoTimeInfo_.status == NETWORK_TIME_STATUS_ON) { SetSystemTime(); } + + std::thread([&]{ + for (int i = 0; i < MAX_RETRY; i++) { + if (!ThreadSetSystemTime()) { + TIME_HILOGE(TIME_MODULE_SERVICE, "thread set ntp time failed, retry"); + this_thread::sleep_for(seconds(MINUTES_TO_SECOND)); + } else { + TIME_HILOGD(TIME_MODULE_SERVICE, "thread set ntp time success"); + break; + } + } + }).detach(); + int32_t timerType = ITimerManager::TimerType::ELAPSED_REALTIME; auto callback = [this](uint64_t id) { this->RefreshNetworkTimeByTimer(id); @@ -91,7 +106,7 @@ void NtpUpdateTime::SubscriberNITZTimeChangeCommonEvent() } } -void NtpUpdateTime::RefreshNetworkTimeByTimer(const uint64_t timerId) +void NtpUpdateTime::_RefreshNetworkTimeByTimer(const uint64_t timerId) { if (!(CheckStatus())) { TIME_HILOGD(TIME_MODULE_SERVICE, "Network time status off."); @@ -109,7 +124,7 @@ void NtpUpdateTime::RefreshNetworkTimeByTimer(const uint64_t timerId) void NtpUpdateTime::UpdateNITZSetTime() { auto BootTimeNano = steady_clock::now().time_since_epoch().count(); - auto BootTimeMilli = BootTimeNano / NANO_TO_MILESECOND; + auto BootTimeMilli = BootTimeNano / NANO_TO_MILLISECOND; TIME_HILOGD(TIME_MODULE_SERVICE, "nitz time changed."); nitzUpdateTimeMili_ = BootTimeMilli; } @@ -140,11 +155,38 @@ void NtpUpdateTime::SetSystemTime() TIME_HILOGD(TIME_MODULE_SERVICE, "end."); } +bool NtpUpdateTime::ThreadSetSystemTime() +{ + TIME_HILOGD(TIME_MODULE_SERVICE, "start."); + if (!DelayedSingleton::GetInstance()->ForceRefresh(autoTimeInfo_.NTP_SERVER)) { + TIME_HILOGE(TIME_MODULE_SERVICE, "get ntp time failed."); + return false; + } + int64_t currentTime = DelayedSingleton::GetInstance()->CurrentTimeMillis(); + if (currentTime == INVALID_TIMES) { + TIME_HILOGD(TIME_MODULE_SERVICE, "Ntp update time failed"); + return false; + } + if (currentTime <= 0) { + TIME_HILOGD(TIME_MODULE_SERVICE, "current time invalid."); + return false; + } + TIME_HILOGD(TIME_MODULE_SERVICE, "Ntp UTC Time: %{public}" PRId64 "", currentTime); + auto timeOffsetMs = DelayedSingleton::GetInstance()->GetCurrentOffsetMs(); + currentTime = currentTime + timeOffsetMs; + TIME_HILOGD(TIME_MODULE_SERVICE, "Ntp UTC+TIMEZONE tTime: %{public}" PRId64 "", currentTime); + TimeService::GetInstance()->SetTime(currentTime); + autoTimeInfo_.lastUpdateTime = currentTime; + TIME_HILOGD(TIME_MODULE_SERVICE, "Ntp update currentTime: %{public}" PRId64 "", currentTime); + TIME_HILOGD(TIME_MODULE_SERVICE, "end."); + return ture; +} + void NtpUpdateTime::RefreshNextTriggerTime() { auto BootTimeNano = steady_clock::now().time_since_epoch().count(); - auto BootTimeMilli = BootTimeNano / NANO_TO_MILESECOND; - nextTriggerTime_ = BootTimeMilli + DAY_TO_MILLISECOND; + auto BootTimeMilli = BootTimeNano / NANO_TO_MILLISECOND; + nextTriggerTime_ = BootTimeMilli + DAY_TO_MILLISECOND; } void NtpUpdateTime::UpdateStatusOff() @@ -182,7 +224,7 @@ bool NtpUpdateTime::CheckStatus() bool NtpUpdateTime::IsNITZTimeInvalid() { auto BootTimeNano = steady_clock::now().time_since_epoch().count(); - auto BootTimeMilli = BootTimeNano / NANO_TO_MILESECOND; + auto BootTimeMilli = BootTimeNano / NANO_TO_MILLISECOND; return (BootTimeMilli - nitzUpdateTimeMili_) < DAY_TO_MILLISECOND; }