袁 思,劉曉東
(1武漢郵電科學研究院 湖北 武漢 430074;2.武漢虹旭信息技術有限責任公司 湖北 武漢 430074)
基于Android的GPS移植
袁 思1,2,劉曉東2
(1武漢郵電科學研究院 湖北 武漢 430074;2.武漢虹旭信息技術有限責任公司 湖北 武漢 430074)
基于Tiny4412開發板和SiRF StarIII GPS模塊實現了GPS的移植工作,由于開發板和GPS模塊的特性,其工作重點主要集中在GPS硬件抽象層的移植。并在搭建的測試環境下通過第三方GPS測試軟件對該GPS移植模塊進行了測試,證實了該GPS移植模塊能夠正常獲取經緯度信息。這對于理解和解決Android GPS開發的相關問題有重要的參考價值。
Android;硬件抽象層;GPS;GPS移植
隨著移動互聯網技術的發展,手機作為最主要的移動終端發揮著越來越大的作用。當前主要的智能手機操作系統有windows mobile、symbian、android和 ios[1],其中 Android憑借其通用、開源、免費的特點在短時間內成為市場占有率第一的手機操作系統。隨著物聯網技術的發展,手機GPS已在個人導航定位方面發揮了巨大作用,除此以外,它在工程測量、設施搜索、定位監控、緊急援助等方面也有很大的發展空間[2]。隨著Android系統在消費電子和工程領域的發展,GPS在Android中的應用也越來越廣泛,因此Android下GPS的開發也受到了關注。
基于此,本文在研究了GPS模塊中Framework層、HAL層和驅動層的工作過程和工作原理的基礎上,實現了在Tiny4412開發板和 SiRF StarIII GPS模塊下GPS的移植工作,由于Android系統對GPS模塊中的Framework層和HAL層進行了封裝,故基于Android的GPS移植主要的工作集中在GPS硬件抽象層的移植工作。其意義所在是,能夠幫助開發者更好的理解和盡快的解決Android GPS相關問題,提升開發速度。而且Android下各個模塊實現之中有相似之處,對GPS模塊的了解可以在對其他模塊的開發過程起參考作用。
Android作為移動設備的軟件平臺,與其他操作系統一樣也使用分層的方式,其軟件層次結構為操作系統、中間件和應用程序。與Android系統相同,GPS模塊構架也是分層模式,從下往上劃分為:驅動層、中間層和應用層。其中最底層為GPS設備驅動層,GPS中間層為GPS硬件抽象層,GPS應用層包括GPS應用程序層和GPS應用框架層。GPS應用層通過JNI調用GPS中間層[3]。
1.1 GPS驅動層
GPS驅動層位于硬件設備之上,本質上就是一組對硬件進行操作的API接口,是對硬件功能的抽象,通過提供API為操作系統服務。驅動層的主要功能包括:相關硬件的初始化、數據的輸入輸出操作、硬件設備的配置操作功能。GPS作為一個外部設備,GPS接收衛星信號進行分析,輸出NMEA數據到CPU中進行處理,CPU驅動層主要完成的任務包括GPS硬件的初始化、GPS中數據的處理和CPU之間的通信。GPS驅動層主要實現GPS等的硬件驅動,大部分GPS通過串口或USB接口連接,因此一般無須特別的驅動。
1.2 GPS中間層
GPS中間層位于Linux內核層與GPS應用層中間,是Android操作系統的系統庫部分。GPS中間層包括GPS硬件抽象層(HAL)和GPS定位JNI層。
GPS硬件抽象層實現GPS數據 (NEMA數據)到Android支持的GPS數據結構的轉換。同時實現所有的控制命令到驅動層的封裝。因此,該層也是移植的主要部分。接口主要定義在:
hardware/libhardware_legacy/include/hardware_legacy/gps.h
hardware/libhardware_legacy/include/hardware_legacy gps_ni.h
Android中提供了一個 GPS實現部分,在 hardware/ libhardware_legacy/gps目錄中。
GPS定位JNI層主要完成對硬件抽象層的封裝和調用,承上啟下。GPS的JNI代碼路徑為:
Frameworks/base/core/jni/android_location_GpsLocationProvider. cpp
這里提供了 對 com.android.internal.location包中的GpsLocationProvider類的支持。
1.3 GPS應用層
GPS應用層位于中間層之上,它是用Java語言編寫的。主要包括GPS應用程序和GPS應用框架層。其中,GPS應用程序是用Java語言編寫的,主要提供用戶與設備的交互接口。GPS應用程序調用GPS應用框架層提供的API。GPS應用框架層,即GPS Application Framework,主要為上層GPS應用層提供所需要的各種服務。
基于Android的GPS定位系統移植的主要內容在JNI層以下,硬件抽象層是移植部分的工作重點所在。
2.1 開發設備及環境介紹
本文中使用的Tiny4412開發板是高性能的Cortex-A9核心板,采用三星高性能的Exynos 4412四核處理器,配備1G單通道DDR3內存和4G高速eMMC閃存。Exynos 4412內部集成了CPU為Mali-400 MP的高性能圖形引擎,可流暢運行Android等高級操作系統。
在GPS模塊方面,本文中采用的是SiRF StarIII GPS模塊,是美國塞浮公司開發的GPS第三代芯片,對比之前的產品,其靈敏度有較大的提升。
本文中開發使用到的軟件環境,在Linux環境中,開發Android主機環境包括以下需求:git工具、repo工具,Java的JDK,主機編譯工具。
2.2 GPS硬件抽象層實現
GPS硬件抽象層頭文件路徑如下所示:
hardware/libhardware_legacy/include/hardware_legacy/gps.h
本論文中,GPS部分采用Android硬件抽象層接口方式中得直接接口方式,使用的是非標準的接口,GPS部分是hardware_legacy的一部分。GPS硬件抽象層的主要入口如下表所示。
gps.h中定義了GPS的關鍵接口GpsInterface,它是標準的GPS接口,該接口定義了HAL層的所有操作,其內容如下所示:

表1 GPS硬件抽象層主要入口Tab.1 Function entrance of GPS HAL layer

GpsCallbacks定義GPS回調函數指針組,它是GPS的硬件抽象層調用者獲取信息的手段,通常在讀取到底層數據,并分析完成時調用,上報信息給上層。其定義如下所示:

GpsCallbacks由通過調用初始化函數 (GpsInterface中的init) 注冊到硬件適配層, 供適配層在適當時回調。GpsCallbacks中的
GPS硬件抽象層將底層硬件的主要功能抽象出來,表現為幾個函數的形式,主要包括對硬件的控制接口和對數據處理接口。此部分是移植GPS功能實現的關鍵,需要根據自己的硬件工作方式實現這些函數。GPS硬件抽象層所實現的對硬件的控制接口如表2所列,這些接口供GPS JNI層調用。
對于GPS,首先需要初始化,然后對于GPS數據,建立一套“獲取——解析——上報”的機制。
GPS JNI層通過gps_get_gps_interface函數獲取GPS硬件抽象層接口,其返回的是GpsInterface結構體類型的指針,由于NMEA數據的解析等是比較統一的,在編寫特定GPS適配層時,可以以gps_menu.c中絕大部分的處理流程作為基礎進行改寫。gps_menu實現分成幾個部分:接口實現、GPS相關控制,以及NMEA解析部分。其中接口實現封裝GPS相關控制,調用對應的控制邏輯。而NMEA解析部分比較獨立,提供解析功能接口,以及回調接口[4]。

表2 GPS硬件抽象層函數接口表Tab.2 Function and interface of GPS HAL layer
gps_menu.c實現了gps_get_qemu_interface接口,返回作為核心結構的GpsInterface,本文中對qemuGpsInterface結構體定義如下所示:

JNI層通過這個結構體獲取GPS硬件抽象層接口。首先在GpsInterface.init的實現中,完成對GPS的初始化。Init會在GPS被打開的時候調用。該步驟需要完成GPS內核模塊的加載工作,部分GPS還需要進行firmware下載工作。之后打開GPS端口,確認GPS應將已經正常工作。
當JNI試圖啟動GPS時會調用qemu_gps_init方法,其中完成的操作包括注冊相應上層回調函數、打開socket并創建GPS數據獲取及解析線程。這兩個操作被組織到初始化函數gps_state_init中。
GPS初始化完成之后,一般都會新開一個polling線程,對GPS端口進行輪詢,獲取輸出的NEMA數據。GpsInterface. start以及stop主要控制該線程的啟停。
解析的工作是在獲取數據后進行,這里的目的是將NEMA數據解析成Android框架可以識別的結構信息,存放到GpsLocation以及GpsSvInfo等,以便上報。對于NEMA數據的解析,已經有非常多的參考實現。Android在gps_qemu.c中也給出了大部分參考實現。可以照搬這部分的內容。
上報過程,在解析完成后進行,直接調用init時注冊的callback函數,并填入獲取到的數據結構即可[4-5]。
本論文中硬件抽象層的實現流程圖如圖1所示。

圖1 硬件抽象層程序流程圖Fig.1 Flow chart of the GPS HAL layer
其中初始化函數gps_state_init中代碼片段如下所示:

其中gps_state_thread是核心數據處理線程。它完成的處理流程為:獲取—解析—上報。獲取部分,gps_state_thread通過epoll_wait從“gps”socket判斷是否有數據到達。隨后通過read函數直接讀取。 并將讀取到的數據送到nmea_reader_addc進行解析,其相關代碼片段如下所示:

解析數據的流程中,本文中gps_qemu實現了一套基于TOKEN的簡單解析方法,并完成GpsLocation等結構的填寫。主函數是nmea_reader_parse,主函數通過nmea_tokenizer_get獲取每個域的數據(NMEA有非常明確的域分隔符[6]),并根據格式定義轉化成對應的格式,再通過nmea_reader_update系列函數更新對應的域,比如時間、經緯度等。
3.1 實驗測試環境介紹
本文中開發用到的Tiny4412開發板上電開機后,連接SiRF StarIII GPS模塊,將SiRF StarIII GPS模塊放在信號較好的地方,利用第三方GPS APK測試軟件對GPS移植模塊進行測試。
3.2 測試結果及分析
通過第三方GPS測試軟件測試結果如圖2所示。

圖2 GPS第三方測試軟件測試結果Fig.2 Test result of the third-party test software
該測試結果顯示,該GPS移植模塊能夠正確的獲取經緯度信息。
Android系統在消費電子和工程領域的發展,使得GPS在Android中的應用也越來越廣泛,Android下GPS的開發備受關注。本文在特定開發板下的基于Android的GPS移植工作,對于開發者更好的理解Android GPS相關問題有重要的參考意義,當然,本文中移植的GPS模塊仍然有許多可以改善和優化的地方。
[1]John Whipple,William Arensman,Marian Starr Boler,et al. A Public Safety Application of GPS-Enabled Smartphones and the Android Operating System[C]//2009 IEEE International Conference on Systems,Man and Cybernetics(SMC 2009).2009:2059-2061.
[2]周峰.基于Android智能手機平臺的GPS開發[J].大眾科技,2012(9):31-32. ZHOU Feng.GPS development based on android smart phone Platform[J].The magazine of popular science,2012(9): 31-32.
[3]李鑫澤.基于Android的GPS模塊設計與實現[D].鄭州:鄭州大學,2013.
[4]韓超,梁泉.Android系統級深入開發——移植與調試[M].北京:電子工業出版社,2011.
[5]曾薪夷.基于Android平臺的GPS導航系統的設計與實現[J].計算機與現代化,2012(9):225-228. ZENG Xin-yi.Design and implementation of GPS navigation system based on android platform[J].Computer and Modernization,2012(9):225-228.
[6]劉大杰.全球定位系統(GPS)的原理與數據處理[M].上海:同濟大學出版社,2001.
The transplantation of GPS module based on Android
YUAN Si1,2,LIU Xiao-dong2
(1.Wuhan Research Institute of Posts and Telecommunications,Wuhan 430074,China;2.Wuhan Hongxu Information Technology Co.,Ltd.,Wuhan 430074,China)
This paper developed and ported an Android GPS module based on the Tiny4412 board and SiRF StarIII GPS module.The main task is on the GPS HAL layer.This paper also used the GPS application to test GPS function.The result turns out the right of the Android GPS module.This is of great significance to understand and solve Android GPS related issues.
Android;HAL layer;GPS;transplantation of GPS
TN96
A
1674-6236(2015)07-0086-04
2014-07-27 稿件編號:201407212
袁 思(1991—),女,湖北仙桃人,碩士研究生。研究方向:數據還原技術。