2012-06-25 14 views
7

To pytanie może być nieco rozwlekłe, ale jest otwarte na wiele sugestii.Czas synchronizacji do nagrywania danych na wielu urządzeniach z systemem Android


komunikat Problem:
Mamy kilka API poziom 8 (Android 2.2) Urządzenia myTouch że będziemy używać do rejestrowania danych przyspieszenia w parku rozrywki, a mianowicie na roller coaster. Posiadamy również funkcję wizualizacji, która pozwala nam na wykreślenie i wyświetlenie punktów akcelerometru w funkcji czasu, w którym zostały zarejestrowane. Tutaj mamy dylemat! Czasy systemu na urządzeniach z Androidem nie są takie same, ani nie można ich ustawić w tym samym czasie z dokładnością do milisekund (tylko ręcznie z dokładnością minutową, co jest okropne).


Rozwiązanie Próby:
Więc najpierw uciekają się do zapisu danych według czasu GPS znalezionego na początku aplikacji. Długi krótki proces: pobierz czas GPS, uzyskaj czas systemowy, uzyskaj różnicę i po zarejestrowaniu punktu danych, uzyskaj ponownie czas systemowy i dodaj różnicę z powrotem do czasu, oznacz to jako czas rozpoczęcia nagrywania i zwiększ o 200 milisekund dla każdego zarejestrowany punkt danych z tego miejsca. Jednakże istnieją 2 problemy (dotyczące uzyskiwania czas GPS):

  • Korzystanie getLastKnownLocation() nie jest zbyt dokładne. W rzeczywistości wydaje się bardzo niedokładne. To daje mi czasy, które wynoszą 9 minut od aktualnego czasu GMT/UTC. Jednak czas systemowy jest również prawie 9 minut wyłączony na urządzeniu z systemem Android ... różnica między czasem GPS a czasem systemowym wynosi zwykle od 1000 do 5000 milisekund (od 1 do 5 sekund). Przypuszczam, że jest szansa, że ​​mój kod jest błędny. Wkleiłem to poniżej, abyś mógł je zobaczyć.

  • requestSingleUpdate() byłby świetny w użyciu, ponieważ uzyskałby nowszą lokalizację i prawdopodobnie bardzo dokładny czas. Problem? Wymaga urządzeń poziomu API 9 ... których nie mamy.


Pomysły:
Oto pomysł miałem, choć - co jeśli ja jakoś wyciągnął czasu globalnego ze strony internetowej i wykorzystywane czas wyciągnął stamtąd jako czas nagrywania? Problem tutaj - Nie mam pojęcia, jak to zrobić, to tylko moje życzeniowe myślenie ...

Kolejny pomysł - czy istnieje jakiś globalny typ funkcji, o którym po prostu nie wiem?


Rozumowanie dlaczego chcę Android ciągnąć razem z podobnym zegarem:
Wyobraźmy sobie dwie osoby siedzącej na roller coaster - jeden na przednim siedzeniu, jeden na plecach. Podczas rejestrowania danych, osoba z przodu będzie wyraźnie odczuwać przyspieszenia, zanim osoba z tyłu (i chcemy to zobaczyć na naszym wykresie wizualizacji). Dlatego tak ważne jest, z dokładnością do milisekundy, że punkty te są rejestrowane według jednego, globalnego czasu.


Kod:

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){ 

    } 

} 

Aktualizacja:
Here ktoś sugeruje coś w rodzaju "serwer" getTime(). Bardzo podoba mi się jego kod/odpowiedź, ale co to jest "serwer" i/lub jak go skonfigurować, jeśli jest to najlepsze rozwiązanie?

Odpowiedz

2

Myślę, że "serwer" odpowiadający w tym poście to skonfigurowanie dedykowanego serwera czasu. Zasadniczo konfigurowałeś sprzęt, z którym łączyłyby się wszystkie osoby korzystające z Twojej aplikacji, aby uzyskać odpowiedni czas. Może być więcej wysiłku, niż jesteś gotów do wprowadzenia.

że potrzebne są następujące,

  1. Niektóre detale metalowe (może być tak proste, jak komputer z systemem Tomcat, lub tak skomplikowane jak dedykowany serwer rack w zależności od tego, ilu użytkowników będzie używać aplikacji.) lub subskrypcji na serwer domeny/hosta internetowego.

  2. Usługa internetowa, która zwraca czas tylko wtedy, gdy aplikacja tego zażąda.

  3. Musisz udostępnić swój serwer/serwis internetowy, co jest zupełnie innym bólem głowy.

Nie jestem pewien, czy byłoby to najlepsze rozwiązanie, ponieważ zależałoby od połączenia z siecią, aby dotrzeć do serwera dedykowanego. Istnieje kilka alternatywnych rozwiązań, które możesz wypróbować:

Nie wiem, czy Twoja aplikacja będzie publiczna, czy też będzie używana specjalnie do badań. Jeśli jest to drugie i będzie z grupą osób, które znasz i możesz koordynować, polecam tylko pobranie ClockSync, zsynchronizowanie telefonów z tym samym serwerem czasu, a następnie uruchomienie aplikacji.

Jeśli twoja aplikacja ma być dystrybuowana do osób, z którymi nie będziesz mieć kontaktu, być może najlepszym rozwiązaniem będzie, aby twoja aplikacja wykonała połączenie z jednym serwerem NTP i chwyciła ten czas. Oto lista serwerów NTP publicznych można użyć: http://www.pool.ntp.org/en/

Oto kilka informacji:

ClockSync

Sample code do wykonywania połączenia SNTP

Mam nadzieję, że informacje mogą być wykorzystane przez Ty w podejmowaniu decyzji.

+0

W rzeczywistości komunikujemy się z serwerem, który mamy - zobaczę, czy któryś z chłopaków napisze funkcję API, która dostaje czas z serwera, z którym możemy komunikować się za pośrednictwem urządzeń z Androidem. Dzięki za kod również - bardzo pomocne. Wrócę do ciebie, jeśli to zadziała lub nie zadziała. – Mxyk

+1

Dzięki za pomoc - zdecydowaliśmy się użyć DatagramSockets do hostowania/odbierania czasów w podobnej sieci Wi-Fi, aby wszystkie telefony mogły synchronizować się z czasem telefonu hosta. Jeśli mam jakieś pytanie w DatagramSocket, na pewno zapytam. – Mxyk

+0

@Mxyk Jak dokładne było zsynchronizowanie czasu na urządzeniach mobilnych? – flux

Powiązane problemy