Android GPS开发总结
APK:AndroiTS,GPS test+,Cellular-Z
GSV:GPS Satellites in View
1 NMEA語句
1.1 NMEA數據格式
NMEA格式:數據傳輸以“語句”的方式進行,每個語句均以“$”開頭,然后是兩個字母的“識別符”和三個字母的“語句名”,接著就是以逗號分割的數據體,語句末尾為校驗和,整條語句以回車換行符結束。
$GNGNS,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*xx<CR><LF>
GN:Global Navigation GNSS,表示使用了多個系統的衛星取得位置解算
<1>:UTC時間,hhmmss.ss
<2>:緯度ddmm.mmmmmmm
<3>:緯度標識,N或者S
<4>:經度dddmm.mmmmmmm
<5>:經度標識,E或者W
<6>:定位標識,NN - 未定位,AA - 定位Active
<7>:定位星數
<8>:HDOP值
<9>:海拔高度,單位m
<10>:水平面分離度,單位m
<11>:差分數據時齡
<12>:差分站代號
*xx:校驗和
$GPACCURACY,<1>*hh<CR><LF>
去掉前綴$GPACCURACY,后,以逗號分隔,*號表示結束。
<1> 單位為m,表示誤差范圍
$GPBOD,099.3,T,105.6,M,POINTB,*01
去掉前綴$GPBOD,后,以逗號分隔,*號表示結束。
<1>: 99.3 (運動角度,000 - 359,(前導位數不足則補0)),真北參照系
<2>: T=真北參照系
<3>: 105.6 (運動角度,000 - 359,(前導位數不足則補0)),磁北參照系
<4>: M=磁北參照系
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx<CR><LF>
去掉前綴$GPGGA,后,以逗號分隔,*號表示結束。
GNGGA:如果使用了多個系統的衛星取得位置解算,傳送標識符前綴為GN(Global Navigation / Multi-constellation)
<1>:UTC Time,格式為hhmmss.sss
<2>:緯度,格式為ddmm.mmmm(第一位是零也將傳送)
<3>:緯度半球N(北半球)或S(南半球)
<4>:經度,格式為dddmm.mmmm(第一位零也將傳送)
<5>:經度半球E(東經)或W(西經)
<6>:定位質量指示,0=定位無效,1=定位有效
<7>:使用衛星數量,從00到12(第一個零也將傳送)
<8>:HDOP-水平精度因子,0.5到99.9,一般認為HDOP越小,質量越好
<9>:海拔高度,單位M
<10>:地球橢球面相對大地水準面的高度
<11>:差分時間(從最近一次接收到差分信號開始的秒數,如果不是差分定位將為空)
<12>:差分站ID號0000~1023(前面的0也將被傳輸,如果不是差分定位將為空)
GPGSA:
PDOP位置精度因子(0.5~99.9)
HDOP水平精度因子(0.5~99.9)
VDOP垂直精度因子(0.5~99.9)
$GPGSV,<1>,<2>,<3>,<4>,<5>,<6>,<7>…<4>,<5>,<6>,<7>*hh(CR)(LF)
去掉前綴$GPGSV,后,以逗號分隔,0-based index;*號表示結束。
GPGSV是反應接收機搜索到定位衛星的相關信息,一次搜星如果搜3-4個衛星即可定位,在環境好的情況下可搜到12個衛星,每一個GPGSV語句最多保存四個衛星的信息,因此超過4顆星,就需要多條GPGSV語句來描述了。一次搜星所有GPGSV稱為一個sentence (系列)
<4>,<5>,<6>,<7>組成一個衛星組,有多個衛星組的狀態,其中第<7>個字段是SNR。
<1>:一次搜星需要GPGSV語句總數
<2>:當前GSV在整個序列里的編號,第一條編號為1,最后一條等于<1>
<3>:表示當前可視的定位衛星總數
<4>:表示衛星號(PRN碼,偽隨機噪聲碼),GPS衛星的PRN碼范圍是1-32
<5>:表示仰角(Elevation),00~90度
<6>:表示方位角(Heading),000~359度
<7>:信噪比(00~99dB)
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
去掉前綴$GPRMC,后,以逗號分隔,*號表示結束。
???除了GPRMC之外還有GPRMA和GPRMB。
GNRMC:如果使用了多個系統的衛星取得位置解算,傳送標識符前綴為GN(Global Navigation / Multi-constellation)
<1>:UTC時間,hhmmss(時分秒)格式
<2>:A表示定位(Active),V表示未定位(Void)
<3>:緯度ddmm.mmmm(度分)格式(前面的0也將被傳輸)
<4>:緯度半球N(北半球)或S(南半球)
<5>:經度dddmm.mmmm(度分)格式(前面的0也將被傳輸)
<6>:經度半球E(東經)或W(西經)
<7>:地面速率(000.0~999.9節,前面的0也將被傳輸)
<8>:地面航向(000.0~359.9度,以真北為參考基準,前面的0也將被傳輸)
<9>:UTC日期,ddmmyy(日月年)格式
<10>:磁偏角(000.0~180.0度,前面的0也將被傳輸)
<11>:磁偏角方向,E(東)或W(西)
<12>:模式指示(僅NMEA0183 3.00版本輸出,A=自主定位,D=差分,E=估算,N=數據無效)
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
去掉前綴$GPVTG,后,以逗號分隔,*號表示結束。
<1>: 運動角度,000 - 359,(前導位數不足則補0),真北參照系
T:真北參照系
<2>: 運動角度,000 - 359,(前導位數不足則補0),磁北參照系
M:磁北參照系
1.2 PRN編號
在一個導航系統(GPS或BD)里,一顆衛星對應唯一的PRN。Refer to GPGSV。
BeiDou:1 - 37
GPS:1 - 32
SBAS:33 - 64
GLONASS:65 - 96
QZSS:193 - 197
BeiDou和GPS的PRN有重疊,通過NMEA語句的前綴GP或者BD區分。
1.3 地圖
百度地圖和高德地圖使用了GxRMC和GxGSV做為地圖的數據源。
1.4 ToD語句
GPGGA, GPRMC, GPZDA
2 GPS衛星信號解析
Apple Watch Ultra:民用GPS通常只使用L1波段,L5是第三種民用波段。
- GPS衛星的星歷:描述衛星的有關的軌道信息
- GPS信號是一個CDMA(碼分多址)信號,一般來說,GPS接收機對衛星信號的搜索是一個“滿天搜星”的過程,即要搜索天空中的所有衛星對應的偽隨機碼。如果預先知道任意時刻所有衛星的概略位置,接收機就可以只復現本時刻天空中存在衛星的偽隨機碼進行搜索。這樣可以使GPS接收機在搜索衛星時做到有的放矢,縮短捕獲衛星信號的時間
- GPS衛星編號從1到32
- 每個幀為1500bits,而衛星是以50bit/s(bps)的速率來發射信號,因此需要30s的時間才能將完整的一幀數據傳完,每個幀包含5個子幀
- Subframe 1-3 包含一顆衛星的所有星歷參數,每幀都相同,重復25次主幀
- Subframe 4-5 包含所有衛星的歷書參數,每幀都不同
- Subframe 1 中包含WN(Week Number,占用10個bit,0到1023),GPS周;翻轉日期分別是2019-4-6和2038-11-20
- Subframe 4 中含有UTC時間
3 MTK GNSS
3.1 MT3333
Telit's SL871L is the evolved variant of the SL871 family of modules based on the low-power Mediatek MT3333 (IF 4-bit ADC, refer to MT3339 datasheet), which uses 2 ADC to check if antenna is short or open. MT2523G also integrates MT3333 (IF 4-bit ADC, refer to MT3339 datasheet).
3.2 SDIO
SDIO設備掃描從mmc_rescan函數開始,mmc_rescan函數中分別使用400k、300k、200k,100k的速率調用mmc_rescan_try_freq進行掃描,只要掃描到了設備,就會退出掃描。所以如果在400k速率時掃描到了SDIO設備,后面3種速率的掃描就不需要再執行。
CMD5響應格式為R4,返回的OCR(Operating Conditions Register)中包含3 bit的Number of IO functions,讀出來的值是最大支持的功能索引。
3.3 MT6630
EPO: Extended Prediction Orbit
FLP: Fused Location Provider
MNL:Mediatek Navigation Library
NLP: Network Location Provider
STP:Serial Transport Protocol
WMT:Wireless Management Tools
MT6630有2個中斷pin,分別是WIFI_INT_B、BGF_INT_B(其中BGF表示BT/GPS/FM interrupt pin),硬件設計時,只需二選一。
mnld讀取/dev/stpgps,計算獲得NMEA語句,通過路徑是mtk_mnl2hal的socket發給GNSS HAL。
FWK->JNI->HAL->MNLD
Android 10中IGnss支持3個版本:2.0、1.1、1.0。
base/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
android_location_GnssLocationProvider_set_gps_service_handle()
system/sepolicy/vendor/hal_gnss_default.te
3.4 Android GNSS API
Get GPS status,包含gps字符串說明已經打開了GPS:
settings get secure location_providers_allowed
當Build.VERSION.SDK_INT >= Build.VERSION_CODES.N時,
使用android.location.OnNmeaMessageListener,
否則使用android.location.GpsStatus.NmeaListener。
Android 10在xml文件中添加GPS權限已經無效了,需要在Activity中主動調用requestPermissions()請求權限,并等待onRequestPermissionsResult()返回的結果。
[18-Mar-2022] 要在logcat中看到NMEA語句,需要調整log level到D,不是V,否則還是看不到log。
setprop log.tag.<TAG> D
4 ublox
4.1 u-center
Download u-center from u-blox website.
查詢目前串口波特率配置:
Tools>>GNSS Configuration
選擇支持哪些NMEA消息輸出:
UBX>>CFG (Config)>>MSG (Messages)
串口配置:
UBX>>CFG (Config)>>PRT (Ports)
Period配置:
UBX>>CFG (Config)>>RATE (Rates)
UBX-CFG-CFG - 將發送到芯片中的當前數據保存到外部SPI Flash中
UBX-CFG-RINV - Remote Inventory,數據保存在外部SPI Flash中,用途是保存一個自定義的字符串,下次啟動時,軟件用來識別是否做過UBX-CFG-CFG
[18-Mar-2022] Clear NVM of BBR and Flash: B5 62 06 09 0D 00 FF FF 00 00 00 00 00 00 FF FF 00 00 03 1B 9A
UBX-NAV-EOE - 每秒NMEA和UBX消息的結束
以GxRMC作為每秒的第一條語句解析出時間,接著的語句時間都用GxRMC中的時間,一直到下個GxRMC開始。The sentence sequence starts with RMC.
4.2 UBX-CFG-MSG
proprietary UBX message configurations format:
[class ID, message ID, frequency]
- 根據上面的3個參數,設置某條UBX消息的輸出頻率
- 根據上面的3個參數,用來輪訓(主動讀)某一條UBX消息
4.3 M8030有源天線狀態讀取
M8030 integrated two zero-IF 5-bit ADCs.
[25th-Mar-2022]
PIO14: ANT_DET, for power
PIO15: ANT_SHORT_N
PIO16: ANT_OFF
ublox提供了M8030天線檢測的參考設計,天線檢測使用了3個PIO,M8030讀取3個PIO的值,計算出天線的狀態后,通過UBX-MON-HW.aStatus和UBX-MON-HW.aPower傳給Host CPU。
還有一些OEM沒有使用ublox的參考設計,而是使用了不同于ublox的參考設計中的3個PIO,M8030讀取3個PIO的值后,通過UBX-MON-HW.pinVal將PIO的值直接傳給Host CPU,Host CPU根據PIO的真值表,判斷天線是開路(Open Circuit Detection)還是短路(Short Circuit Detection)等。
4.4 RTCM3
RTK是通過在某個地方設定一個基站base,然后在自動駕駛車輛上面裝一個rover(這個單詞一般直接翻譯為車輛)。base是固定的,這樣base就可以接收GPS的載波相位A。然后rover就可以在不停的移動過程中收到來自衛星的載波相位B和base的載波相位A。A和B做差分,就可以得到載波相位的誤差C,rover利用這個誤差C對自身的B不停的進行修正,這樣就可以得到1~2cm的精確度。
RTK數據通訊有兩種方式,一種為電臺模式,另外一種為網絡模式。
RTCM3 is used by BMW Integration Platform Next 2025 (IPNext25), successor of BDC/BCP.
4.5 時間戳轉換為UTC時間
import time
print time.asctime(time.localtime(時間戳))
print time.asctime(time.gmtime(時間戳))
4.6 NMEA語句參數解析
使用atoi()和atof()將字符串Argx轉換成對應的整數和浮點數
[25th-Mar-2022]
C++ function template for dynamic memory allocation.
SPC: shared_ptr class
4.7 GPS的冷啟動、溫啟動和熱啟動
warm-start:距離上次定位的時間超過兩個小時的啟動。?
hot-start:距離上次定位的時間小于兩個小時的啟動。
4.8 u-center TCP client
1) connect USBEthernet to Android device
ifconfig eth0 192.168.5.99/24 up
2) connect USBEthernet cable to Windows
Configure Windows static IP addr to 192.168.5.100/24
3) Windows u-center
[Receiver] [Connection] [Network connection]
tcp://192.168.5.99:65501
4) Android
netstat -apnt
4.9 debug
1) USB IN token sends too fast to cause NMEA dropped
2) external flash bit flip
3) two continous NAV-PVT have same UTC
5 Android GPS
5.1 Android Location Provider加載流程
LocationManagerService
->
loadProvidersLocked
->
config_locationProviderPackageNames
->
createAndBind - 獲得后臺APK Service的Binder接口
in framework/base/packages/FusedLocation/src/com/android/location/fused/
in framework/java/com/qualcomm/location/izatserviceprovider/provider/IzatProviderEngine.java
5.2 Android GPS數據上報流程
in JNI com_android_server_location_GnssLocationProvider.cpp
android_location_GnssLocationProvider_init()
GnssCallback::gnssLocationCb()
in framework GnssLocationProvider.java
reportLocation()
reportNmea(long timestamp)?
in framework LocationManagerService.java
reportLocation()
handleLocationChangedLocked()
in framework GnssStatusListenerHelper.java
onNmeaReceived()
用戶層回調類
LocationListener.java
當Build.VERSION.SDK_INT >= Build.VERSION_CODES.N時,
使用android.location.OnNmeaMessageListener,
否則使用android.location.GpsStatus.NmeaListener。
6 USB host抓包方法
6.1 sniff原理
binary格式路徑:/dev/usbmonX
text格式路徑:/sys/kernel/debug/usb/usbmon
獲得usbmon的主設備號:cat /proc/devices
創建binary節點:
mknod /dev/usbmon0 c $major 0
mknod /dev/usbmon1 c $major 1
mknod /dev/usbmon2 c $major 2
Android ueventd進程根據uevent事件創建設備節點,其配置文件ueventd.rc不起實際作用,只是對創建的設備節點文件屬性做設置。usbmon的子系統就是usbmon,而ueventd只處理了子系統usb并且在目錄/dev/bus/usb下創建設備節點,為了使ueventd自動創建/dev/usbmonN節點,需要在ueventd中增加處理usbmon子系統。
6.2 usbmon tcpdump
1)mount -t debugfs none_debugs /sys/kernel/debug
2)cat /sys/kernel/debug/usb/devices - 確定usb的總線號
3)tcpdump -D
4)tcpdump -i usbmon1 -s 128 -w /data/usb_sniff.pcap &
5)killall tcpdump
6)wireshark工具打開usb_sniff.pcap
7)wireshark過濾:usb.src == "1.6.1" and usb.dst == "host" - 改到對應的USB bus_no.addr.ep_no
Intel APL (Gen9, A39X0) 8-port MPH xHCI
usbmon1:xHCI LF/HS/HS
usbmon2:xHCI SS
7 USB Bulk傳輸
7.1 ZLP
USB主機發一個IN token,如果從機CPU不能實時響應,可以回復一個空數據包,這種情況是可以接受的。
7.2?APL xHCI Scheduler Async Delay
Datasheet
21.1 xHCI - including OTG MUX Registers
21.2 xHCI PCI Config Registers
21.3 DBC
21.4 DWC3
21.5 DWC3
21.6 xHCI Proprietary Registers
21.7 DWC3 PCI Config Registers
21.9 DWC3 PCI Config Registers
寄存器地址:PCI_BAR0 + 80D4h
在控制或者Bulk令牌傳輸之間插入延時,否則IN或者OUT令牌發送太快會導致ublox M8030全速設備丟包。
7.3?USB Bulk傳輸速度計算
- Full-speed
每個frame最大可以傳輸19個Bulk包,每個Bulk包最大是64 Bytes,所以其最大傳輸速率是:19 x 64 x 1000 = 1.16 MB/s。
- High-speed
USB 2.0在每個微幀中最大可傳輸13個Bulk包,每個Bulk包最大是512 Bytes,而每個微幀長固定為125 μs,所以其最大傳輸速率為:13 x 512 x 8 x 1000 = 51 MB/s。
- Super-speed
USB 3.0在每個微幀中最大可傳輸13個Bulk包,每個Bulk包最大是1024 Bytes,而每個微幀長固定為125 μs,所以其最大傳輸速率為:13 x 1024 x 8 x 1000 = 102 MB/s。
7.4?QCOM USB GNSS
cat /sys/kernel/debug/smd/tbl
/usr/bin/quectel-gps-handle
uses /dev/ttyGS0 to print NMEA to host
uses /dev/smd7 to communicate with BB
8 strace
strace -e epoll_wait -x -p $PID
strace -p $PID -tt -T -s 128 -x 2>&1 | grep "read(17"
捕獲物理串口的read()數據,strace必須帶-f參數,否則捕獲不到read()數據。
strace -p $PID -x -tt -T -f -e trace=read -e read=$FD
9 URLs
NMEA data
http://www.gpsinformation.org/dale/nmea.htm
各種時間換算關系
http://leapsecond.com/java/gpsclock.htm
10 Abbreviations
10.1 General
AGPS LOC:Location
AGPS MSA:MS-Assited
AGPS MSB:MS-Based
AGPS SUPL:Secure User Plane Location,安全用戶平面
AGPS ULP:User Location Plane
AGPS NI:Network Initiated,網絡發起的定位
AGPS SI:Subscriber Initiated,用戶發起的定位
BBR: Backup RAM
C/A碼:Coarse / Acquisition Code,粗碼
CNR:Carrier Noise Ratio
DR:Dead Reckoning,使用ACC和GYRO做航位推算
FLP:Fused Location Provider
Garmin:名字來自于兩位創始人名字前三位字母組合(Gary Burrell和Min Kao)
GPS XTRA:高通提供的一個可以下發星歷信息的解決方案,類似于MTK EPO,都是輔助定位用的
GGA: Global Positioning System Fix Data,定位信息
GLL: Geographic Position, Latitude/Longitude,地位地理信息
GNRMC:Global Navigation Recommended Minimum sentence C,多模推薦定位信息
GPRMC:GPS Recommended Minimum sentence C,GPS推薦定位信息
GSA: GPS DOP and Active Satellites,當前衛星信息
GSV: GPS Satellites in View,可見衛星星歷
MTK: Airoha, Econet, ILITEK, Mstar, Nephos, Richtek, Zelustek
MT2523G:G表示集成了GPS芯片MT3333
MTK EPO: Extended Prediction Orbit
MTK GPS MNL:Mediatek Navigation Library
P碼:Precise Code,精碼
PGRM:Proprietary Garmin
PMTK:Proprietary MTK
QDR:Qualcomm Dead Reckoning
QMI_PDS:QMI Position Determination Service - for GPS
QZSS:Quasi-Zenith Satellite System,準天頂衛星系統
SBZ:Should Be Zero
USB BH reset:Bigger Hammer or Brad Hosler,表示warm reset;you may be confused why the USB 3.0 spec calls the same type of reset "warm reset" in some places and "BH reset" in other places. "BH" reset is supposed to stand for "Big Hammer" reset, but it also stands for "Brad Hosler". Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent.
VTG: Track Made Good and Ground Speed,地面速度信息
VZW:Verizon Wireless AGPS Location Provider
ZDA: Time & Date,時間日期信息
10.2 ublox
NAV-DOP:Dilution of Precision,精度因子,ublox私有的UBX消息包
NAV-PVT:Position Velocity and Time(UTC),ublox私有的UBX消息包;fixType表示定位有沒有成功標志字段,velN表示NED north velocity
RTCM:Radio Technical Commission for Maritime services,海事無線電技術委員會
RTK:Real-Time Kinematic
ublox M8T:Multi-constellation 8 Timing,多重星系
10.3 CarPlay
PASCD:Proprietary Apple Vehicle Speed Data,for CarPlay
PAACD:Proprietary Apple Acc Data,for CarPlay
PAGCD:Proprietary Apple Gyro Data,for CarPlay
總結
以上是生活随笔為你收集整理的Android GPS开发总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux文件查找命令
- 下一篇: android无法解码avcmp4,an