2012-06-25 8 views
7

Questa domanda potrebbe essere leggermente prolissa, ma è aperta per molti suggerimenti.Tempo di sincronizzazione per la registrazione di dati su più dispositivi Android


problema dichiarazione:
Abbiamo livello vari API 8 (Android 2.2) dispositivi MYTOUCH che useremo per registrare dati di accelerazione in un parco divertimenti, cioè su un ottovolante. Abbiamo anche una funzione di visualizzazione che ci consente di tracciare e visualizzare i punti dell'accelerometro in funzione del tempo in cui sono stati registrati. Qui è dove abbiamo un dilemma! I tempi di sistema sui dispositivi Android non sono tutti uguali, né possono essere impostati allo stesso tempo con precisione millisecondo (solo manualmente con precisione minuscola, che è terribile).


Tentativi Soluzione:
Così, ho fatto ricorso alla registrazione dei dati in base a un tempo GPS trovato all'inizio della app. Corto processo lungo: ottenere il tempo GPS, ottenere l'ora del sistema, ottenere la differenza e dopo aver registrato un punto dati, ottenere di nuovo il tempo di sistema e aggiungere la differenza all'ora, etichettarlo come ora di inizio della registrazione e incrementare di 200 millisecondi per ciascun punto dati registrati da lì. Tuttavia, ci sono 2 problemi (per ottenere il tempo GPS):

  • Uso getLastKnownLocation() non è troppo preciso. In realtà, sembra molto impreciso. Mi sta dando dei tempi che sono 9 minuti fuori dall'ora GMT/UTC corrente. Per coincidenza, tuttavia, il tempo di sistema è anche di circa 9 minuti di spegnimento sul dispositivo Android ... la differenza tra l'ora GPS e l'ora del sistema è in genere compresa tra 1000 e 5000 millisecondi (da 1 a 5 secondi). Suppongo che ci sia una possibilità che il mio codice sia sbagliato. L'ho incollato sotto per farti vedere.

  • requestSingleUpdate() sarebbe bello da usare, in quanto otterrebbe una posizione più recente e forse un tempo molto preciso. Problema? Richiede il livello API 9 ... dispositivi che non abbiamo.


Idee:
Ecco un'idea che ho avuto anche se - cosa succede se in qualche modo tirato un tempo di globale da un sito web e ha usato il tempo tirato da lì, come momento della registrazione? Problema qui - Non ho idea di come farlo, è solo un pio desiderio del mio ...

Un'altra idea: esiste una sorta di tipo globale getTime() di cui semplicemente non so nulla?


Ragionamento questo che voglio Android di per tirare il tempo da un orologio simile:
immaginare due persone sedute sulle montagne russe - uno sul sedile anteriore, una sul retro. Quando si registrano i dati, la persona che precede avrà ovviamente delle accelerazioni leggermente prima che la persona nella parte posteriore (e vogliamo vederla sul nostro grafico di visualizzazione). Questo è il motivo per cui è cruciale, con precisione milliseconda, che questi punti vengono registrati in base a un singolo tempo globale.


Codice:

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

    } 

} 

Aggiornamento:
Here, qualcuno suggerisce una sorta di "server" getTime(). Mi piace molto il suo codice/risposta, ma cos'è questo "server" e/o come posso impostarne uno, se questa è la soluzione migliore?

risposta

2

Penso che il "server" a cui si riferisce il risponditore in quel post sia quello di impostare un server orario dedicato. Fondamentalmente dovresti configurare un hardware a cui tutte le persone che usano la tua app si collegherebbero per ottenere il tempo. Può essere più sforzo che si è disposti a mettere in.

Avresti bisogno di seguito,

  1. Alcuni hardware di ricambio (potrebbe essere semplice come un computer che esegue Tomcat, o complesso come un server rack dedicato in base a quante persone pensi che utilizzeranno la tua app.) o un abbonamento a un server di dominio/host web.

  2. Alcuni servizi Web che restituiscono l'ora ogni volta che un'applicazione lo richiede.

  3. È necessario rendere pubblico il server/webservice, che è un altro mal di testa.

Non sono sicuro che sarebbe la soluzione migliore perché dipenderebbe dalla connettività di rete per raggiungere il server dedicato. Ci sono un paio di soluzioni alternative che puoi provare:

Non so se la tua app sarà pubblica o utilizzata specificatamente per la ricerca. Se è quest'ultimo e sarà con un gruppo di persone che conosci e puoi coordinarti, in realtà ti consiglio di scaricare solo ClockSync, sincronizzare i tuoi telefoni con lo stesso server, e poi eseguire la tua app.

Se la tua app verrà distribuita a persone con cui non avrai contatti, allora forse la soluzione migliore è far sì che la tua app effettui una connessione a un server ntp e accaparra il tempo in quel modo. Ecco un elenco di server NTP pubblici è possibile utilizzare: http://www.pool.ntp.org/en/

Ecco qualche informazione in più:

ClockSync

Sample code per effettuare una connessione SNTP

spero che l'informazione può essere utile per tu nel prendere una decisione.

+0

Realmente comunichiamo con un server che abbiamo: vedrò se uno dei ragazzi scriverà una funzione API che ricava tempo dal server con cui possiamo comunicare tramite i dispositivi Android. Grazie anche per il codice: molto utile. Ti risponderò se questo funziona/non funziona. – Mxyk

+1

Grazie per l'aiuto - abbiamo deciso di utilizzare DatagramSockets per ospitare/ricevere orari su una rete WiFi simile in modo che tutti i telefoni possano sincronizzarsi con l'ora del telefono dell'host. Se ho qualche domanda su DatagramSocket, sarò sicuro di chiedere. – Mxyk

+0

@Mxyk Quanto è stato preciso per sincronizzare l'ora sui dispositivi mobili? – flux

Problemi correlati