我试图在Pi上使用与GPSD的C ++集成。如果我运行GPSMON,我可以验证我有完整的修复没有问题,但是在我的C ++程序中,我得到了模式0的修复,这意味着"模式更新没有看到"。
程序在套接字连接上没有错误输出,因此我不确定导致断开连接的原因。
答案 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结构中断。)