微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

1/init

如何解决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 硬件专家,不是软件专家,但这听起来像是操作系统正在控制端口。

我比较了两个 pi 之间的以下文件,发现它们是相同的:

/lib/systemd/system/gpsd.socket
/lib/systemd/system/gpsd.service
/etc/default/gpsd

过去 2 周我一直在梳理这个网站和其他网站,并尝试了那里提供的解决方案(无济于事)。看来这并不是一个不常见的问题。我欢迎任何帮助,但我的 3 个主要问题是:

  1. 为什么 init 在 WORKING PI 中启动时不捕获端口 2947,而非工作 pi 确实捕获它,即使两个 pi 都运行 Jessie 4.1(尽管我承认不同的版本)。很明显,非工作 pi 无法挂载 gpsd 套接字的原因是它想要的端口已经被占用。
  2. 有没有办法告诉非工作 pi 不要捕获端口 2947,或者有没有办法让 init 从命令行放弃该端口?
  3. 是否有可能,非工作 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.socketsystemctl is-enabled gpsd.service 检查服务和套接字的状态。如果启用了 .socket 单元,这意味着 systemdinit 进程)侦听端口,然后在请求传入该套接字时按需启动 gpsd .如果同时启用 .socket.service 单元,gpsd 会持续运行而不是按需运行。

在“工作”的 Pi 上,您应该通过停止手动运行的 gpsd,然后运行 ​​gpsd 来启用 systemctl enable --now gpsd.socket 套接字。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。