Что представляет собой метка времени в обратном вызове Android onNmeaReceived при использовании GPS для синхронизации времени?

В разработке для Android (последняя версия SDK) я использую GpsStatus.NmeaListener для анализа сообщений NMEA для синхронизации времени.

В обратном вызове onNmeaReceived(long timestamp, String nmea) я анализирую строку nmea на наличие сообщений GPRMC. Затем я вычисляю смещение между системными часами и временем, полученным из сообщения GPRMC.

Теперь существует задержка между моментом получения сообщения NMEA в Android Frame и обработкой обратного вызова. Это приведет к изменению фактического смещения, которое я рассчитываю.

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

По моим измерениям, время timestamp отличается от времени системных часов, зафиксированного в обратном вызове onNmeaReceived, примерно на 10 ~ 30 мс.
Разница / смещение между временем timestamp и временем, полученным из проанализированного сообщения GPRMC, составляет порядка 7200092 мс (разница в 2 часа между GPS и системным временем).

Поэтому я бы сказал, что timestamp - это не время на основе GPS, а время системных часов, когда было получено сообщение.

Я довольно долго искал в Интернете, но не могу найти никакой информации относительно этой отметки времени. Есть ли у кого-нибудь ресурс, который рассказывает нам больше об этой временной метке? Что именно представляет собой эта отметка времени? В какой момент времени это записывается?


person Kamminga    schedule 17.07.2015    source источник
comment
a) Временная метка должна быть временем приема на основе GPS, определенным приемником, b) задержка / дрожание между получением одного местоположения GPS и временем, когда ваше приложение видит данные NMEA, не указано и вполне может быть в диапазоне сотни мс; так что не совсем хороший способ для точной отметки времени.   -  person JimmyB    schedule 17.07.2015
comment
По моим измерениям, время timestamp отличается от времени системных часов, зафиксированного в обратном вызове onNmeaReceived, примерно на 10 ~ 30 мс. Поэтому я бы сказал, что это не время по GPS. Разница / смещение между временем между timestamp и временем, полученным из проанализированного сообщения GPRMC, составляет порядка 7200092 мс (разница в 2 часа между временем GPS и системным временем).   -  person Kamminga    schedule 17.07.2015
comment
Ой, извините. Я ошибочно принял timestamp, который вы упомянули, за время (отметку) из сообщения GPRMC. Однако проблема останется прежней: момент времени, когда сообщение получено за пределами приемника GPS, подвержен случайным задержкам и дрожанию даже на самом нижнем уровне программного стека. Приемники GPS для приложений хронометража имеют выделенную линию сигнала / прерывания, чтобы обеспечить синхронизацию со временем GPS, что вряд ли будет использовать устройство Android. Таким образом, я считаю, что нельзя полагаться на точность времени прибытия сообщений GPS, которая может быть ниже 100 мс.   -  person JimmyB    schedule 20.07.2015
comment
Я понимаю вашу точку зрения. Вот почему мне интересна информация timestamp. Похоже, его нужно снимать в момент прерывания от GPS-приемника, чтобы сделать информацию NMEA полезной. Однако я не могу найти никакой информации о timestamp. Измерение стандартного отклонения в 200 смещений между timestamp и временем GPRMC для 10 устройств дает среднее стандартное отклонение 6,95 мс. Таким образом, джиттер не такой высокий ... Не могли бы вы представить, где найти более достоверную документацию по timestamp?   -  person Kamminga    schedule 20.07.2015
comment
Единственное, что мне удалось найти, это osxr. org / android / source / hardware / qcom / gps / loc_api / libloc_api /, где метка времени действительно соответствует тому, что возвращает gettimeofday(). (nmea_cb - это обратный вызов типа gps_nmea_callback ).   -  person JimmyB    schedule 20.07.2015
comment
Танки! это помогает, здесь говорится, что метка времени берется, когда платформа Android обрабатывает события, полученные от механизма определения местоположения (механизм GL).   -  person Kamminga    schedule 20.07.2015


Ответы (1)


Благодаря комментариям Ханно Биндера я пришел к следующему ответу.

Обратный вызов NMEA описан в: Источник определения местоположения Android код. Здесь говорится, что timestamp в обратном вызове onNmeaReceived(long timestamp, String nmea) записывается, когда платформа Android обрабатывает события, полученные от механизма определения местоположения (механизма GL). Для обзора архитектуры GPS Android см .: обзор архитектуры GPS на XDA < / а>.

timestamp записывается как struct timeval (как указано в sys / time.h>) с использованием метода gettimeofday ().

Измерение стандартного отклонения 200 смещений между timestamp и временем GPRMC на десяти устройствах Nexus 7 (2012) дает среднее стандартное отклонение записанных смещений 6,95 мс.

person Kamminga    schedule 20.07.2015