Sincronizzazione perfetta dell'ora tra i dispositivi

2

Voglio fare in modo che due dispositivi sincronizzino il metronomo tramite bluetooth / wifi. Tuttavia non ho idea di come renderlo perfettamente sincronizzato. Ci sono due soluzioni possibili che ho scoperto:

  • Naive - > Invia il comando di avvio ad un altro dispositivo, quindi avvia il metronomo dopo un determinato periodo di tempo (30 ms circa)
  • Misura il ritardo medio tra i dispositivi e avvia il dispositivo master dopo il timeout

Ho anche pensato all'API di Atomic Clock ma trovo che sia eccessivo.

Qualche idea?

    
posta Krzysztof Wende 04.04.2015 - 15:27
fonte

2 risposte

2

La perfezione non è possibile. Ma puoi probabilmente avvicinarti abbastanza alla tua sincronizzazione sulla strategia di sincronizzazione dell'ora di ntp .

In sostanza, puoi designare un master, far inviare al client un pacchetto, incluso il tempo di invio, fare in modo che il server lo copi in un pacchetto di risposta, registrando anche il tempo di ricezione e il tempo di risposta. Il client emette le richieste di sincronizzazione fino a quando non è soddisfatto del fatto che stia visualizzando misure di latenza ragionevolmente coerenti e quindi aggiusta il proprio clock.

Più o meno.

E poi è solo questione di avere l'uno o l'altro la responsabilità di impostare gli orari di inizio e fine. E decidendo quanto sia critico che l'altra app non manchi il primo beat. (Contro ritardare l'ora di inizio per tenere conto della congestione della rete.) Ad es., iniziare 70bpm, efficace a time . Se time è nel passato quando lo slave riceve il messaggio, calcola solo la velocità e quando deve verificarsi il prossimo battito.

    
risposta data 04.04.2015 - 17:03
fonte
1

Ci sarà sicuramente una sorta di misurazione del ritardo reciproco in corso come parte di qualsiasi soluzione robusta. Non si può mai ottenere la sincronizzazione perfetta , poiché gli orologi possono andare alla deriva oltre all'avvio lento o veloce e le prestazioni della rete possono essere abbastanza schizofreniche da sconfiggere qualsiasi misurazione precisa, quindi cercare un margine di errore come 100ms o 50ms.

Alcune cose su cui posso pensare:

  • Invia timestamp con ogni pacchetto. Gli orologi dei dispositivi non saranno perfettamente sincronizzati, ma sapere quando l'altro dispositivo pensa che tutto sia accaduto può rendere più facile calcolare il ritardo medio.

  • Designare un dispositivo come "server autorevole" per quanto riguarda lo stato del metronomo e fare in modo che i due dispositivi continuino a eseguire il ping dopo la sincronizzazione iniziale in modo che il dispositivo "client" possa correggersi se si allontana nel tempo.

  • Chiedi a entrambi i dispositivi di misurare il ritardo medio, quindi controlla se sono d'accordo, quindi fai "testare" quel valore inviando un segnale di avvio e controllando se ricevono ping gli uni dagli altri nei tempi e con i timestamp che si aspettavano.

  • Prova a chiedere a una fonte esterna per il tempo, sperando che il ritardo da esso a entrambi i dispositivi sarà simile. Questo thread StackOverflow suggerisce GPS e NIST.

La risposta "corretta" dovrà essere determinata attraverso la sperimentazione. A seconda della natura della tua app, potresti anche volere alcune opzioni di "sincronizzazione manuale" per quando la rete non sta collaborando.

    
risposta data 04.04.2015 - 15:52
fonte

Leggi altre domande sui tag