安卓GPS定位系統(tǒng)驅動分析與總結_第1頁
安卓GPS定位系統(tǒng)驅動分析與總結_第2頁
安卓GPS定位系統(tǒng)驅動分析與總結_第3頁
安卓GPS定位系統(tǒng)驅動分析與總結_第4頁
安卓GPS定位系統(tǒng)驅動分析與總結_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

安卓GPS定位系統(tǒng)驅動分析與總結1.GPS簡介與衛(wèi)星信號使用安卓定位的各種方法如下所述:1)GPS定位GPS是全球定位系統(tǒng)導航系統(tǒng)時間和定位全球定位系統(tǒng),導航/gps。全球定位系統(tǒng)能夠在全球范圍內實時定位,定位精度高,并且實現連續(xù)覆蓋。其應用及其廣泛。2)WIFI定位無線AP位置是不變的前提下,設備利用WIFI,自動收集四周的AP信號,設備將采集到的AP信號發(fā)送給位置服務器,位置服務器根據AP信號中的MAC地址以及信號強弱計算出設備的位置,返回給設備。3)基站定位設備向基站發(fā)送定位請求,基站通過設備與基站之間的通信時差來計算設備的大致位置。4)AGPS定位GPS系統(tǒng)和輔助系統(tǒng)配合在一起的定位技術稱為AGPS。相較于GPS,AGPS有更大的優(yōu)勢。GPS的冷啟動幾分鐘即可完成,其原因是需要在空中搜索衛(wèi)星。而AGPS的啟動速度大大快于GPS。由于有輔助系統(tǒng)的存在,AGPS的定位精度也更高。安卓設備從收到衛(wèi)星信號到在應用層顯示位置的過程是:1)硬件處理:安卓設備的天線收到來自數顆GPS定位衛(wèi)星的信號(包括載波L1和L2波段,偽隨機碼的C/A碼和P碼,導航電文D碼等)。在安卓硬件的射頻部分,首先通過低噪聲放大器來放大信號,接著對信號進行濾波與混頻處理,再通過下變頻,得到中頻模擬信號;再將模擬信號通過AD采集,轉換為數字信號,交由安卓硬件的基帶部分處理。基帶部分通過擒獲,得到精度在250Hz以內的的中頻和碼相位,通過精捕獲將精度提高到2.5Hz,再跟蹤得到導航電文。導航電文經過導航計算,再轉換為GPS標準數據格式,才交由軟件處理。2)軟件處理:從底層到頂層,依次是LinuxUART驅動,安卓HAL層,安卓JIN層,安卓framework層,應用層。分層介紹見下。2.GPS標準數據格式GPS的模塊輸出信息包括了4個部分,是一些定位及衛(wèi)星信息。其中最重要的,就是推薦最小定位信息GPRMC。下表是最小定位信息的格式:標識123456789101112例子012724.000A2234.3157N11408.0921E0.00290108A*71<1>UTC時間,hhmmss(時分秒)格式<2>定位狀態(tài),A=有效定位,V=無效定位<3>緯度ddmm.mmmm,典型的度分格式,若前面有0,也會傳輸<4>緯度半球N(北半球)或S(南半球)<5>經度dddmm.mmmm,典型的度分格式,若前面有0,也會傳輸<6>經度半球E(東經)或W(西經)<7>地面速率(000.0~999.9節(jié),前面的0也將被傳輸)<8>地面航向(000.0~359.9度,參考基準是真北方向,若前面有0,也會傳輸)<9>UTC日期,ddmmyy,典型的日月年格式<10>磁偏角(000.0~180.0度,若前面有0,也會傳輸)<11>磁偏角方向,E(東)或W(西)<12>模式指示(僅在NMEA01833.00版本輸出,比如用A表示自主定位,用D表示差分等)3.安卓GPS驅動層次分析如下圖,是安卓GPS驅動的層次結構:最底層的LinuxDeviceDriver使用UART硬件接口與GPS模塊通信。HAL層調用Linux內核的UART驅動,打開UART即可讀取GPS的信息。解析數據之后,根據指定的GPS協(xié)議處理數據,將處理結果通過callback函數傳輸給JNI層。JNI層有很多函數,處理數據后將結果傳給framework層。framework層是應用程序框架層,用于進一步處理數據,開發(fā)人員主要跟這一層打交道。該層封裝形成了一些易用的接口(API),以供應用層調用。應用層調用接口,顯示當前GPS實時位置。 4.安卓GPS驅動之HAL層 1)HAL層中,代碼里的GpsLocation結構體保存了經度,緯度,海拔,速度,精確度,世界標準時間等信息。/**Representsalocation.*/typedefstruct{/**settosizeof(GpsLocation)*/size_tsize;uint16_tflags;doublelatitude;doublelongitude;doublealtitude;floatspeed;floatbearing;floataccuracy;GpsUtcTimetimestamp;}GpsLocation; 2)hw結構體如下:conststructhw_module_tHAL_MODULE_INFO_SYM={…….methods=&gps_module_methods,};由上可知hw結構體的方法調用的是gps_module_methods,而gps_module_methods調用了open_gps,如下:staticstructhw_module_methods_tgps_module_methods={.open=open_gps};open_gps里初始化了很多函數指針,這些函數用于處理GPS相關信息,也提供數據上報等操作。 3)串口讀取GPS數據:ret=read(fd,buff,sizeof(buff));解析數據:nmea_reader_addc(reader,buff[nn]);根據不同的GPS協(xié)議格式處理數據:if(!memcmp(tok.p,"GGA",3))……;elseif(!memcmp(tok.p,"GLL",3))……;elseif(!memcmp(tok.p,"GSA",3))……;elseif(!memcmp(tok.p,"GSV",3))……;將數據傳輸給JNI層:r->callback(&r->fix);5.安卓GPS驅動之JNI層JNI層只有一個文件,該文件中有很多函數。JNI層調用下層提供的函數接口,來封裝GPS位置的相關信息,以及初始化GPS等等。下面分析兩個函數,其余函數類似。1)android_location_GpsLocationProvider_class_init_native函數獲取所有的方法ID,然后調用hw模塊,調用到open函數(見上):err=module->methods->open(module,GPS_HARDWARE_MODULE_ID,&device);然后獲取接口:sGpsInterface=gps_device->get_gps_interface(gps_device);2)android_location_GpsLocationProvider_init是初始化函數,該函數調用了:if(sGpsXtraInterface&&sGpsXtraInterface->init(&sGpsXtraCallbacks)!=0)sGpsXtraInterface=NULL;其中init調用了HAL層的qemu_gps_init函數,得到callback傳來的信息。callback如下:GpsCallbackssGpsCallbacks={sizeof(GpsCallbacks),location_callback,//回調位置信息status_callback,//回調狀態(tài)信息sv_status_callback,//回調sv狀態(tài)信息nmea_callback,//上報nema信息set_capabilities_callback,//回調告知框架層GPS的性能acquire_wakelock_callback,//獲取GPS鎖,不進行休眠release_wakelock_callback,//釋放GPS鎖create_thread_callback,//創(chuàng)建線程,可以調用javaframework的代碼request_utc_time_callback,//獲取utc時間};6.安卓GPS驅動之framework層framework層主要功能是為上一層的應用層提供接口,給應用層的接口的示例如下:mLocation.setLatitude(latitude);mLocation.setLongitude(longitude);mLocation.setTime(timestamp);在類handleMessage中會處理數據,publicvoidhandleMessage(Messagemsg){intmessage=msg.what;switch(message){caseENABLE:if(msg.arg1==1){handleEnable();}else{handleDisable();}break;caseENABLE_TRACKING:handleEnableLocationTracking(msg.arg1==1);break;caseREQUEST_SINGLE_SHOT:handleRequestSingleShot();break;caseUPDATE_NETWORK_STATE:handleUpdateNetworkState(msg.arg1,(NetworkInfo)msg.obj);break;caseINJECT_NTP_TIME:handleInjectNtpTime();break;caseDOWNLOAD_XTRA_DATA:if(mSupportsXtra){handleDownloadXtraData();}break;caseUPDATE_LOCATION:handleUpdateLocation((Location)msg.obj);break;caseADD_LISTENER:handleAddListener(msg.arg1);break;caseREMOVE_LISTENER:handleRemoveListener(msg.arg1);break;}}7.安卓GPS驅動之APP層使用framework提供的接口函數得到數據。比如mLocation.setLatitude(latitude)函數用于設置緯度,再使用getLatitude()函數即可得到緯度。一段應用層代碼如下:privatevoidupdateToNewLocation(Locationlocation){if(location!=null){bear=location.getBearing(); //偏離正北方的度數doublelatitude=location.getLatitude(); //維度doublelongitude=location.getLongitude(); //經度doubleGpsSpeed=location.getSpeed(); //速度longGpsTime=location.getTime(); //時間Datedate=newDate(GpsTime);DateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");flo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論