我正在尝试在 Pi 上使用 C++ 与 GPSD 的集成。如果我运行 GPSMON,我可以验证我有完整的修复没有问题,但是在我的 C++ 程序中,我得到了模式 0 的修复,这意味着“尚未看到模式更新”。
该程序在套接字连接处没有出错,所以我不确定是什么导致了断开连接。
我正在尝试在 Pi 上使用 C++ 与 GPSD 的集成。如果我运行 GPSMON,我可以验证我有完整的修复没有问题,但是在我的 C++ 程序中,我得到了模式 0 的修复,这意味着“尚未看到模式更新”。
该程序在套接字连接处没有出错,所以我不确定是什么导致了断开连接。
我想你正在使用 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 结构中断。)