2012-06-25 6 views
7

この質問は多少時間がかかるかもしれませんが、多くの提案に対して公開されています。複数のAndroid搭載デバイスのデータを記録するための同期時間


問題文:
我々はいくつかのAPIレベル8(アンドロイド2.2)我々は、すなわちジェットコースターの上に、遊園地での加速度データを記録するために使用されますmyTouchのデバイスを持っています。また、加速度計のポイントを記録した時刻の関数としてプロットすることができる視覚化機能も備えています。ここにジレンマがあります! Androidデバイスのシステム時間はすべて同じではなく、ミリ秒の精度で同じ時間に設定することもできません(手作業でしか細かい精度ではひどい)。


ソリューション試み:
だから、私は最初のアプリの起動時に見つかったGPS時間に応じて記録データに頼っ。長いプロセスの短縮:GPS時間を取得し、システム時間を取得し、差分を取得し、データポイントを記録すると、システム時間を再度取得し、その時間に差を戻し、記録の開始時間としてラベル付けし、それぞれに対して200ミリ秒そこから記録されたデータポイント。 getLastKnownLocation()を使用して

  • あまり正確ではありません。ただし、2つの(GPS時刻を取得するための)問題があります。実際、それは非常に不正確なようです。それは現在のGMT/UTC時間から9分の時間を私に与えている。同時に、Androidデバイスではシステム時間もほぼ9分です... GPS時間とシステム時間の差は通常1000〜5000ミリ秒(1〜5秒)です。私のコードが間違っている可能性があると思います。私はあなたのためにそれを下に貼り付けました。

  • requestSingleUpdate()は、最近の場所とおそらく非常に正確な時刻を取得するため、使いやすいでしょう。問題?私たちが持っていないAPIレベル9 ...デバイスが必要です。


アイデア:
ここで私が持っていたアイデアは、しかしだ - 私は何とかウェブサイトからグローバル時間を引っ張り、記録時とそこから引き出された時間を使用した場合にどのような?ここでの問題 - 私はそれをどうやって行うのか分かりません。私はちょうど私の考えを考えています...

もう一つのアイデア - 私は単純に分かりませんタイプのグローバルgetTime()タイプですか?私はAndroidのは、同様のクロックからの時間を引っ張りたい理由


推論:
ジェットコースターの上に座って二人を想像 - フロントシートに1、背面に1つずつ。データを記録するとき、前の人は、明らかに、後ろにいる人の少し前に加速度を経験します(これを私たちの視覚化グラフで見たいと思います)。そのため、これらのポイントは1つのグローバル時間に基づいて記録されることが、ミリ秒精度まで重要です。


コード:

Criteria c = new Criteria(); 
c.setAccuracy(Criteria.ACCURACY_FINE); 

if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
    mLocationManager.requestLocationUpdates(mLocationManager.getBestProvider(c, true), 0, 0, AmusementPark.this); 
    Criteria criteria = new Criteria(); 
    String bestProvider = mLocationManager.getBestProvider(criteria, false); 
    Location location = mLocationManager.getLastKnownLocation(bestProvider); 

    try { 

     gpsTime = location.getTime(); 
     systemTime = System.currentTimeMillis(); 
     timeDif = gpsTime - systemTime; 
     Log.e("timedif", "GPS: " + gpsTime + ", System: " + systemTime +", Dif: " + timeDif); 

    } catch (NullPointerException e){ 

    } 

} 

更新:
Here、誰かが "サーバー" getTime()のようなものを示唆しています。私は彼のコード/答えが本当に好きですが、この "サーバー"は何ですか、そして/あるいはこれをベストな解決策にするにはどうしたらいいですか?

答えて

2

私は、レスポンダがそのポストで参照している "サーバ"は、専用のタイムサーバを設定することだと思います。基本的には、時間を取るためにあなたのアプリケーションを使用するすべての人々が接続するハードウェアを設定しています。あなたが入れても構わないと思っているよりも多くの努力かもしれません。あなたは、次の必要があると思い

  1. いくつかの予備のハードウェアは、(Tomcatを実行しているコンピュータのような単純な、またはのように複雑な可能性がありあなたのアプリを使用していると思われる人の数に応じて専用のサーバーラックを使用することができます。)またはドメインサーバー/ Webホストの購読。

  2. アプリがリクエストするたびに時間を返すWebサービスもあります。

  3. あなたはサーバー/ウェブサービスを公開する必要があります。これはまったく別の頭痛です。

専用サーバーに接続するためのネットワーク接続に応じて最適な解決策になるかどうかはわかりません。試してみることのできるいくつかの代替ソリューションがあります:

あなたのアプリが一般公開されるのか、具体的に研究目的で使用されるのか分かりません。それが後者であり、あなたが知っていて調整できる人のグループと一緒にいるなら、私は実際にClockSyncをダウンロードし、あなたの電話を同じタイムサーバに同期させて、あなたのアプリを実行することをお勧めします。

あなたのアプリがあなたと連絡をとることのない人に配布される場合は、アプリに1つのntpサーバーへの接続をさせて、そのような時間を掴むことをお勧めします。ここでは、使用できるパブリックNTPサーバのリストです:http://www.pool.ntp.org/en/

ここではいくつかのより多くの情報があります:SNTP接続

を作るための

ClockSync

Sample code私は情報がに使用のものとすることができることを願っていますあなたは決断を下す。

+0

実際に私たちが持っているサーバーと通信しています。私たちの人のうちの1人が、Androidデバイス経由で通信できるサーバーから時間を得るAPI関数を作成するかどうかを見ていきます。コードもありがとう - 非常に便利です。これがうまくいくなら、私はあなたに戻ってきます。うまくいかない。 – Mxyk

+1

ご協力ありがとうございました。私たちはDatagramSocketsを使用して、すべての電話機がホストの電話機の時刻に同期するように、同様のWiFiネットワーク上の時刻をホスト/受信することに決めました。 DatagramSocketに関する質問があれば、私は尋ねるでしょう。 – Mxyk

+0

@Mxykモバイルデバイスの時刻をどのくらい正確に同期させましたか? – flux

関連する問題