4

使用来自 digitalbarbedwire.com 的帖子中的信息,使用 Adafruit Ultimate GPS 帽子和 PPS 使用最新的 Jessie Lite Raspbian 2017 年 1 月的 RPI2。简单的设置和 PPS 以及所有 gps 命令在本地工作得很好。

我试图让 gpsd 在端口 2947 上接受通过网络传入的请求以导出位置信息(OpenCPN)。我编辑了 /etc/default/gpsd 以添加 -G 选项 GPSD_OPTIONS="-n -G" 但不允许外部请求。如果我停止 gpsd(sudo service stop gpsd),并在前台调用 gps(/usr/sbin/gpsd -N -n -G /dev/ttyAMA0 /dev/pps0,一切正常!所以我猜有一个将gpsd作为守护进程启动的权限问题,但我还没有弄清楚。让我发疯!

有什么建议么?

相关文件:

$ cat /lib/systemd/system/gpsd.socket
[Unit]
Description=GPS (Global Positioning System) Daemon Sockets

[Socket]
ListenStream=/var/run/gpsd.sock
ListenStream=[::1]:2947
ListenStream=0.0.0.1:2947
SocketMode=0600

[Install]
WantedBy=socket

$ cat /etc/default/gpsd
# Default settings for the gpsd init script and the hotplug wrapper.

# Start the gpsd daemon automatically at boot time
START_DAEMON="true"

# Use USB hotplugging to add new USB devices automatically to the daemon
USBAUTO="true"


# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES="/dev/ttyAMA0 /dev/pps0"

# Other options you want to pass to gpsd
GPSD_OPTIONS="-n"

$ cat /lib/systemd/system/gpsd.service
[Unit]
Description=GPS (Global Positioning System) Daemon
Requires=gpsd.socket
# Needed with chrony SOCK refclock
After=chronyd.service

[Service]
EnvironmentFile=-/etc/default/gpsd
ExecStart=/usr/sbin/gpsd -N -G $GPSD_OPTIONS $DEVICES

[Install]
Also=gpsd.socket

有任何想法吗?

4

3 回答 3

6

Gpsd 实际上并没有在端口 2947 上侦听,systemd 是。默认情况下,在 Debian 中,这只是本地的。当有请求进入时,systemd 会启动 gpsd,如有必要,并将未来的请求重定向到守护进程。所以给 gpsd 的 -G 参数实际上不会改变任何东西。

您需要为 systemd gpsd.socket 单元添加一个覆盖,并告诉它监听所有地址:

# /etc/systemd/system/gpsd.socket.d/socket.conf
[Socket]
# First blank ListenStream clears the system defaults
ListenStream=
ListenStream=2947
ListenStream=/var/run/gpsd.sock

最佳实践是将此覆盖文件放在 /etc/systemd/ 中,而不是在 /lib/systemd/ 中编辑单元文件。

关于 systemd.socket 语法的文档:https ://www.freedesktop.org/software/systemd/man/systemd.socket.html

于 2017-04-29T06:57:28.717 回答
2

Linux Mint 19,我必须将 127.0.0.1 替换为 0.0.0.0,然后我才能在 LAN 上共享 GPS 数据

#/lib/systemd/system/gpsd.socket/gpsd.socket

[Unit]
Description=GPS (Global Positioning System) Daemon Sockets

[Socket]
ListenStream=/var/run/gpsd.sock
ListenStream=[::1]:2947
#ListenStream=127.0.0.1:2947
ListenStream=0.0.0.0:2947
SocketMode=0600

[Install]
WantedBy=sockets.target
于 2020-03-13T23:22:05.357 回答
1

另一种方法是使用端口转发进行无终端 SSH 会话。

例如,假设您有 PC1 运行 gpsd 服务(通过 systemd 或独立)。

在 PC2 中,您可以执行以下操作:

ssh -N -L 2947:localhost:2947 user@PC1

-N 标志防止实际的终端会话(不执行任何命令)。-L 标志表示将端口 2947 转发到 localhost 2947。

现在,如果由于某种原因会话丢失或终止,ssh 将不会自动重新连接。解决方法是安装autossh,在大多数 linux 发行版存储库中都可用。

然后,您可以像这样使用 autossh:

autossh -N -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 2947:localhost:2947 user@PC1

如果可行,添加 -f 让 autossh 进入后台模式。

您可以轻松地从 rc.local 或 systemd 单元运行 autossh。这样做意味着您只需要在 (22) 中允许 SSH 端口,并且现在通过安全的加密连接传递 gps 信息,这是单独的 gpsd 套接字会话无法做到的。显然,如果您在 PC1 和 PC2 之间设置了密钥对,它会有所帮助,因为您不需要密码。

您可以在 PC2 上运行它附带的任何 gpsd 工具,因为它看起来是本地的。来自脚本/程序的 API 调用也将像端口 2947 实际在本地运行 gpsd 一样工作。

在此处查看有关如何使用 autossh 的更多详细信息

于 2017-05-08T00:21:55.573 回答