如何将脚本输出的NMEA数据接入GPSD实现虚拟GPS源
解决方案:将实时NMEA输出直接传入gpsd
你想要实现的是把samples_generate的实时NMEA输出作为gpsd的数据源,替代gpsfake的功能,不用依赖日志文件。之前的两种方案报错主要是参数使用不当,下面给你几个可行的修复方案和更简便的管道方式:
方案1:修复FIFO文件方式
之前的FIFO方案问题在于gpsd默认会等待设备有数据流入才完成初始化,而FIFO是阻塞式的,导致gpsd一直处于等待状态。只需给gpsd加上-n参数,让它立即打开设备并开始监听:
# 1. 创建FIFO文件 mkfifo /tmp/gpsd_nmea_fifo # 2. 启动gpsd,指定FIFO并强制立即初始化 gpsd -n /tmp/gpsd_nmea_fifo & # 3. 运行你的NMEA生成程序,输出到FIFO ./samples_generate > /tmp/gpsd_nmea_fifo
注意:必须先启动gpsd(打开FIFO的读端),再运行
samples_generate(写端),否则samples_generate会因为FIFO没有读端而阻塞。
方案2:修复TCP套接字方式
之前的nc参数错误,-p是用来指定本地源端口的,而我们需要连接到gpsd监听的端口。正确的步骤如下:
# 1. 启动gpsd监听本地8888端口(-N让它前台运行,方便调试) gpsd -N tcp://localhost:8888 # 2. 在另一个终端,用nc把生成的NMEA数据发送到gpsd的监听端口 ./samples_generate | nc localhost 8888
如果需要让gpsd后台运行,把-N去掉,换成&即可:
gpsd tcp://localhost:8888 & ./samples_generate | nc localhost 8888
方案3:直接使用管道(最简单)
不需要额外的FIFO或TCP,直接用管道将samples_generate的标准输出传给gpsd,指定/dev/stdin作为gpsd的输入设备,同时加-n参数强制立即处理:
./samples_generate | gpsd -n /dev/stdin
这个方式最简洁,完全符合你“用脚本标准输出作为数据源”的需求,和gpsfake的实时模拟效果一致。
验证是否成功
无论用哪种方案,都可以用cgps或gpsmon工具来验证gpsd是否接收到了NMEA数据:
cgps localhost
如果能看到你生成的纬度、经度和时间信息,就说明配置成功了。
内容的提问来源于stack exchange,提问作者Juha
相关产品推荐
相关产品推荐

