GPSD架构介绍及交叉编译和使用

一、功能介绍 GPSD是一系列管理GPS设备和其他用于导航与精确计时的传感器的工具,包括航海自动识别系统(marine AIS (Automatic Iden

一、功能介绍

GPSD是一系列管理GPS设备和其他用于导航与精确计时的传感器的工具,包括航海自动识别系统(marine AIS (Automatic Identification System))的无线电广播设备和电子罗盘。其中最主要的程序是一个叫做gpsd的服务守护进程,它管理这这些传感器,并且在TCP/IP端口生成JSON流报告。其他的程序包括用来展示代码模型和各种诊断工具的客户端。

特点:

  1. 自动探测并识别GPS协议,同时支持多个GPS设备,并且可以动态进行设备控制

  2. 支持PPS并且与NTPD结合,实现时间服务

  3. 统一生成JSON流报告给上层客户端

  4. 支持DBUS,共享内存以及本地SOCKET等方式与客户端通讯,最大支持64个

  5. 提供丰富的组件及工具用来调试及测试

二、组件介绍

  1. Gpsprof: 一个为错误统计和设备超时产生报告的分析器

  2. Gpsctl: 一个调整设备设置的公共程序

  3. Gpsdecode: 一个把传感器日志批量转换成可读的JSON的程序

  4. gpsfake:一个能够连接任意数目的活动传感器日志的测试套件,可以重复运行有错误报告的传感器日志来重新产生特定的问题

  5. cgps: GPS结果以图形化显示

  6. gpsmon:GPS结果以图形化显示

三、软件结构

  1. gpsd的内部构造分成四个部分:驱动(drivers)、包嗅探器(packet sniffer)、核心库(core library)和多路复用器(multiplexer)

  2. 驱动:把数据包解析成时间-位置-速度或者状态信息、更改其模式或者波特率、探测设备亚型等的方法。辅助方法能够支持驱动程序的控制操作,比如改变设备的串行速度

  3. 数据包嗅探器: 负责从串行输入数据流挖掘数据包

  4. 核心库: 管理一个与传感器设备的会话,它负责根据嗅探器返回的包类型把每一个GPS连接切换到正确的设备驱动上

  5. 多路复用器: 用来处理客户端会话和设备分配,负责把报告传递给客户端、接收客户端命令、响应热插拔通知

四、数据流视图

 

一些特点:

  1. 核心程序及库,不使用malloc

  2. 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

六、总结

  1. GPSD处理协议以及转换为json到输出,耗时1ms左右

  2. 使用NMEA0183,主要耗时在 一次结果输出的27条数据总接收时间

  3. 使用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: