我正在尝试通过 GPSD 让 BU-353 GPS 设备在 Ubuntu 16.04 LTS 上运行。运行时cgps
出现超时错误。
我以为 GPS 出了问题,因为我已经有一段时间没用过了,所以我跑了gpsmon
。GPS 已在多个盐度点上获得定位,并获取了我的纬度和经度。
这让我相信 GPSD 方面一定出了问题,所以我运行了命令gpsd -N -D3 -F /dev/ttyUSB0
。我得到了:
gpsd:ERROR: can't bind to local socket /dev/ttyUSB0
gpsd:ERROR: control socket create failed, netlib error -1
即使我使用 GPSD 指向套接字gpsd -N -D3 -F /var/run/gpsd.sock /dev/ttyUSB0
,(代码直接从GPSD 故障排除页面)我仍然收到同样的错误。
我不知道出了什么问题。我对 GPSD 还很陌生,对 Ubuntu 也不是很熟悉,所以也许我犯了一个简单的错误。任何帮助都非常感谢。
答案1
BU-353 应该可以与 gpsd 配合使用。但你有一些事情要做,
- 第一项是systemd负责启动 gpsd 实例。除非将其关闭(
sudo service gpsd stop
),否则您将无所事事。 -F
为设备添加和删除命令创建控制套接字。它必须是本地文件系统上的有效路径名。您的控制套接字可能不是您尝试读取的 USB GPS。通常控制套接字是,/var/run/gpsd.sock
但可能是/tmp/anything
- 您需要具有写入权限才能打开控制套接字。可以
sudo gpsd -N -D3 -F /var/run/gpsd.sock
工作,而gpsd -N -D3 -F /var/run/gpsd.sock
会失败,因为非特权用户无法写入控制套接字。 同样,gpsd -N -D3 -F /tmp/when_pigs_fly
应该可以工作。 (但是,如果 gpsd 已在运行,则所有操作均无法工作。)
此外,您还必须考虑其他说明,/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/ttyACM0"
# Other options you want to pass to gpsd
GPSD_OPTIONS=""
这些是/lib/systemd/system/gpsd.service
作为EnvironmentFile
第一行是无用的。 systemd
负责并且不分叉进程。 它使用标志运行-N
。
我设置 USBAUTO="true" 是因为 gpsd 的使用udev
和热插拔相当透明。插入 gps 的东西就可以工作。如果不是 gps,它就不管事了。
但我确实在当前正在使用的 gps 的位置中编写了代码。因为,在没有重新启动的情况下停止/重新启动 gpsd,/dev/ttyACM0
如果没有热插拔事件,gpsd 将无法“知道”gps 的位置(或位置)。我编写了位置代码,这样每次重新启动 gpsd 时就不必拔下/插入 gps,而无需重新启动。
其他GPSD_OPTIONS=
可以包括-n
-G
或-b
由您自行决定。
此外,还有其他测试客户端(xgps
)可以更强大地检查 GPS 输出,但这应该可以为您指明正确的方向。
答案2
它的权限 - 在仅使用 sudo/root 权限添加/运行命令的树莓派上出现同样的错误。
sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock