3

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

该程序在套接字连接处没有出错,所以我不确定是什么导致了断开连接。

4

1 回答 1

2

我想你正在使用 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+ 行,@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 )withlevel>=6并编译 libgps、libgpsmm withdefine CLIENTDEBUG_ENABLE以获得调试跟踪输出。

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

git 提交:
2016-04-07 将“状态”添加到 TPV 以获取 DGPS 通知
2016-01-04 地址 Savannah 错误 #46804:JSON 卫星视图解析有些损坏。
2015-04-04 添加 PPS 精度的客户端库解析。
2015-01-24 在客户端库中,ATT 解析中缺少“dip”成员。

发布:
3.11 2014 年 8 月 23 日
3.12 2015 年 2 月 22 日 不兼容
3.13 2015 年 2 月 26 日
3.14 2015 年 3 月 14 日
3.15 2015 年 6 月 3 日不兼容
3.16 2016 年 1 月 8 日 不兼容
3.17 xx-xxx-xxxx 不兼容

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

于 2016-07-27T01:17:02.180 回答