原文鏈接:?http://www.aosabook.org/en/gpsd.html
作者:Eric Raymond
譯者:Liuli Chen(陳旒俐)
GPSD是一系列管理GPS設(shè)備和其他用于導(dǎo)航與精確計(jì)時(shí)的傳感器的工具,包括航海自動(dòng)識(shí)別系統(tǒng)(marine AIS (Automatic Identification System))的無(wú)線電廣播設(shè)備和電子羅盤(pán)。其中最主要的程序是一個(gè)叫做gpsd
的服務(wù)守護(hù)進(jìn)程,它管理這這些傳感器,并且在TCP/IP端口生成JSON流報(bào)告。其他的程序包括用來(lái)展示代碼模型和各種診斷工具的客戶端。
GPSD被廣泛地部署在筆記本、智能手機(jī)以及包括自動(dòng)駕駛汽車和自動(dòng)潛艇在內(nèi)的自動(dòng)交通工具上。它在嵌入式系統(tǒng)中被用來(lái)導(dǎo)航、精確耕作、位置敏感的科學(xué)遙測(cè)、網(wǎng)絡(luò)時(shí)間服務(wù)等,起著不容忽視的作用。它甚至被用在裝甲車的敵友識(shí)別系統(tǒng)(Identification-Friend-or-Foe)中,例如M1“艾布拉姆斯(Abrams)”主戰(zhàn)坦克。
GPSD是一個(gè)中型項(xiàng)目,大約43千行代碼,主要用C和Python寫(xiě)成,最早的歷史可以追溯到1997年,現(xiàn)行版本從從2005年開(kāi)始寫(xiě)的。核心成員穩(wěn)定在3人,其他大約24人作出了半正規(guī)的貢獻(xiàn),另外還有上百人做了一次性的修補(bǔ)。
GPSD不管是在像splint
,valgrind
和Coverity這樣的審查工具還是在突發(fā)錯(cuò)誤記錄上向來(lái)有著極低的錯(cuò)誤率。這并不是一個(gè)巧合,這個(gè)項(xiàng)目做了大量的自動(dòng)測(cè)試,而這一切努力都很好地得到了回報(bào)。
由于排除了所有前任的不確定性,GPSD在它做的事情上相當(dāng)優(yōu)秀。2010年,GPSD在Allience for Code Excellence贏得了Good Code Grant的第一名。等你看完這一章你就會(huì)明白為什么。
7.1. GPSD存在的原因
GPSD存在的原因是那些GPS和其他導(dǎo)航傳感器上裝載的應(yīng)用層協(xié)議設(shè)計(jì)和文檔都很差,并且不同傳感器類型和模型之間存在這巨大的差異。你可以在[Ray]看到詳細(xì)的討論。尤其是,你會(huì)在哪里發(fā)現(xiàn)NMEA 0183(一類GPS報(bào)告包標(biāo)準(zhǔn))的怪誕和一堆文檔書(shū)寫(xiě)極差的供應(yīng)商協(xié)議。
如果應(yīng)用不得不自己處理所有的這些復(fù)雜性,必將導(dǎo)致大量脆弱冗余的代碼。由于底層硬件的逐漸改變,這將進(jìn)而造成高度的用戶可視化不足以及持續(xù)的問(wèn)題。
GPSD通過(guò)自己知道所有的協(xié)議(截至寫(xiě)這篇文章的時(shí)候我們支持大約20種不同的協(xié)議)、管理串行和USB接口、用一種簡(jiǎn)單的設(shè)備無(wú)關(guān)的JSON格式報(bào)告?zhèn)鞲衅饔行лd荷,來(lái)把位置感知的應(yīng)用和具體的硬件接口個(gè)離開(kāi)來(lái)。GPSD通過(guò)提供客戶端庫(kù)使得客戶端應(yīng)用不用知道報(bào)告格式,從而進(jìn)一步簡(jiǎn)化了生活。相反,得到傳感器信息成為了一個(gè)簡(jiǎn)單的進(jìn)程調(diào)用。
同時(shí),GPSD也支持精確計(jì)時(shí):只要它附屬的某個(gè)傳感器有PPS (pulse-per-second)能力,它就能作為一個(gè)網(wǎng)絡(luò)時(shí)間協(xié)議守護(hù)進(jìn)程ntpd
?(the Network Time Protocal Daemon)的時(shí)間源工作。GPSD的開(kāi)發(fā)者與ntpd
項(xiàng)目的開(kāi)發(fā)者緊密合作來(lái)改善網(wǎng)絡(luò)時(shí)間服務(wù)。
目前(2011年年中),我們正在完成對(duì)航海導(dǎo)航接收器的AIS網(wǎng)絡(luò)支持。將來(lái),一旦出現(xiàn)新的位置干吃傳感器的協(xié)議文檔和測(cè)試設(shè)備,我們期望可以支持它們,比如二代飛機(jī)異頻雷達(dá)接收器。
總的來(lái)說(shuō),GPSD設(shè)計(jì)中最終要的主題就是把所有設(shè)備相關(guān)隱藏在一個(gè)簡(jiǎn)單的與無(wú)需配置的服務(wù)器交互的客戶端接口之后。
7.2. 外部視圖
GPSD套件中最主要的程序是gpsd
服務(wù)守護(hù)進(jìn)程。它能夠通過(guò)RS232、USB、藍(lán)牙、TCP/IP和UDP連接從一系列附屬傳感器設(shè)備收集捕獲量。報(bào)告一般來(lái)說(shuō)會(huì)被傳送到TCP/IP端口2947,但也能通過(guò)一個(gè)共享內(nèi)存或者D-BUS接口出去。
GPSD分布裝載著C、C++和Python的客戶端庫(kù),包含了C、C++、Python和PHP的示例客戶端,Perl客戶端綁定可以通過(guò)CPAN實(shí)現(xiàn)。這些客戶端庫(kù)把應(yīng)用和JSON報(bào)告協(xié)議分離,不僅僅方便了應(yīng)用開(kāi)發(fā)者,也解決了GPSD開(kāi)發(fā)者們頭痛的問(wèn)題。因此,即使這個(gè)協(xié)議為新的傳感器類型產(chǎn)生了新的特性,其暴露給客戶端的API依然可以保持不變。
套件中的其他程序包括一個(gè)低層設(shè)備監(jiān)視器的公共程序(gpsd
),一個(gè)為錯(cuò)誤統(tǒng)計(jì)和設(shè)備超時(shí)產(chǎn)生報(bào)告的分析器(gpsprof
),一個(gè)調(diào)整設(shè)備設(shè)置的公共程序(gpsctl
),和一個(gè)把傳感器日志批量轉(zhuǎn)換成可讀的JSON的程序(gpsdecode
)。它們共同幫助那些技術(shù)用戶深入觀察附屬傳感器的運(yùn)作。
當(dāng)然了,這些工具也幫助GPSD自己的開(kāi)發(fā)者檢查gpsd
的正確運(yùn)作。其中最重要的測(cè)試工具就是gpsfake
,一個(gè)能夠連接任意數(shù)目的活動(dòng)傳感器日志的測(cè)試套件。通過(guò)gpsfake
,我們可以重復(fù)運(yùn)行有錯(cuò)誤報(bào)告的傳感器日志來(lái)重新產(chǎn)生特定的問(wèn)題。gpsfake
也是我們大量回歸測(cè)試套件的引擎,它通過(guò)簡(jiǎn)化發(fā)現(xiàn)破壞性變化的過(guò)程來(lái)減少修改軟件的開(kāi)銷。
我們從中學(xué)到的最重要的教訓(xùn)之一就是:對(duì)一個(gè)軟件套件來(lái)說(shuō),光有正確性是不夠,它還要能夠證明自己的正確性。我們發(fā)現(xiàn)適度追求這個(gè)目標(biāo)不僅不是過(guò)于敏感,而且還是一雙翅膀——我們花在寫(xiě)測(cè)試套件和回歸測(cè)試上的時(shí)間多次得到了回報(bào),因?yàn)檫@給了我們充分的自由,在修改代碼的時(shí)候不用擔(dān)心對(duì)現(xiàn)有函數(shù)造成大的破壞。
7.3. 軟件層次
GPSD內(nèi)部運(yùn)行是非常復(fù)雜的,而不僅僅是人們想像的那樣“加入一個(gè)傳感器使之工作”。gpsd
的內(nèi)部構(gòu)造分成四個(gè)部分:驅(qū)動(dòng)(drivers)、包嗅探器(packet sniffer)、核心庫(kù)(core library)和多路復(fù)用器(multiplexer)。我們將自底向上地介紹它們。
更多建議: