如何解决1/init
我目前正在运行两个 raspBerry pi,我们称它们为 WORKING PI 和非工作 pi。
工作 PI:
- B 型修订版 2
- 杰西 4.1.19+ #858
- gpsd 修订版 3.11-3+deb8ul
- 这个单位从原来的 Wheezy 发行版升级到这个版本的 杰西。用于在以下情况下进行有效的 TL-WN725N 无线连接 哎呀,但在 Jessie 升级后,这变得无法操作。
非工作圆周率
- B 型修订版 2+
- 杰西 4.1.7+ #817
- gpsd 修订版 3.11-3
- 这是原始发行版,但已更新到最新版本。
- 此设备具有可用的 TL-WN725N 无线连接。
两个圆周率的共同点:
- RPI GPS 插件均运行 U-Blox 6 gps 芯片组。
- 当使用 gpsmon /dev/ttyAMA0 命令时,两个 pi 都会反刍预期的 gps NMEA 字符串
- 可以使用 u-blox 驱动程序加载 gpsmon 命令,并在 NMEA 和 U-Blox 格式的 GPS 数据之间切换。
问题 最终目标是让两个pi使用python记录gps数据。要做到这一点,看来(据我所知)必须有一个 gpsd 套接字正在运行。这可以使用 cgps -s 进行验证。这在 WORKING PI 中有效,但在非工作 pi 中失败。
我已经在两个 pi 中使用以下命令启动了 gpsd 服务
sudo gpsd /dev/ttyAMA0 -b -N -D 3 -n -F /var/run/gpsd.sock
在 WORKING PI 中,此命令被接受并且 cgps -s 运行正确。此外,还提供以下信息:
$ sudo netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 498/ser2net
tcp 0 0 0.0.0.0:2000 0.0.0.0:* LISTEN 498/ser2net
tcp 0 0 0.0.0.0:2001 0.0.0.0:* LISTEN 498/ser2net
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 452/sshd
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 369/inetd
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 498/ser2net
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 769/exim4
tcp 0 0 0.0.0.0:3001 0.0.0.0:* LISTEN 498/ser2net
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 814/0
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 20461/2
tcp 0 0 127.0.0.1:6012 0.0.0.0:* LISTEN 6177/5
tcp 0 0 127.0.0.1:6013 0.0.0.0:* LISTEN 6236/7
tcp 0 0 127.0.0.1:2947 0.0.0.0:* LISTEN 8609/gpsd
tcp6 0 0 :::22 :::* LISTEN 452/sshd
tcp6 0 0 ::1:25 :::* LISTEN 769/exim4
tcp6 0 0 ::1:6010 :::* LISTEN 814/0
tcp6 0 0 ::1:6011 :::* LISTEN 20461/2
tcp6 0 0 ::1:6012 :::* LISTEN 6177/5
tcp6 0 0 ::1:6013 :::* LISTEN 6236/7
tcp6 0 0 ::1:2947 :::* LISTEN 8609/gpsd
这正是我所期望的:gpsd 服务正在使用 IPv4 和 IPv6 2947 套接字。
现在,使用非工作 pi:
$ sudo gpsd /dev/ttyAMA0 -b -N D 3 -n -F /var/run/gpsd.sock
gpsd:ERROR: can't bind to IPv4 port gpsd,Address already in use
gpsd:ERROR: maybe gpsd is already running!
gpsd:ERROR: can't bind to IPv6 port gpsd,Address already in use
gpsd:ERROR: maybe gpsd is already running!
响应netstat命令:
$ sudo netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2947 0.0.0.0:* LISTEN 1/init
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 564/ser2net
tcp 0 0 0.0.0.0:2000 0.0.0.0:* LISTEN 564/ser2net
tcp 0 0 0.0.0.0:2001 0.0.0.0:* LISTEN 564/ser2net
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 477/sshd
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 564/ser2net
tcp 0 0 0.0.0.0:3001 0.0.0.0:* LISTEN 564/ser2net
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 882/0
tcp6 0 0 ::1:2947 :::* LISTEN 1/init
tcp6 0 0 :::22 :::* LISTEN 477/sshd
tcp6 0 0 ::1:6010 :::* LISTEN 882/0
显然,init 服务正在使用 IPv4 和 IPv6 2947 套接字(我是 RF 硬件专家,不是软件专家,但这听起来像是操作系统正在控制端口。
/lib/systemd/system/gpsd.socket
/lib/systemd/system/gpsd.service
/etc/default/gpsd
过去 2 周我一直在梳理这个网站和其他网站,并尝试了那里提供的解决方案(无济于事)。看来这并不是一个不常见的问题。我欢迎任何帮助,但我的 3 个主要问题是:
- 为什么 init 在 WORKING PI 中启动时不捕获端口 2947,而非工作 pi 确实捕获它,即使两个 pi 都运行 Jessie 4.1(尽管我承认不同的版本)。很明显,非工作 pi 无法挂载 gpsd 套接字的原因是它想要的端口已经被占用。
- 有没有办法告诉非工作 pi 不要捕获端口 2947,或者有没有办法让 init 从命令行放弃该端口?
- 是否有可能,非工作 pi 上的无线正在使用这些端口,这就是为什么 gpsd 可以抓取 WORKING PI(没有无线)上的端口而不能在非工作 pi(有一个无线工作)。
我没有想法了。
我不太确定是否应该添加评论、编辑帖子或回答问题。针对 larsKS 的第一个回答:
我将分别记录每个 pi。
非工作圆周率
重启 pi 后:
$ systemctl is-enabled gpsd.socket
enabled
$ systemctl is-enabled gpsd.service
static
cgps -s 或 cgps 仍然不起作用(超时)
不过,看起来套接字和服务是存在的。所以,我尝试远程登录到端口 2947:
$ sudo telnet localhost 2947
Trying ::1...
Connected to localhost.
Escape character is '^]'.
{"class":"VERSION","release":"3.11","rev":"3.11-3","proto_major":3,"proto_minor":9}
?WATCH={"enable":true,"json"}
{"class":"DEVICES","devices":[]}
{"class":"WATCH","enable":true,"json":false,"nmea":false,"raw":0,"scaled":false,"timing":false,"split24":false,"pps":false}
^]
telnet> quit
Connection closed.
连接挂了。
gpsmon /dev/ttyAMA0 仍然正常运行。
工作 PI
$ systemctl is-enabled gpsd.socket
disabled
$ systemctl is-enabled gpsd.service
static
这是我所期望的,所以我尝试像以前一样启动服务:
$ sudo gpsd /dev/ttyAMA0 -b -N D 3 -n -F /var/run/gpsd.sock
gpsd:ERROR: device open Failed: No such file or directory - retrying read-only
gpsd:ERROR: read-only device open Failed: No such file or directory
gpsd:ERROR: initial GPS device D open Failed
gpsd:ERROR: device open Failed: No such file or directory - retrying read-only
gpsd:ERROR: read-only device open Failed: No such file or directory
gpsd:ERROR: initial GPS device 3 open Failed
gpsd:ERROR: device open Failed: No such file or directory - retrying read-only
gpsd:ERROR: read-only device open Failed: No such file or directory
gpsd:ERROR: D: device activation Failed.
gpsd:ERROR: device open Failed: No such file or directory - retrying read-only
gpsd:ERROR: read-only device open Failed: No such file or directory
gpsd:ERROR: 3: device activation Failed.
gpsd:ERROR: device open Failed: No such file or directory - retrying read-only
gpsd:ERROR: read-only device open Failed: No such file or directory
gpsd:ERROR: D: device activation Failed.
gpsd:ERROR: device open Failed: No such file or directory - retrying read-only
gpsd:ERROR: read-only device open Failed: No such file or directory
gpsd:ERROR: 3: device activation Failed.
^Z
[1]+ Stopped sudo gpsd /dev/ttyAMA0 -b -N D 3 -n -F /var/run/gpsd.sock
现在不同了。事实上,当我尝试运行 cgps 时,我只会看到一个空白屏幕。以前我会得到一张空桌子,但现在什么都没有。
当我尝试运行 gpsmon /dev/ttyAMA0 时,我得到:
$ gpsmon /dev/ttyAMA0
gpsmon:ERROR: device open Failed: Device or resource busy - retrying read-only
gpsmon:ERROR: read-only device open Failed: Device or resource busy
gpsmon: activation of device /dev/ttyAMA0 Failed,errno=16 (Device or resource busy)
但是,如果我重新启动,gpsmon /dev/ttyAMA0 会恢复正常运行。
作为脚注:
$ systemctl enable --Now gpsd.socket
systemctl: unrecognized option '--Now'
作为一般观察,gpsmon /dev/ttyAMA0 命令有效,因为我只是通过串行端口将 NMEA 消息流式传输到我的屏幕。
cgps(或 python 代码)不起作用,因为套接字和/或服务不起作用。
解决方法
您不应该手动启动 gpsd
。这就是 /lib/systemd/system/gpsd.{socket,service}
的用途。
听起来像是在“非工作”的 Pi 上,gpsd
服务已经启用;您应该能够通过运行 cgps
命令来确认这一点。您可以通过运行 systemctl is-enabled gpsd.socket
和 systemctl is-enabled gpsd.service
检查服务和套接字的状态。如果启用了 .socket
单元,这意味着 systemd
(init
进程)侦听端口,然后在请求传入该套接字时按需启动 gpsd
.如果同时启用 .socket
和 .service
单元,gpsd
会持续运行而不是按需运行。
在“工作”的 Pi 上,您应该通过停止手动运行的 gpsd
,然后运行 gpsd
来启用 systemctl enable --now gpsd.socket
套接字。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。