2个版本
0.1.1 | 2022年12月22日 |
---|---|
0.1.0 | 2022年12月22日 |
#345 in 科学
65KB
1K SLoC
gpsd
这是基于C的gpsd的重写,这在导航中非常关键。我用它来读取我的NMEA2000设备的数据包,以及从备用GPS设备中读取;对我来说特别重要的是NMEA 2000车载数据总线到GPS和AIS消息,这些是opencpn可以理解的。
实际上,C gpsd NMEA2000驱动程序目前无法解析AIS消息并进行转换。它似乎只支持GPS消息和一些航向信息。看起来那里有代码,但它似乎不起作用。更糟糕的是,它时不时地就退出。重新启动gpsd可以解决这个问题。代码很脆弱,所以使用内存安全的语言从头开始重写会更容易。
如何运行
运行方式: cargo run --release -- -D 3 -N -s 4800 /dev/ttyUSB0
(使用您的设备和速度)
-D 3
指定调试级别消息,其中包括设备打开和关闭消息。如果您只想查看信息级别,可以不使用此选项。
当前状态
目前它仅做到足以使opencpn满意地从中读取。
- GPS设备已打开,即使没有订阅者,也会将消息转发到通道,这是浪费电力。它甚至不应在至少有一个监听器(如gpsd所做的那样)之前打开GPS设备,除非指定nowait。但是,现在ait是大多数发行版中的默认值。所以也许这并不是那么糟糕。
- 尚未提供串行设备的自动波特率检测,因此您必须在命令行中指定速度。
待办事项的热门列表
- 波特率检测。
- 读取NMEA 2000消息并将它们转换为nmea 0183。特别是,我希望生成AIS消息。
- 实现热插拔。一旦完成波特率检测,这应该相对简单。
低优先级事项
- SIRF设备不受支持,但已实现了检测
- 不支持cgps和其他程序期望的json消息
- 不支持轮询
- 不检测GPS设备
- 不支持PPS设备
- 不支持一些不常见的设备(例如Garmin TXT模式)
有几件事我们已经做得比gpsd更好
- 连接后发出一些命令,但实际上没有获得任何输出,会导致您进入60秒的断开连接计时器。这比gpsd更激进,gpsd似乎有一些复杂的规则来决定是否断开您的连接。这可能会影响POLL客户端,但如果他们至少每分钟没有一次轮询,他们可能需要断开重连。
- 接收到的请求不必一次性全部到来。要在gpsd中看到这个错误,使用telnet连接到它,发送?W然后按CTRL-D将此数据包推送到gpsd,不包含换行符,导致“无效命令”错误。此实现解析“命令”,这意味着部分命令将等待其完成。
- 在自动波特率检测期间,为了改变速度而进行许多系统调用和延迟,只需关闭设备,然后在新的速度下重新打开它。
计时信息
因此,我在运行几小时后甚至无法获得超过一秒钟的CPU时间。与每小时占用大约1分钟CPU时间的gpsd相比,我对性能非常满意。计时,在我的戴尔i5上,YMMV。
依赖关系
~11–23MB
~332K SLoC