我希望论坛上有人愿意帮助我获得一些基于 USB 的 GPS,以便在 Ubuntu 20.04.2 LTS 上与 gpsd 配合使用。我和一位朋友在全新安装的 Ubuntu 上使用两种不同型号的 GPS 时遇到了同样的问题。将 GPS 设备插入我们的系统后,这些设备可用作 tty 设备,但 gpsd 的设备列表中没有它们,并且 cgps 显示超时消息。我们使用的是 gpsd 版本 3.20。
我们可以通过手动停止 gpsd 套接字并手动启动 gpsd 来使 gpsd 工作,命令如下:
sudo systemctl stop gpsd.socket
gpsd -N -D3 /dev/ttyUSB0 (on my friend’s system)
or
gpsd -N -D3 /dev/ttyACM0 (on my system)
我是一名退休的 IT 人员,在 Windows 方面经验丰富,在 Linux 方面经验不多。如果有人能告诉我下一步该怎么做,以找出 gpsd 无法自动运行的原因,我就会按照指示去做。
我在 gpsd 用户邮件列表上研究过这个问题,我看到一些帖子表明其他人在 Ubuntu 上也遇到过类似的问题。gpsd 邮件列表上的典型回复是他们认为问题出在 systemd 上,他们不去管这个问题。我希望这个论坛上的某个人能提供更多帮助,而不仅仅是说“研究 systemd 的工作原理并让它工作起来”。
更多细节:
我的 GPS 是 VK-162 G-Mouse USB GPS Dongle。其供应商 ID 是1546
,产品 ID 是01a7
。Ubuntu 将我的 GPS 映射为设备 ttyACM0。
我朋友的 NEO-7M-0-00 GPS 的供应商 ID 为10c4
,产品 ID 为ea60
。Ubuntu 将我朋友的 GPS 映射到 ttyUSB0。
根据lsusb
,Ubuntu 将我的 GPS 识别为 u-blox 7 设备:
Bus 002 Device 008: ID 1546:01a7 U-Blox AG [u-blox 7]
lsusb
表示 Ubuntu 将我朋友的 GPS 识别为 CP210x UART Bridge 设备:
Bus 002 Device 003: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
以下是 /lib/udev/rules.d/60-gpsd.rules 中两个 GPS 的 udev 规则:
u-blox AG, u-blox 7 [linux module: cdc_acm]
ATTRS{idVendor}=="1546", ATTRS{idProduct}=="01a7", SYMLINK+="gps%n", TAG+="systemd", ENV{SYSTEMD_WANTS}="gpsdctl@%k.service"
Cygnal Integrated Products, Inc. CP210x Composite Device (Used by Holux m241 and Wintec grays2 wbt-201) [linux module: cp210x]
ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="gps%n", TAG+="systemd", ENV{SYSTEMD_WANTS}="gpsdctl@%k.service"
在拔下 GPS 的情况下启动我的 Ubuntu 系统并运行 systemctl 会显示一个与 gpsd 相关的条目:
gpsd.socket loaded active listening GPS (Global Positioning System) Daemon Sockets
将 GPS 插入我的系统后,systemctl 发现这些与 gpsd 相关的进程:
[email protected] loaded active exited Manage ttyACM0 for GPS daemon
system-gpsdctl.slice loaded active active system gpsdctl.slice
gpsd.socket loaded active listening GPS (Global Positioning System) Daemon Sockets
我们可以通过停止 gpsd 套接字并使用以下命令手动启动 gpsd 来使 gpsd 工作:
sudo systemctl stop gpsd.socket
gpsd -N -D3 /dev/ttyUSB0 (on my friend’s system)
或者
gpsd -N -D3 /dev/ttyACM0 (on my system)
停止套接字并手动启动 gpsd 后,gpspipe -w 会显示 gpsd 设备列表中的设备。例如在我的系统上:
al@Al-HP-Linux:~$ gpspipe -w
{"class":"VERSION","release":"3.20","rev":"3.20","proto_major":3,"proto_minor":14}
{"class":"DEVICES","devices":[{"class":"DEVICE","path":"/dev/ttyACM0","activated":"2021-05-16T17:48:25.283Z","native":0,"bps":9600,"parity":"N","stopbits":1,"cycle":1.00}]}
{"class":"WATCH","enable":true,"json":true,"nmea":false,"raw":0,"scaled":false,"timing":false,"split24":false,"pps":false}
{"class":"DEVICE","path":"/dev/ttyACM0","driver":"NMEA0183","activated":"2021-05-16T17:48:26.082Z","native":0,"bps":9600,"parity":"N","stopbits":1,"cycle":1.00}
我的 linux 登录位于 dialout 和 tty 组中。
答案1
如果其他人的 GPS 也遇到同样的问题,我会发布解决方案,使我的 GPS 可以在我的 Ubuntu 系统和我朋友的 Ubuntu 系统上运行,而无需在重新启动 Ubuntu 后运行手动命令。
我可以在插入 GPS 的情况下重启系统,gpsd 就可以正常工作。我可以拔下我的 GPS 并插入另一个 GPS(反之亦然),系统会检测到变化,并且 gpsd 会使用新的 GPS。
修复方法是向 /etc/default/gpsd 配置文件添加一些条目。以下是我添加到 /etc/default/gpsd 的条目:
START_DAEMON="真"
USBAUTO="真"
如果您的 /etc/default/gpsd 文件包含如下所示的 DEVICES 行,则应将 DEVICES 行更改为空字符串。例如,如果您有类似以下内容:DEVICES="/dev/ttyUSB0" 将其更改为:DEVICES=""
请注意,您必须以 root 身份编辑 /etc/default/gpsd 文件,因此请使用 sudo 启动编辑器。不确定是否有必要,但在保存更改后,我重新启动了 Ubuntu 系统。
我希望这些信息能帮助其他 GPS 用户。