使用最新的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
有什么想法吗?
答案 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一样工作。