GPSD 使用 TCP 和串行

GPSD 使用 TCP 和串行

因此,我尝试在 Ubuntu 14.04 上运行 gpsd,使用通过 TCP 传入的 NMEA 馈送和 RS-232 馈送的 DCD 线路上的 PPS 信号。我使用的 GPS 也可以选择使用 RS-232,但在这种情况下我们需要通过 TCP 进行。

通过串行启动带有 NMEA 和 PPS 的 gpsd 工作正常。我使用类似以下内容的东西:

sudo gpsd -n /dev/ttyCTI1 /dev/pps0

然后启动 gpsmon,我看到 NMEA 字符串和 PPS 线都出现了。

当我使用以下命令启动 gpsd 时:

sudo gpsd -n tcp://192.168.43.172:10001 /dev/pps0

我只看到 NMEA 字符串。

在 /dev/pps0 上执行 ppstest 并在 /dev/ttyCTI1 上执行 ppscheck 会产生预期的输出。

知道哪里出了问题吗?请注意,我使用的是从源代码构建的 gpsd 3.18。

答案1

dirkt 是正确的。答案就在 gpsd 源代码中。查看ntpshm_link_activatetimehint.c第 458 行的方法:

/* don't talk to NTP when we're:
 *   reading from a file
 *   reading from a pipe
 *   reading from a remote gpsd
 *   running inside the test harness (PTY)
 *   over TCP or UDP
 */
if (SOURCE_BLOCKDEV == session->sourcetype ||
    SOURCE_GPSD == session->sourcetype ||
    SOURCE_PIPE == session->sourcetype ||
    SOURCE_PTY == session->sourcetype ||
    SOURCE_TCP == session->sourcetype ||
    SOURCE_UDP == session->sourcetype) {
    return;
}

来源:https://fossies.org/dox/gpsd-3.24/timehint_8c_source.html#l00449

这可能只是决定不与 NTP 通信的兔子洞的开始gpsd,但我将留给比我更熟悉的用户来搜索源代码。无论如何,这里的评论非常明确。我只能假设,就像 Dirkt 所做的那样,他们这样做是因为非串行传输中的延迟可能高得多 - 这可能会导致通过连接的 1PPS 信号通过 TCP 发送的 NMEA 消息不一致。也许您可以简单地在源代码中修补此方法,gpsd以允许即使在 TCP 上也可以进行 NTP 通信,但我不能保证这样做会带来任何好处。

我遇到了同样的情况,花了很长时间才弄清楚。希望这能对以后的人有所帮助。

相关内容