`
ping8080
  • 浏览: 58998 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论

网络时间同步

 
阅读更多

1,froyo\packages\apps\Settings\AndroidManifest.xml

  注册一个service

<service android:name=".sntp.SNTP"
 android:exported="true"
 android:process=":remote">
 </service>

 

2,froyo\packages\apps\Settings\src\com\android\settings\DateTimeSettings.java

导入包文件:import com.android.settings.sntp.SNTP;

 

把public void onSharedPreferenceChanged(SharedPreferences preferences, String key){

}方法改成如下

 

 public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
       if (key.equals(KEY_DATE_FORMAT)) {
      String format = preferences.getString(key,
      getResources().getString(R.string.default_date_format));
      Settings.System.putString(getContentResolver(),
      Settings.System.DATE_FORMAT, format);
      updateTimeAndDateDisplay();
      } else if (key.equals(KEY_AUTO_TIME)) {
      boolean autoEnabled = preferences.getBoolean(key, true);
  
      /* add at 2011.6.21 */
      if( autoEnabled ){
     
    // Log.d("---------->"," startService !! " );   
  
     
     Intent intent = new Intent(DateTimeSettings.this,SNTP.class);
    
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
     startService(intent);   
    
  }else{
    
    // Log.d("---------->"," endService !! " );
    
     Intent intent = new Intent(DateTimeSettings.this,SNTP.class);
    
  
    
     stopService(intent) ;
    
  }
  
      Settings.System.putInt(getContentResolver(),
       Settings.System.AUTO_TIME,
       autoEnabled ? 1 : 0);
      mTimePref.setEnabled(!autoEnabled);
      mDatePref.setEnabled(!autoEnabled);
      mTimeZone.setEnabled(!autoEnabled);
      }
     }

3,froyo\packages\apps\Settings\src\com\android\settings\sntp\SNTP.java

 

加入此service文件

 

package com.android.settings.sntp ;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Calendar;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.text.format.DateFormat;
import android.util.Log;

import android.content.Context;
import android.os.Handler;
import android.app.Service;
import android.os.IBinder;

/**
 * {@hide}
 *
 * Simple SNTP client class for retrieving network time.
 *
 * Sample usage:
 * <pre>
 * SntpClient client = new SntpClient();
 * if (client.requestTime("203.117.180.36")) {
 *     long now = client.getNtpTime() + SystemClock.elapsedRealtime() - client.getNtpTimeReference();
 * }
 * </pre>
 */

public class SNTP extends Service {
 
   private static final String TAG = "SNTP--->";
   private static final boolean DBUG = true;
   private static Context mContext ;
  
  /*public static void SNTP( Context context ) {
   mContext = context ;  
  }*/
      
   @Override
   public IBinder onBind(Intent intent) {
   // TODO Auto-generated method stub
    return null;
   }
  
  @Override
  public void onDestroy()
  {
   mSntpHandler.removeCallbacks(mSntpTask);
   if(DBUG) Log.d(TAG," SNTP Service end !! " );
  }
 
  @Override
  public void onStart(Intent intent, int startId){
   super.onStart(intent, startId);
   
   if(DBUG) Log.d(TAG," start SNTP Service !! " );
   startSyncSNTP();
  }
  
  public void startSyncSNTP() {
   mSntpHandler.postDelayed(mSntpTask, 10);
  }
  
   private Handler mSntpHandler = new Handler();
   
    private Runnable mSntpTask = new Runnable(){
     public void run(){
      mSntpHandler.removeCallbacks(mSntpTask);
      if( ! syncSNTP() ) {
       mSntpHandler.postDelayed(mSntpTask, 3000);
      }
     }
    };
   
    public boolean syncSNTP( ) {         
      SntpClient client = new SntpClient();
      if(client.requestTime("203.117.180.36",3000)) {
         
         long now = client.getNtpTime() + SystemClock.elapsedRealtime() - client.getNtpTimeReference();        
                 
         CharSequence ch=DateFormat.format("hh:mm:ss", now );
         if(DBUG) Log.d(TAG,"ch="+ch);
         CharSequence date=DateFormat.format("yyyy MM dd", now);
         if(DBUG) Log.d(TAG,"date="+date);
                          
         if( SystemClock.setCurrentTimeMillis(now) ){
            if(DBUG) Log.d(TAG,"set Current Time ="+System.currentTimeMillis());
         }else{
          if(DBUG) Log.d(TAG," set Current Time  false !" );
         }
                                 
       }else{
         if(DBUG) Log.d(TAG,"sntp request time false !!" );
         return false ;
       }
       
        return true ;
    }
    
    public class SntpClient
    {
        private static final int NTP_PACKET_SIZE = 48 ;
        private static final int NTP_PORT = 123;
        private static final int NTP_MODE_CLIENT = 3;
        private static final int NTP_VERSION = 3;
        /*
         *  Number of seconds between Jan 1, 1900 and Jan 1, 1970
         *  70 years plus 17 leap days
         */
        private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L;
        private static final int TRANSMIT_TIME_OFFSET = 40;
       
        private static final int ORIGINATE_TIME_OFFSET = 24;
        private static final int RECEIVE_TIME_OFFSET = 32;
       
        // system time computed from NTP server response
        private long mNtpTime;
        // value of SystemClock.elapsedRealtime() corresponding to mNtpTime
        private long mNtpTimeReference;
        // round trip time in milliseconds
        private long mRoundTripTime;
       
        public boolean requestTime(String host, int timeout) {
         
         try {   
          DatagramSocket socket = new DatagramSocket();
          socket.setSoTimeout(timeout);
          
          InetAddress address = InetAddress.getByName(host);      
          byte[] buffer = new byte[NTP_PACKET_SIZE];
          DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT);
          /*
           * set mode = 3 (client) and version = 3                       
                 * mode is in low 3 bits of first byte
                 * version is in bits 3-5 of first byte
                 */
                buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3);
                //get current time and write it to the request packet
                long requestTime = System.currentTimeMillis();
                if(DBUG) Log.d(TAG, "System.currentTimeMillis(): " + requestTime + " ms");
                long requestTicks = SystemClock.elapsedRealtime();
                writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET, requestTime);
                socket.send(request);
               
               
                // read the response
                DatagramPacket response = new DatagramPacket(buffer, buffer.length);
                socket.receive(response);
                long responseTicks = SystemClock.elapsedRealtime();
                long responseTime = requestTime + (responseTicks - requestTicks);
                socket.close();
               
                // extract the results
                long originateTime = readTimeStamp(buffer, ORIGINATE_TIME_OFFSET);
                long receiveTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET);
                long transmitTime = readTimeStamp(buffer, TRANSMIT_TIME_OFFSET);
                long roundTripTime = responseTicks - requestTicks - (transmitTime - receiveTime);
                long clockOffset = (receiveTime - originateTime) + (transmitTime - responseTime);
                if(DBUG) Log.d(TAG, "round trip: " + roundTripTime + " ms");
                if(DBUG) Log.d(TAG, "clock offset: " + clockOffset + " ms");
                     
             // save our results
                mNtpTime = receiveTime;//requestTime + clockOffset;
                mNtpTimeReference = requestTicks;
                mRoundTripTime = roundTripTime;
               
         }catch (Exception e) {
       // TODO: handle exception
          if(DBUG) Log.d(TAG, "error: " + e);
          return false;
      }
         
         return true ;
        }
       
        /**
         * Returns the time computed from the NTP transaction.
         *
         * @return time value computed from NTP server response.
         */
        public long getNtpTime() {
            return mNtpTime;
        }
       
        /**
         * Returns the reference clock value (value of SystemClock.elapsedRealtime())
         * corresponding to the NTP time.
         *
         * @return reference clock corresponding to the NTP time.
         */
        public long getNtpTimeReference() {

            return mNtpTimeReference;
        }
       
        /**
         * Returns the round trip time of the NTP transaction
         *
         * @return round trip time in milliseconds.
         */
        public long getRoundTripTime() {
            return mRoundTripTime;
        }
       
        /**
         * Reads an unsigned 32 bit big endian number from the given offset in the buffer.
         */
        private long read32(byte[] buffer, int offset) {
            byte b0 = buffer[offset];
            byte b1 = buffer[offset+1];
            byte b2 = buffer[offset+2];
            byte b3 = buffer[offset+3];

            // convert signed bytes to unsigned values
            int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0);
            int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1);
            int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2);
            int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3);
            return ((long)i0 << 24) + ((long)i1 << 16) + ((long)i2 << 8) + (long)i3;
        }
       
        /**
         * Reads the NTP time stamp at the given offset in the buffer and returns
         * it as a system time (milliseconds since January 1, 1970).
         */   
        private long readTimeStamp(byte[] buffer, int offset) {
            long seconds = read32(buffer, offset);
            long fraction = read32(buffer, offset + 4);
            return ((seconds - OFFSET_1900_TO_1970) * 1000) + ((fraction * 1000L) / 0x100000000L);       
        }
       
        /**
         * Writes system time (milliseconds since January 1, 1970) as an NTP time stamp
         * at the given offset in the buffer.
         */   
        private void writeTimeStamp(byte[] buffer, int offset, long time) {
            long seconds = time / 1000L;
            long milliseconds = time - seconds * 1000L;
            seconds += OFFSET_1900_TO_1970;

            // write seconds in big endian format
            buffer[offset++] = (byte)(seconds >> 24);
            buffer[offset++] = (byte)(seconds >> 16);
            buffer[offset++] = (byte)(seconds >> 8);
            buffer[offset++] = (byte)(seconds >> 0);
            long fraction = milliseconds * 0x100000000L / 1000L;

            // write fraction in big endian format
            buffer[offset++] = (byte)(fraction >> 24);
            buffer[offset++] = (byte)(fraction >> 16);
            buffer[offset++] = (byte)(fraction >> 8);

            // low order bits should be random data
            buffer[offset++] = (byte)(Math.random() * 255.0);

        }     
    }//class SntpClient

   
}

分享到:
评论

相关推荐

    基于matlab无线传感器网络时间同步算法

    本主题将详细探讨基于MATLAB的无线传感器网络时间同步算法。 MATLAB是一种强大的开发环境,适用于数值计算、符号计算以及算法开发。在无线传感器网络时间同步领域,MATLAB可以用来设计、模拟和测试各种同步算法,如...

    网络时间同步软件

    在IT领域,网络时间同步是一项重要的技术,尤其对于多设备协同工作、系统安全以及日志记录等场景。网络时间同步软件的主要功能是确保计算机或设备的时钟与一个可靠的网络时间源保持一致,以减少时间差异带来的问题。...

    基于matlab实现无线传感器网络时间同步附matlab代码

    无线传感器网络(Wireless...请下载提供的MATLAB代码,按照文档的指导逐步执行,体验和学习无线传感器网络时间同步的全过程。在遇到问题时,不要忘记描述中提到的,如果在MATLAB 2019a环境下运行有困难,可以寻求帮助。

    网络时间同步器.rar

    《网络时间同步器详解》 在数字化社会中,时间的准确性对于各种系统和服务的正常运行至关重要。网络时间同步器就是确保设备时间精确无误的重要工具。本文将详细探讨网络时间同步器的概念、工作原理以及其在实际应用...

    E树Internet网络时间同步软件.rar

    E树Internet网络时间同步软件是一款高效且用户友好的时间同步工具,专为个人电脑用户提供免费的时间校准服务。它能够确保您的计算机系统时间与国际互联网上的标准时间保持一致,从而解决因时钟漂移或电池失效导致的...

    基于MATLAB的无线传感器网络时间同步算法_传感时钟同步_newspapern9h_传感器_MATLAB时钟同步_MATLAB

    本资源提供的是一种基于MATLAB的无线传感器网络时间同步算法,它旨在解决WSN中各节点时钟不一致的问题,确保网络中的数据采集和通信过程的精确性。 在无线传感器网络中,时间同步的主要目标是使所有节点的时钟保持...

    8.无线传感器网络时间同步算法.zip_RJ8_无线时间同步_时间同步_能量管理算法_重要节点

    时间同步是无线传感器网络中一项重要的底层支撑技术,是...归纳了无线传感器网络时间同步机制的分类方法,分析了每类典型的时间同步机制,最后总结了无线传感器网络时间同步机制的发展方向和未来的研究热点。 英文摘要:

    无线传感网络 时间同步

    然而,由于传感器节点通常受到成本、能量和体积的限制,传统的网络时间同步方法难以直接应用于无线传感网络中。 #### 二、时间同步的重要性与挑战 在无线传感网络中实现时间同步面临着一系列挑战,主要包括: - *...

    无线网络时间同步

    在IT领域,无线网络时间同步是一项至关重要的技术,特别是在分布式系统、物联网(IoT)以及无线传感器网络中。时间同步确保了所有设备在同一时钟参考下进行通信,从而提高数据准确性,减少错误,并优化网络资源的利用...

    网络时间同步源代码

    网络时间同步是计算机系统中确保时间准确性的关键技术,尤其在分布式系统和多设备协作的环境中,保持时间的一致性至关重要。本项目提供了一个基于VC6(Visual C++ 6.0)编写的网络时间同步源代码,它利用互联网资源...

    系统时间跟网络时间同步

    本文将深入探讨“系统时间跟网络时间同步”的相关知识点,并以C#编程语言实现的时间同步工具为例进行讲解。 首先,系统时间是指计算机内部时钟所记录的时间,而网络时间则是通过网络与全球定位系统(GPS)或网络...

    C#与网络时间同步的时间处理函数代码

    ### C#与网络时间同步的时间处理函数代码解析 在现代软件开发中,特别是涉及多用户、分布式系统或需要精确时间戳的应用场景下,确保系统时间的准确性变得至关重要。本篇文章将深入探讨C#中用于与网络时间同步的时间...

    系统时间跟网络时间同步工具

    在IT领域,系统时间和网络时间同步是一个常见的需求,特别是在服务器管理、分布式系统和网络设备中。本文将深入探讨“系统时间跟网络时间同步工具”的相关知识点,并基于提供的描述和标签进行详细阐述。 首先,系统...

    网络时间同步器(秒杀)

    网络时间同步器是一种重要的工具,尤其在网络环境中的各种操作中,准确的时间同步是至关重要的。在秒杀活动中,网络时间的精确性对于确保公平公正至关重要,因为抢购往往依赖于毫秒级的时间精度来决定谁是第一个提交...

    无线传感器网络时间同步实现源代码

    本文将探讨基于TinyOS操作系统的无线传感器网络时间同步实现。 TinyOS是为WSNs设计的一种微内核操作系统,它以模块化、低功耗和高效性为特点。时间同步是TinyOS中的关键功能,它确保网络中的所有节点能够准确地共享...

    易语言源码易语言网络时间同步小精灵源码.rar

    这个压缩包“易语言源码易语言网络时间同步小精灵源码.rar”包含了使用易语言编写的程序源代码,主要功能是实现网络时间同步,也就是将本地计算机的时间与互联网上的标准时间服务器进行校准,确保时间的准确无误。...

    C语言获取网络时间同步代码

    在编程领域,尤其是在嵌入式系统或需要精确时间同步的应用中,获取网络时间是一个常见的需求。C语言作为广泛应用的基础...总的来说,掌握C语言获取网络时间同步的技能,对于进行需要时间精确性的项目是极其有价值的。

Global site tag (gtag.js) - Google Analytics