2014-02-10 4 views
1

Я пытаюсь получить время из Интернета и не хочу использовать время устройства. Я выполняю следующий запрос клиента sntp на время, но, как и ожидалось, полученное время неточно из-за времени запроса-ответа. Как преодолеть латентность и получить максимальное изменение +/- 20 мс ??Получение точного времени из интернета

Long time=0; 
    while (true) { 
    SntpClient client = new SntpClient(); 
    if (client.requestTime("time-a.nist.gov",6000)) { 
     long now = client.getNtpTime() + SystemClock.elapsedRealtime() 
         - client.getNtpTimeReference(); 
     Log.d("Time Difference", time-now+""); 
     time=now; 
     Thread.sleep(5000); 
    } 
    } 

Файл журнала выглядит следующим образом:

- 02-10 23:27:16.125: E/Time Difference(15566): -5804 
- 02-10 23:27:21.449: E/Time Difference(15566): -5272 
- 02-10 23:27:26.774: E/Time Difference(15566): -5358 
- 02-10 23:27:32.206: E/Time Difference(15566): -5365 
- 02-10 23:27:37.528: E/Time Difference(15566): -5328 
- 02-10 23:27:43.056: E/Time Difference(15566): -5429 
- 02-10 23:27:48.892: E/Time Difference(15566): -5694 
- 02-10 23:27:54.730: E/Time Difference(15566): -5972 
- 02-10 23:28:00.563: E/Time Difference(15566): -5679 
- 02-10 23:28:06.096: E/Time Difference(15566): -5686 

Разница во времени, как ожидается, будет постоянной 5000 в идеальном исполнении.

+2

«Разница во времени должна быть постоянной 5000 при безупречном исполнении» - Android не является RTOS. Кроме того, 'sleep()' не является точным "при безупречном выполнении" - все, что он делает, это организовать доступ к потоку для планирования после этого количества миллисекунд. Когда поток * будет * запускать инструкции, зависит от ОС, и это будет зависеть от того, что еще происходит с устройством. – CommonsWare

+0

Могу ли я предположить, что изменения в моих значениях обусловлены спящим(), а не латентностью? – gaurav

+0

Я говорю, что полагаться на 'sleep()', чтобы быть точным, является ошибочным подходом к тестированию. – CommonsWare

ответ

0

Как преодолеть латентность и получить максимальное изменение +/- 20 мс ??

Я не знаю о +/- 20 мс, но, предполагая, что устройство Android, о котором идет речь, имеет GPS, вы могли бы получить время от подсистемы GPS, поскольку время GPS (должно быть) очень точный. Вы можете использовать requestSingleUpdate для этого, как описано в this question and its answers.

+0

«вам удалось синхронизация с GPS? Насколько мне известно, Location.getTime предоставляет системное время, когда было получено обновление местоположения, т. е. на этом слое не задействованы часы GPS ». Это один из ответов, и, как я сказал, я не хочу системного времени – gaurav

+0

@ user1980743: Знаем ли мы, что ответ правильный? Но да, похоже, даже если задействованы часы GPS, это все равно будет переводом этого на текущую дату/время устройства, что может оказаться нецелесообразным ... Но если вам просто нужно расстояние 5000 мс, t используйте 'getTime', используйте [' getElapsedRealtimeNanos'] (http://developer.android.com/reference/android/location/Location.html#getElapsedRealtimeNanos()). Я не сказал «использовать' getTime' ». :-) –

+0

нет его не около 5000ms, 5000ms для моего тестирования. Мне нужно, чтобы контрольные часы на двух или более устройствах были одинаковыми. – gaurav

0

client.requestTime - это сетевая операция. Я никогда не смогу принять меньше определенного времени, над которым у вас нет абсолютно никакого контроля.

Изменение Наблюдает продиктованы колебаниями во время связи, качестве сети ...

+0

Итак, нет способа получить точное время на устройстве Android? – gaurav

+0

'client.getNtpTime() + SystemClock.elapsedRealtime() - client.getNtpTimeReference()' довольно точен. NtpTimeReference is, IIUC, время системы, когда время обновлялось из сети. 'SystemClock.elapsedRealtime() - client.getNtpTimeReference() 'сообщает вам, насколько вы близки с этого момента. – njzk2

-1

В Java. Для сна я использую этот бит.

long start = System.currentTimeMillis(); 
long current = start; 
while(current - start < 5000){ 
    current = System.currentTimeMillis();  
} 

, что 5 строк - это мой код «Сон». попробуйте использовать это и посмотреть, какие результаты вы получите.

+0

нет улучшения в результате 02-11 00: 09: 46.519: E/разность во времени (17610): -5716 02-11 00: 09: 51.950: E/разность во времени (17610): -5378 02-11 00 : 09: 57.374: E/Разница во времени (17610): -5460 02-11 00: 10: 02.850: E/Разница во времени (17610): -5523 ​​ 02-11 00: 10: 08.439: E/Time Разница (17610): -5575 02-11 00: 10: 13.783: E/Time Разница (17610): -5269 02-11 00: 10: 19.184: E/Time Разница (17610): -5438 – gaurav

+0

Вы пытаетесь получить результаты как 5020 или меньше? –

+0

Я просто хочу, чтобы время было согласованным. – gaurav

Смежные вопросы