#gps #gpsd #设备 #导航 #替换 #ais #nmea2000

app rgpsd

gpsd的Rust语言最小替代品

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