mirror of
https://github.com/openharmony/miscservices_time.git
synced 2026-07-19 12:02:04 -04:00
@@ -42,6 +42,7 @@ private:
|
||||
void SubscriberNITZTimeChangeCommonEvent();
|
||||
void StartTimer();
|
||||
void SetSystemTime();
|
||||
bool ThreadSetSystemTime();
|
||||
void RefreshNextTriggerTime();
|
||||
bool CheckStatus();
|
||||
bool IsNITZTimeInvalid();
|
||||
|
||||
@@ -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<NtpTrustedTime>::GetInstance()->ForceRefresh(autoTimeInfo_.NTP_SERVER)) {
|
||||
TIME_HILOGE(TIME_MODULE_SERVICE, "get ntp time failed.");
|
||||
return false;
|
||||
}
|
||||
int64_t currentTime = DelayedSingleton<NtpTrustedTime>::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<TimeZoneInfo>::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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user