您的位置:首页 > 移动开发 > Android开发

ntp协议,android获取ntp时间

2017-03-29 10:48 281 查看
     NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。

    原理:

NTP要提供准确的时间,就必须有准确的时间来源,那可以用格林尼治时间吗?答案是否定的。因为格林尼治时间是以地球自转为基础的时间计量系统,但是地球每天的自转是有些不规则的,而且正在缓慢加速,因此,格林尼治时间已经不再被作为标准时间使用。新的标准时间,是由原子钟报时的国际标准时间UTC(Universal
Time Coordinated,世界协调时)。所以NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。        

有了准确而可靠的的时间源,那这个时间如何传播呢?在NTP中,定义了时间按照服务器的等级传播,按照离外部UTC源远近将所有的服务器归入不同的Stratum(层)中,例如把通过GPS(Global Positioning System,全球定位系统)取得发送标准时间的服务器叫Stratum-1的NTP服务器,而Stratum-2则从Stratum-1获取时间,Stratum-3从Stratum-2获取时间,以此类推,但Stratum层的总数限制在15以内。所有这些服务器在逻辑上形成阶梯式的架构相互连接,而Stratum-1的时间服务器是整个系统的基础。

计算机主机一般同多个时钟服务器连接,利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源以便校正主机时间。即使在主机长时间无法与某一时钟服务器联系的情况下,NTP服务依然可以有效运转。为了防止对时钟服务器的恶意破坏,NTP使用了识别机制,检查发送来的信息是否是真正来自所宣称的时钟服务器并检查信息的返回路径,以提供对抗干扰的保护机制。

下面我们用android的API来实现获取ntp时间:

public static long getNtpTrustedTime(final Context context) {
try {
final Class<?> NtpClass = Class
.forName("android.util.NtpTrustedTime");

Object obj = new Object();
Method method = NtpClass.getMethod("getInstance", Context.class);
Object gi = method.invoke(obj, context);
method = NtpClass.getMethod("forceRefresh");
Object receiverce = method.invoke(gi);
if ((Boolean) receiverce) {
method = NtpClass.getMethod("getCachedNtpTime");
Object cachedNtpTime = method.invoke(gi);
return (Long) cachedNtpTime;
}
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}

return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ntp