卷2:第7章 GPSD

2018-02-24 15:55 更新

原文鏈接:?http://www.aosabook.org/en/gpsd.html

作者:Eric Raymond
譯者:Liuli Chen(陳旒俐)

GPSD是一系列管理GPS設(shè)備和其他用于導(dǎo)航與精確計時的傳感器的工具,包括航海自動識別系統(tǒng)(marine AIS (Automatic Identification System))的無線電廣播設(shè)備和電子羅盤。其中最主要的程序是一個叫做gpsd的服務(wù)守護(hù)進(jìn)程,它管理這這些傳感器,并且在TCP/IP端口生成JSON流報告。其他的程序包括用來展示代碼模型和各種診斷工具的客戶端。

GPSD被廣泛地部署在筆記本、智能手機(jī)以及包括自動駕駛汽車和自動潛艇在內(nèi)的自動交通工具上。它在嵌入式系統(tǒng)中被用來導(dǎo)航、精確耕作、位置敏感的科學(xué)遙測、網(wǎng)絡(luò)時間服務(wù)等,起著不容忽視的作用。它甚至被用在裝甲車的敵友識別系統(tǒng)(Identification-Friend-or-Foe)中,例如M1“艾布拉姆斯(Abrams)”主戰(zhàn)坦克。

GPSD是一個中型項(xiàng)目,大約43千行代碼,主要用C和Python寫成,最早的歷史可以追溯到1997年,現(xiàn)行版本從從2005年開始寫的。核心成員穩(wěn)定在3人,其他大約24人作出了半正規(guī)的貢獻(xiàn),另外還有上百人做了一次性的修補(bǔ)。

GPSD不管是在像splint,valgrind和Coverity這樣的審查工具還是在突發(fā)錯誤記錄上向來有著極低的錯誤率。這并不是一個巧合,這個項(xiàng)目做了大量的自動測試,而這一切努力都很好地得到了回報。

由于排除了所有前任的不確定性,GPSD在它做的事情上相當(dāng)優(yōu)秀。2010年,GPSD在Allience for Code Excellence贏得了Good Code Grant的第一名。等你看完這一章你就會明白為什么。

7.1. GPSD存在的原因

GPSD存在的原因是那些GPS和其他導(dǎo)航傳感器上裝載的應(yīng)用層協(xié)議設(shè)計和文檔都很差,并且不同傳感器類型和模型之間存在這巨大的差異。你可以在[Ray]看到詳細(xì)的討論。尤其是,你會在哪里發(fā)現(xiàn)NMEA 0183(一類GPS報告包標(biāo)準(zhǔn))的怪誕和一堆文檔書寫極差的供應(yīng)商協(xié)議。

如果應(yīng)用不得不自己處理所有的這些復(fù)雜性,必將導(dǎo)致大量脆弱冗余的代碼。由于底層硬件的逐漸改變,這將進(jìn)而造成高度的用戶可視化不足以及持續(xù)的問題。

GPSD通過自己知道所有的協(xié)議(截至寫這篇文章的時候我們支持大約20種不同的協(xié)議)、管理串行和USB接口、用一種簡單的設(shè)備無關(guān)的JSON格式報告?zhèn)鞲衅饔行лd荷,來把位置感知的應(yīng)用和具體的硬件接口個離開來。GPSD通過提供客戶端庫使得客戶端應(yīng)用不用知道報告格式,從而進(jìn)一步簡化了生活。相反,得到傳感器信息成為了一個簡單的進(jìn)程調(diào)用。

同時,GPSD也支持精確計時:只要它附屬的某個傳感器有PPS (pulse-per-second)能力,它就能作為一個網(wǎng)絡(luò)時間協(xié)議守護(hù)進(jìn)程ntpd?(the Network Time Protocal Daemon)的時間源工作。GPSD的開發(fā)者與ntpd項(xiàng)目的開發(fā)者緊密合作來改善網(wǎng)絡(luò)時間服務(wù)。

目前(2011年年中),我們正在完成對航海導(dǎo)航接收器的AIS網(wǎng)絡(luò)支持。將來,一旦出現(xiàn)新的位置干吃傳感器的協(xié)議文檔和測試設(shè)備,我們期望可以支持它們,比如二代飛機(jī)異頻雷達(dá)接收器。

總的來說,GPSD設(shè)計中最終要的主題就是把所有設(shè)備相關(guān)隱藏在一個簡單的與無需配置的服務(wù)器交互的客戶端接口之后。

7.2. 外部視圖

GPSD套件中最主要的程序是gpsd服務(wù)守護(hù)進(jìn)程。它能夠通過RS232、USB、藍(lán)牙、TCP/IP和UDP連接從一系列附屬傳感器設(shè)備收集捕獲量。報告一般來說會被傳送到TCP/IP端口2947,但也能通過一個共享內(nèi)存或者D-BUS接口出去。

GPSD分布裝載著C、C++和Python的客戶端庫,包含了C、C++、Python和PHP的示例客戶端,Perl客戶端綁定可以通過CPAN實(shí)現(xiàn)。這些客戶端庫把應(yīng)用和JSON報告協(xié)議分離,不僅僅方便了應(yīng)用開發(fā)者,也解決了GPSD開發(fā)者們頭痛的問題。因此,即使這個協(xié)議為新的傳感器類型產(chǎn)生了新的特性,其暴露給客戶端的API依然可以保持不變。

套件中的其他程序包括一個低層設(shè)備監(jiān)視器的公共程序(gpsd),一個為錯誤統(tǒng)計和設(shè)備超時產(chǎn)生報告的分析器(gpsprof),一個調(diào)整設(shè)備設(shè)置的公共程序(gpsctl),和一個把傳感器日志批量轉(zhuǎn)換成可讀的JSON的程序(gpsdecode)。它們共同幫助那些技術(shù)用戶深入觀察附屬傳感器的運(yùn)作。

當(dāng)然了,這些工具也幫助GPSD自己的開發(fā)者檢查gpsd的正確運(yùn)作。其中最重要的測試工具就是gpsfake,一個能夠連接任意數(shù)目的活動傳感器日志的測試套件。通過gpsfake,我們可以重復(fù)運(yùn)行有錯誤報告的傳感器日志來重新產(chǎn)生特定的問題。gpsfake也是我們大量回歸測試套件的引擎,它通過簡化發(fā)現(xiàn)破壞性變化的過程來減少修改軟件的開銷。

我們從中學(xué)到的最重要的教訓(xùn)之一就是:對一個軟件套件來說,光有正確性是不夠,它還要能夠證明自己的正確性。我們發(fā)現(xiàn)適度追求這個目標(biāo)不僅不是過于敏感,而且還是一雙翅膀——我們花在寫測試套件和回歸測試上的時間多次得到了回報,因?yàn)檫@給了我們充分的自由,在修改代碼的時候不用擔(dān)心對現(xiàn)有函數(shù)造成大的破壞。

7.3. 軟件層次

GPSD內(nèi)部運(yùn)行是非常復(fù)雜的,而不僅僅是人們想像的那樣“加入一個傳感器使之工作”。gpsd的內(nèi)部構(gòu)造分成四個部分:驅(qū)動(drivers)、包嗅探器(packet sniffer)、核心庫(core library)和多路復(fù)用器(multiplexer)。我們將自底向上地介紹它們。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號