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結果以圖形化顯示

三、軟件結構

  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:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章