首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过网络访问GPSD端口2947

通过网络访问GPSD端口2947
EN

Stack Overflow用户
提问于 2017-02-15 12:26:41
回答 3查看 7K关注 0票数 4

有一个RPI2与最新的杰西Lite Raspbian 2017年1月与Adafruit终极GPS帽子和PPS使用来自digitalbarbedwire.com的帖子信息。易于设置,PPS和所有gps命令在本地工作得很好。

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

有什么建议吗?

相关文件:

代码语言:javascript
复制
$ 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

有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2017-04-29 14:57:29

Gpsd实际上并没有监听端口2947,而是systemd。在Debian中,默认情况下,这只是本地的。当请求进入时,systemd启动gpsd,并将将来的请求重定向到守护进程。因此,给gpsd提供-G参数实际上不会改变任何事情。

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

代码语言:javascript
复制
# /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

票数 6
EN

Stack Overflow用户

发布于 2020-03-14 07:22:05

Linux Mint 19,我不得不将127.0.0.1替换为0.0.0.0,这样我就可以在局域网上共享GPS数据

代码语言:javascript
复制
#/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
EN

Stack Overflow用户

发布于 2017-05-08 08:21:56

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

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

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

代码语言:javascript
复制
ssh -N -L 2947:localhost:2947 user@PC1

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

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

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

代码语言:javascript
复制
autossh -N -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 2947:localhost:2947 user@PC1

如果它可以工作,添加-f让自动加载进入后台模式。

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

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

Look here for more detail on how to use autossh

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42240757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档