Я пытаюсь использовать интеграцию C ++ с GPSD на Pi. Если я запускаю GPSMON, я могу убедиться, что у меня есть полное исправление без проблем, однако в моей программе на C ++ я получаю исправление с режимом 0, что означает «ОБНОВЛЕНИЕ РЕЖИМА НЕ СДЕЛАНО».
Программа не выдает ошибку при подключении к сокету, поэтому я не уверен, что является причиной отключения.
Я полагаю, вы используете libgps и libgpsmm. Ваша проблема может быть вызвана несовместимостью версий между демоном gpsd и libgps.
То есть клиент (libgps) может использовать другую версию «протокола API» gpsd_json чем демон gpsd.
Это может произойти, если вы решили собрать / связать статическую версию libgps, которая не именно так соответствует номеру версии gpsd. Или если ваш клиент работает на другой машине, чем сервер gpsd.
Я столкнулся с той же проблемой, и мне потребовалось драгоценное время, чтобы выяснить причину:
Парсер JSON в libgps спроектирован плохо. Он игнорирует / отбрасывает объекты JSON, которые содержат пары имя / значение, которые априори не известны.
Таким образом, все сообщения TPV от gpsd могут быть отброшены, и ваша клиентская реализация не показывает сообщение об ошибке, ни функции libgps не возвращают код ошибки. Очень плохо.
Вот (json.c, строка 296+, @ 2016-07-27):
if (cursor->attribute == NULL) { json_debug_trace((1, "Unknown attribute name '%s' (attributes begin with '%s').\n", attrbuf, attrs->attribute)); /* don't update end here, leave at attribute start */ return JSON_ERR_BADATTR; }
И здесь (libgps_json.c, строка 27+, @ 2016-07-27):
static int json_tpv_read(const char *buf, struct gps_data_t *gpsdata, const char **endptr) { const struct json_attr_t json_attrs_1[] = { {"class", t_check, .dflt.check = "TPV"}, {"device", t_string, .addr.string = gpsdata->dev.path, .len = sizeof(gpsdata->dev.path)}, {"time", t_time, .addr.real = &gpsdata->fix.time, .dflt.real = NAN}, ...
использование _gpsmm->enable_debug( level, stderr )
с level>=6
и скомпилируйте libgps, libgpsmm с define CLIENTDEBUG_ENABLE
чтобы получить вывод трассировки отладки.
git-репозиторий источников gpsd сообщает нам даты последних несовместимых изменений в протоколе gpsd_json:
Git совершает:
2016-04-07 Добавить «статус» в TPV для уведомления DGPS
2016-01-04 Адрес Ошибка саванны # 46804: Разбор вида со спутника JSON несколько не работает.
2015-04-04 Добавлен разбор клиент-библиотеки точности PPS.
2015-01-24 В клиентской библиотеке отсутствовал элемент dip при разборе ATT.релизы:
3.11 23 августа 2014
3.12 22-фев-2015 несовместимый
3.13 26 февраля 2015
3.14 14 марта 2015 г.
3.15 03 июня 2015 несовместимый
3.16 08-янв-2016 несовместимый
3.17 хх-ххх-хххх несовместимый
Не заботятся ли разработчики gpsd о совместимости клиент-сервер между версиями? Как насчет стабильности двоичного API / ABI разделяемой библиотеки libgps?
В нем отсутствуют функции управления версиями. Также очень небезопасно.
(Посмотрите на комментарий git на изменение 2015-04-04, упомянутое выше: Данные в настоящее время отбрасываются в ожидании следующего разрыва структуры gps_data_t.)
Других решений пока нет …