GPSD在libgpsmm中给出模式0

时间:2016-06-27 21:31:19

标签: c++ gps raspberry-pi gpsd

我试图在Pi上使用与GPSD的C ++集成。如果我运行GPSMON,我可以验证我有完整的修复没有问题,但是在我的C ++程序中,我得到了模式0的修复,这意味着"模式更新没有看到"。

程序在套接字连接上没有错误输出,因此我不确定导致断开连接的原因。

1 个答案:

答案 0 :(得分:1)

我想你使用的是libgps和libgpsmm。您的问题可能是由gpsd守护程序和libgps之间的版本不兼容引起的。 即客户端(libgps)可能会说与gpsd守护程序不同的“API协议”gpsd_json版本。 如果您决定构建/链接libgps的静态版本 - 这与完全匹配gpsd的版本号,则可能会发生这种情况。或者,如果您的客户端运行在不同于gpsd服务器的机器上。

我遇到了同样的问题,我花了很多时间才弄清楚原因:
libgps中的JSON解析器设计得很糟糕。它忽略/丢弃包含名称/值对的JSON对象,这些对象不是先验的 因此,可能会丢弃来自gpsd的整个TPV消息,并且您的客户端实现不会显示任何错误消息,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 + 10行,@ 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一起使用,并使用define CLIENTDEBUG_ENABLE编译libgps,libgpsmm以获取调试跟踪输出。

gpsd来源的git存储库告诉我们gpsd_json协议最近不兼容的更改的日期:

  

git提交:
  2016-04-07向TPV添加“状态”以进行DGPS通知
  2016-01-04地址Savannah bug#46804:JSON卫星视图解析有点破碎   2015-04-04添加PPS精度的客户端库解析   2015-01-24在客户端库中,ATT解析中缺少“dip”成员。

  发布:
  3.11 2014年8月23日   3.12 2015年2月22日不兼容
  3.13 26-Feb-2015
  3.14 14-Mar-2015
  3.15 03-Jun-2015 不兼容
  3.16 08-Jan-2016 不兼容
  3.17 xx-xxx-xxxx 不兼容

gpsd开发人员不关心跨版本的客户端 - 服务器兼容性吗?那么共享libgps库的二进制API / ABI稳定性呢? 它缺少版本控制功能。也很不安全。
(看看上面提到的2015-04-04更改的评论git评论:数据当前被丢弃,等待下一个gps_data_t结构中断。