MTK6757 增加自定义NTP时间同步(TCP&UDP)
实现自定义NTP时间同步(TCP&UDP)
一. 系统NTP 改造
1. frameworks\base\core\java\android\net\SntpClient.java
增加log 查看当前request host 地址
public boolean requestTime(String host, int timeout) {
InetAddress address = null;
try {
Log.d("olc_ntp", "SntpClient-->requestTime host== " + host);
address = InetAddress.getByName(host);
Log.d("olc_ntp", "SntpClient-->requestTime address== " + address);
} catch (Exception e) {
if (DBG) Log.d(TAG, "SntpClient-->request time failed: " + e);
Log.d("olc_ntp", "SntpClient-->request time failed: " + e);
return false;
}
return requestTime(address, NTP_PORT, timeout);
}
2. frameworks\base\core\java\android\util\NtpTrustedTime.java
根据标识 初始化相应的sSingleton 对象
public static synchronized NtpTrustedTime getInstance(Context context) {
if (sSingleton == null) {
.............
sContext = context;
//wpx NTP
int LanNTPFlag = 1;
String NTP_LAN = "192.168.1.111";
if(LanNTPFlag == 1 && NTP_LAN != null &&!"".equals(NTP_LAN)){
Log.d("olc_ntp", "NtpTrustedTime NTP_LAN: " + NTP_LAN);
List<String> ntps = getNTPArr(context);
if(ntps.size() > 0){
Log.d("olc_ntp", "NtpTrustedTime ntps.get(0): " + ntps.get(0));
sSingleton = new NtpTrustedTime(ntps.get(0), timeout);
}
}else{
Log.d("olc_ntp", "NtpTrustedTime server: " + server);
sSingleton = new NtpTrustedTime(server, timeout);
}
}
return sSingleton;
}
3. frameworks\base\services\core\java\com\android\server\NetworkTimeUpdateService.java
根据标识初始化相应的NTP 地址集合
public NetworkTimeUpdateService(Context context) {
............................
//wpx NTP
int LanNTPFlag = 1;
String NTP_LAN = "192.168.1.111";
if(LanNTPFlag == 1 && NTP_LAN != null && !"".equals(NTP_LAN)){
String[] ntps = NTP_LAN.split(";");
for(String ntp : ntps){
mNtpServers.add(ntp);
}
mDefaultServer = ntps[0];
mPollingIntervalMs = 3600000;//NTP success(UDP) next sync time 60*60*1000 ms
mPollingIntervalShorterMs = 1000;// NTP failed(UDP) try again time
mTryAgainTimesMax = 10; // try again 10
}else{
//M: For multiple NTP server retry
mDefaultServer = ((NtpTrustedTime) mTime).getServer();
mNtpServers.add(mDefaultServer);
for (String str : SERVERLIST)
{
mNtpServers.add(str);
}
}
mTryAgainCounter = 0;
}
增加表示的观察者
public void systemRunning() {
............
//wpx NTP
mNTPSettingsObserver = new NTPSettingsObserver(new Handler());
mNTPSettingsObserver.registerObserver();
}
在轮询请求过程中增加TCP 方式获取时间
private void onPollNetworkTimeUnderWakeLock(int event) {
........................
//wpx NTP
syncNTPTime_TCP(mNtpServers.get(mTryAgainCounter % mNtpServers.size()));
....................
}
private class NTPSettingsObserver extends ContentObserver {
NTPSettingsObserver(Handler handler) {
super(handler);
}
void registerObserver() {
mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(
"****"), false, this);
mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(
"######"), false, this);
}
@Override
public void onChange(boolean selfChange) {
mNtpServers = new ArrayList<String>();
Log.d("olc_ntp", "NetworkTimeUpdateService NTPSettingsObserver ");
int LanNTPFlag = 1;
String NTP_LAN = "192.168.1.111";
if(LanNTPFlag == 1 && NTP_LAN != null && !"".equals(NTP_LAN)){
String[] ntps = NTP_LAN.split(";");
for(String ntp : ntps){
mNtpServers.add(ntp);
}
mDefaultServer = ntps[0];
mPollingIntervalMs = 3600000;//NTP success(UDP) next sync time 60*60*1000 ms
mPollingIntervalShorterMs = 1000;// NTP failed(UDP) try again time
mTryAgainTimesMax = 10; // try again 10
}else{
//M: For multiple NTP server retry
mDefaultServer = ((NtpTrustedTime) mTime).getServer();
mNtpServers.add(mDefaultServer);
for (String str : SERVERLIST)
{
mNtpServers.add(str);
}
}
//标识改变后 执行轮询获取时间
onPollNetworkTime(EVENT_NETWORK_CHANGED);
}
}
//---wpx NTP
private void syncNTPTime_TCP(String ntp){
try {
final long currentTime = System.currentTimeMillis();
Log.d("olc_ntp", "NetworkTimeUpdateService-->syncNTPTime_TCP = " + ntp);
java.net.URL url = new java.net.URL("http://" + ntp);
java.net.URLConnection uc = url.openConnection();
uc.setConnectTimeout(3000);
long id = uc.getDate();
java.util.Date date = new java.util.Date(id);
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyyMMdd.HHmmss");
String nowTime = format.format(date);
long ntp_time = date.getTime();
Log.d("olc_ntp", "NetworkTimeUpdateService-->ntp_time = " + ntp_time + " ,currentTime=" + currentTime);
if(ntp_time - currentTime <= 0){
Log.d("olc_ntp", "NetworkTimeUpdateService-->NTP sync time failed (TCP)");
}else{
Log.d("olc_ntp", "NetworkTimeUpdateService-->nowTime = " + nowTime);
android.os.SystemClock.setCurrentTimeMillis(date.getTime());
}
} catch (java.net.MalformedURLException e) {
// TODO Auto-generated catch block
Log.d("olc_ntp", "NetworkTimeUpdateService-->MalformedURLException ");
e.printStackTrace();
} catch (java.io.IOException e) {
// TODO Auto-generated catch block
Log.d("olc_ntp", "NetworkTimeUpdateService-->IOException ");
e.printStackTrace();
} catch (Exception e2) {
// TODO: handle exception
Log.d("olc_ntp", "NetworkTimeUpdateService-->Exception ");
e2.printStackTrace();
}
}
4. vendor\mediatek\proprietary\packages\providers\DrmProvider\src\com\mediatek\providers\drm\DrmSyncTimeService.java
mtk 辅助获取NTP时间帮助类
@Override
public void onCreate() {
...................
//wpx NTP
int LanNTPFlag = 1;
String NTP_LAN = "192.168.1.111";
if(LanNTPFlag == 1 && NTP_LAN != null && !"".equals(NTP_LAN)){
String[] ntps = NTP_LAN.split(";");
for(String ntp : ntps){
mNtpServers.add(ntp);
}
}else{
// Get default ntp server from system and init sync secure time servers list
String defaultServer = Settings.Global.getString(mContext.getContentResolver(),
Settings.Global.NTP_SERVER);
if (DEBUG) Log.d(TAG, "defaultServer: " + defaultServer);
mNtpServers = new ArrayList<String>(sHostList.length + 1);
for (String host : sHostList) {
mNtpServers.add(host);
if (host.equals(defaultServer)) {
defaultServer = null;
}
}
if (defaultServer != null) {
mNtpServers.add(0, defaultServer);
}
}
}
拦截命令 不执行辅助NTP 获取时间
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
..................
//wpx NTP
mNtpServers = new ArrayList<String>();
int LanNTPFlag = com.olc.security.util.SecurityConfig.getLANNTPEnabled(mContext);
String NTP_LAN = com.olc.security.util.SecurityConfig.getLANNTPIP(mContext);
if(LanNTPFlag == 1 && NTP_LAN != null && !"".equals(NTP_LAN)){
return START_NOT_STICKY;
}
............
}
12-04 00:00:32.826 1017 1853 D olc_ntp : System time = 1575388832826
12-04 00:00:32.844 1017 1853 D olc_ntp : NetworkTimeUpdateService-->syncNTPTime_TCP = 192.168.88.8
12-04 00:00:32.904 1017 1853 D olc_ntp : NetworkTimeUpdateService-->ntp_time = 1587980282000 ,currentTime=1575388832842
12-04 00:00:32.904 1017 1853 D olc_ntp : NetworkTimeUpdateService-->nowTime = 20200427.173802
04-27 17:38:02.001 1017 1853 D olc_ntp : mTryAgainCounter = 0;mNtpServers.size() = 1;index = 0;mNtpServers = 192.168.88.8
04-27 17:38:02.001 1017 1853 D olc_ntp : SntpClient-->requestTime host== 192.168.88.8
04-27 17:38:02.002 1017 1853 D olc_ntp : SntpClient-->requestTime address== /192.168.88.8
二. 服务端配置 win10 UDP 配置
1. AnnounceFlags 值修改为5
打开: 配置 AnnounceFlags 值修改为5
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\AnnounceFlags]
打开: 配置 Enabled修改为:1
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer]
2. 开启服务
win+X打开管理员shell命令行
net stop w32time 停止服务 net start w32time 启动服务
3. 添加防火墙规则
控制面板--->系统和安全--->windows防火墙--->高级设置--->入站规则(右键)--->新建规则--->端口 ---下一步----UDP----特定本地端口:123(不要换别的)
4. 配置开机自启动
三. TCP 方式配置
适用 windows 和 window server
1. URL授权打开
勾选 URL 授权
2. 防火墙配置修改 “万维网服务(HTTP)”
控制面板\所有控制面板项\Windows Defender 防火墙\允许的应用