GPSD дает режим 0 в libgpsmm

Я пытаюсь использовать интеграцию C ++ с GPSD на Pi. Если я запускаю GPSMON, я могу убедиться, что у меня есть полное исправление без проблем, однако в моей программе на C ++ я получаю исправление с режимом 0, что означает «ОБНОВЛЕНИЕ РЕЖИМА НЕ СДЕЛАНО».

Программа не выдает ошибку при подключении к сокету, поэтому я не уверен, что является причиной отключения.

1

Решение

Я полагаю, вы используете 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.)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]