Синхронизация времени для записи данных на нескольких устройствах Android

Этот вопрос может быть несколько затянутым, но открыт для многих предложений.


Постановка задачи:
У нас есть несколько устройств MyTouch на уровне API 8 (Android 2.2) MyTouch, которые мы будем использовать для записи данных ускорения в парке развлечений, а именно на американских горках. У нас также есть функция визуализации, которая позволяет нам строить и просматривать точки акселерометра в зависимости от времени, в которое они были записаны. Вот где мы имеем дилемму! Системные времена на устройствах Android не все одинаковы, и они не могут быть установлены в одно и то же время с точностью до миллисекунды (только вручную с минимальной точностью, что ужасно).


Решение Попытки:
Итак, я впервые прибегал к записи данных в соответствии с GPS-временем, найденным в начале приложения. Длительный короткий процесс: получите время GPS, получите системное время, получите разницу, а после записи точки данных снова получите системное время и добавьте разницу обратно во время, отметьте это как время начала записи и увеличьте на 200 миллисекунд для каждого Записанные данные пункт из там. Однако есть 2 проблемы (для получения времени GPS):

  • Использование getLastKnownLocation() не слишком точно. На самом деле это кажется очень неточным. Это дает мне время, которое составляет 9 минут от текущего GMT / UTC. По совпадению, однако, системное время также почти на 9 минут отключено на устройстве Android … разница между временем GPS и системным временем обычно составляет от 1000 до 5000 миллисекунд (от 1 до 5 секунд). Полагаю, что мой код ошибочен. Я вставил его внизу, чтобы вы его увидели.

  • requestSingleUpdate() было бы здорово использовать, поскольку оно получило бы более недавнее местоположение и, возможно, очень точное время. Проблема? Требуется API уровня 9 … устройств, которых у нас нет.


Идеи:
Вот идея, которую я имел, хотя, что, если я каким-то образом вытащил глобальное время с веб-сайта и использовал время, оттянутое оттуда, как время записи? Проблема здесь – я понятия не имею, как это сделать, это просто принятие желаемого за действительное …

Другая идея – есть какой-то глобальный getTime() о котором я просто не знаю?


Рассуждая, почему я хочу, чтобы Android оттягивал время от аналогичных часов:
Представьте себе, что два человека сидят на горках – один на переднем сиденье, один на спине. При записи данных лицо впереди, очевидно, будет испытывать ускорения немного раньше, чем человек сзади (и мы хотим это увидеть на нашем графике визуализации). Вот почему важно, чтобы миллисекундная точность, что эти точки записываются в соответствии с одним глобальным временем.


Код:

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

Обновить:
Здесь кто-то предлагает своего рода «сервер» getTime() . Мне очень нравится его код / ​​ответ, но что это за «сервер» и / или как мне установить его, если это лучшее решение?

Я думаю, что «сервер», на который ссылается ответчик, должен установить выделенный сервер времени. В основном вы должны настроить некоторые аппаратные средства, с которыми будут подключаться все люди, использующие ваше приложение, чтобы получить время. Это может быть больше усилий, чем вы готовы внести.

Вам понадобится следующее:

  1. Некоторое запасное оборудование (может быть так же просто, как компьютер, работающий с tomcat, или такой сложный, как выделенная серверная стойка, в зависимости от того, сколько людей, по вашему мнению, будет использовать ваше приложение.) Или подписку на сервер / веб-узел домена.

  2. Некоторые веб-службы, которые просто возвращают время, когда приложение запрашивает его.

  3. Вам нужно будет сделать ваш сервер / webservice общедоступным, что является другой головной болью.

Я не уверен, что это будет вашим лучшим решением, так как это будет зависеть от сетевого подключения для доступа к выделенному серверу. Есть несколько альтернативных решений, которые вы можете попробовать:

Я не знаю, будет ли ваше приложение публичным или использоваться специально для исследований. Если это последнее, и это будет с группой людей, которых вы знаете и можете координировать, я на самом деле рекомендую вам просто загрузить ClockSync, синхронизировать ваши телефоны на тот же сервер времени и затем выполнить свое приложение.

Если ваше приложение будет распространено среди людей, с которыми у вас не будет контакта, тогда, возможно, лучше всего, чтобы ваше приложение подключилось к одному серверу ntp и хватало время. Вот список открытых ntp-серверов, которые вы можете использовать: http://www.pool.ntp.org/en/

Вот еще информация:

ClockSync

Пример кода для создания SNTP-соединения

Надеюсь, что информация будет полезной для вас при принятии решения.

Intereting Posts