1 /* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef SNTP_CLIENT_SNTP_CLIENT_H 17 #define SNTP_CLIENT_SNTP_CLIENT_H 18 19 #include <cstdlib> 20 #include <ctime> 21 #include <netinet/in.h> 22 #include <string> 23 #include <sys/socket.h> 24 #include <sys/types.h> 25 26 namespace OHOS { 27 namespace MiscServices { 28 class SNTPClient { 29 public: 30 bool RequestTime(const std::string &host); 31 int64_t getNtpTime(); 32 int64_t getNtpTimeReference(); 33 int64_t getRoundTripTime(); 34 35 private: 36 struct ntp_timestamp { 37 uint64_t second; 38 uint64_t fraction; 39 }; 40 41 struct date_structure { 42 int hour; 43 int minute; 44 int second; 45 int millisecond; 46 }; 47 48 struct SNTPMessage { 49 unsigned char _leapIndicator; 50 unsigned char _versionNumber; 51 unsigned char _mode; 52 unsigned char _stratum; 53 unsigned char _pollInterval; 54 unsigned char _precision; 55 unsigned int _rootDelay; 56 unsigned int _rootDispersion; 57 unsigned int _referenceIdentifier[4]; 58 uint64_t _referenceTimestamp; 59 uint64_t _originateTimestamp; 60 uint64_t _receiveTimestamp; 61 uint64_t _transmitTimestamp; 62 63 /** 64 * Zero all the values. 65 */ 66 void clear(); 67 }; 68 69 unsigned int GetNtpField32(int offset, const char *buffer); 70 /** 71 * This function returns an array based on the Reference ID 72 * (converted from NTP message), given the offset provided. 73 * 74 * @param offset the offset of the field in the NTP message 75 * @param buffer the received message 76 * 77 * Returns the array of Reference ID 78 */ 79 void GetReferenceId(int offset, char *buffer, int *_outArray); 80 /** 81 * This function sets the clock offset in ms. 82 * Negative value means the local clock is ahead, 83 * positive means the local clock is behind (relative to the NTP server) 84 * 85 * @param clockOffset the clock offset in ms 86 */ 87 void SetClockOffset(int clockOffset); 88 89 /** 90 * This function converts the UNIX time to NTP 91 * 92 * @param ntpTs the structure NTP where the NTP values are stored 93 * @param unixTs the structure UNIX (with the already set tv_sec and tv_usec) 94 */ 95 void ConvertUnixToNtp(struct ntp_timestamp *ntpTs, struct timeval *unixTs); 96 97 /** 98 * This function creates the SNTP message ready for transmission (SNTP Req) 99 * and returns it back. 100 * 101 * @param buffer the message to be sent 102 */ 103 void CreateMessage(char *buffer); 104 105 /** 106 * This function gets the information received from the SNTP response 107 * and prints the results (e.g. offset, round trip delay etc.) 108 * 109 * @param buffer the message received 110 */ 111 bool ReceivedMessage(char *buffer); 112 113 /** 114 * This function returns the timestamp (64-bit) from the received 115 * buffer, given the offset provided. 116 * 117 * @param offset the offset of the timestamp in the NTP message 118 * @param buffer the received message 119 * 120 * Returns the ntp timestamp 121 */ 122 uint64_t GetNtpTimestamp64(int offset, const char *buffer); 123 124 /** 125 * This function converts the NTP time to timestamp 126 * 127 * @param _ntpTs the NTP timestamp to be converted 128 * Returns the milliseconds 129 */ 130 int64_t ConvertNtpToStamp(uint64_t _ntpTs); 131 int64_t m_clockOffset; 132 int64_t m_originateTimestamp; 133 int64_t mNtpTime; 134 int64_t mNtpTimeReference; 135 int64_t mRoundTripTime; 136 }; 137 } // namespace MiscServices 138 } // namespace OHOS 139 #endif // SNTP_CLIENT_SNTP_CLIENT_H