我正在尝试在Pi上将C++集成与GPSD一起使用。如果我运行GPSMON,则可以验证我是否具有完整的修复程序,但是在我的C++程序中,我将获得模式0的修复程序,这意味着“尚未看到MODE UPDATE”。
该程序在套接字连接时不会出错,因此我不确定是什么导致断开连接。
最佳答案
我想您正在使用libgps和libgpsmm。您的问题可能是由gpsd守护程序和libgps之间的版本不兼容引起的。
即客户端(libgps)可能会使用与gpsd守护程序不同的“API协议(protocol)” gpsd_json版本。
如果您决定构建/链接静态版本的libgps(与gpsd的版本号不完全匹配),则可能会发生这种情况。或者,如果您的客户端在不同于gpsd服务器的计算机上运行。
我遇到了同样的问题,花了我宝贵的时间找出原因:
libgps中的JSON解析器设计不良。它会忽略/丢弃包含名称/值对的JSON对象,这些对象不是先验的。
因此,可能会丢弃来自gpsd的整个TPV消息,并且您的客户端实现不会显示任何错误消息,两个libgps函数都不会返回错误代码。太糟糕了。
这是(json.c,296+行,@ 2016-07-27):
在这里(libgps_json.c,第27+行,@ 2016-07-27):
将_gpsmm->enable_debug( level, stderr )
与level>=6
一起使用,并编译libgps和libgpsmm与define CLIENTDEBUG_ENABLE
一起获得调试跟踪输出。
gpsd源的git repositiory告诉我们gpsd_json协议(protocol)最近不兼容更改的日期:
gpsd开发人员是否不在乎跨版本的客户端-服务器兼容性?那么共享的libgps库二进制API / ABI稳定性如何?
它缺少版本控制功能。也很不安全。
(请查看有关上述2015-04-04更改的注释git评论:当前正在丢弃数据,等待下一个gps_data_t结构中断。)