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

一、功能介绍

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结果以图形化显示

三、软件结构

GPSD架构介绍及交叉编译和使用_第1张图片

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

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

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

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

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

四、数据流视图

GPSD架构介绍及交叉编译和使用_第2张图片

 

一些特点:

  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:

GPSD架构介绍及交叉编译和使用_第3张图片

gpsmon:

GPSD架构介绍及交叉编译和使用_第4张图片

 

你可能感兴趣的:(IOT)