通过网络

时间:2017-02-15 04:26:41

标签: systemd gpsd

使用最新的Jessie Lite Raspbian 2017年1月的RPI2与Adafruit终极GPS帽子和PPS使用来自digitalbarbedwire.com的帖子的信息。轻松设置,PPS和所有gps命令在本地运行良好。

我正在尝试让gpsd通过端口2947上的网络接收传入请求以导出位置信息(OpenCPN)。我编辑了/ etc / default / gpsd来添加-G选项GPSD_OPTIONS =" -n -G"但是不允许外部请求。如果我停止gpsd(sudo服务停止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

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

Linux Mint 19,我必须用0.0.0.0替换127.0.0.1,然后才能在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

答案 2 :(得分:0)

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

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

从PC2,你可以这样做:

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

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

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

然后你可以像这样使用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一样工作。

Look here for more detail on how to use autossh