一、功能介绍
GPSD是一系列管理GPS设备和其他用于导航与精确计时的传感器的工具,包括航海自动识别系统(marine AIS (Automatic Identification System))的无线电广播设备和电子罗盘。其中最主要的程序是一个叫做gpsd的服务守护进程,它管理这这些传感器,并且在TCP/IP端口生成JSON流报告。其他的程序包括用来展示代码模型和各种诊断工具的客户端。
特点:
-
自动探测并识别GPS协议,同时支持多个GPS设备,并且可以动态进行设备控制
-
支持PPS并且与NTPD结合,实现时间服务
-
统一生成JSON流报告给上层客户端
-
支持DBUS,共享内存以及本地SOCKET等方式与客户端通讯,最大支持64个
-
提供丰富的组件及工具用来调试及测试
二、组件介绍
-
Gpsprof: 一个为错误统计和设备超时产生报告的分析器
-
Gpsctl: 一个调整设备设置的公共程序
-
Gpsdecode: 一个把传感器日志批量转换成可读的JSON的程序
-
gpsfake:一个能够连接任意数目的活动传感器日志的测试套件,可以重复运行有错误报告的传感器日志来重新产生特定的问题
-
cgps: GPS结果以图形化显示
-
gpsmon:GPS结果以图形化显示
三、软件结构

-
gpsd的内部构造分成四个部分:驱动(drivers)、包嗅探器(packet sniffer)、核心库(core library)和多路复用器(multiplexer)
-
驱动:把数据包解析成时间-位置-速度或者状态信息、更改其模式或者波特率、探测设备亚型等的方法。辅助方法能够支持驱动程序的控制操作,比如改变设备的串行速度
-
数据包嗅探器: 负责从串行输入数据流挖掘数据包
-
核心库: 管理一个与传感器设备的会话,它负责根据嗅探器返回的包类型把每一个GPS连接切换到正确的设备驱动上
-
多路复用器: 用来处理客户端会话和设备分配,负责把报告传递给客户端、接收客户端命令、响应热插拔通知
四、数据流视图

一些特点:
-
核心程序及库,不使用malloc
-
Json解析不使用malloc,不支持null对象以及数组必须定长
五、性能测试
cpu: imx8
gps: ublox F9P
系统:Linux
Ublox支持GPS+BD+Galileo+GLONASS,最高460800波特率,支持10HZ,8HZ选择
| 协议格式 | 波特率 | 频率 | 一次输出包条数 | GPSD处理时间(从串口接收到JSON输出) |
| NMEA0183 | 230400 | 10HZ | 27,耗时50ms | 50ms |
| Ublox 二进制协议 | 230400 | 10HZ | 2(间隔10ms) | 1ms |
六、总结
-
GPSD处理协议以及转换为json到输出,耗时1ms左右
-
使用NMEA0183,主要耗时在 一次结果输出的27条数据总接收时间
-
使用ublox私有协议,每次只有2条数据,其间隔10ms,性能很高
七、GPSD配置
gpsd默认使用scons编译,主要配置文件为Sconstruct
选项配置集中在boolopts,包括驱动列表,时间服务,外部库依赖,通讯方式等等
boolopts = (# GPS protocols("ashtech", False, "Ashtech support"),("earthmate", False, "DeLorme EarthMate Zodiac support"),("evermore", False, "EverMore binary support"),("fury", False, "Jackson Labs Fury and Firefly support"),("fv18", False, "San Jose Navigation FV-18 support"),("garmin", False, "Garmin kernel driver support"),("garmintxt", False, "Garmin Simple Text support"),("geostar", False, "Geostar Protocol support"),("greis", False, "Javad GREIS support"),("itrax", False, "iTrax hardware support"),("mtk3301", False, "MTK-3301 support"),("navcom", False, "Navcom NCT support"),("nmea0183", True, "NMEA0183 support"),
....# Time service("ntpshm", True, "NTP time hinting via shared memory"),("ntp", True, "NTP time hinting support"),("oscillator", True, "Disciplined oscillator support"),("pps", True, "PPS time syncing support"),# Export methods("dbus_export", False, "enable DBUS export support"),("shm_export", True, "export via shared memory"),("socket_export", True, "data export over sockets"),}
串口配置,连接客户端个数,python环境 和 交叉编译相关:
其中sysroot,target指定为交叉编译路径和名称
nonboolopts = (("fixed_port_speed", '230400', "fixed serial port speed"),("fixed_stop_bits", '1', "fixed serial port stop bits"),("gpsd_group", def_group, "privilege revocation group"),("gpsd_user", "nobody", "privilege revocation user",),("max_clients", '64', "maximum allowed clients"),("max_devices", '4', "maximum allowed devices"),("prefix", "/media/gwind/gcode/opensource/gpsd-3.19/out", "installation directory prefix"),("python_coverage", "coverage run", "coverage command for Python progs"),("python_libdir", "", "Python module directory prefix"),("qt_versioned", "", "version for versioned Qt"),("sysroot", "/opt/fsl-imx-wayland/4.14-sumo/sysroots/aarch64-poky-linux","cross-development system root"),("target", "aarch64-poky-linux", "cross-development target"),("target_python", "python", "target Python version as command"),
)
关于库,主要有两个:
libgpsd.a,主要是gpsd服务,gpsctl,gpsmon工具使用,包含功能更强大,可直接调用更底层功能
libgps.so, 对外提供的接口,通过unix sock,共享内存以及dbus等方式,主要有相关工具集使用,比如cgps,gpspipe等
八、使用
gpsd 运行, -N 前台运行,-D 指定log等级,-n 不等待客户端连接
服务运行之后,客户端可直接使用,默认都是链接的静态库,没有环境依赖
如cgps:

gpsmon:
