Android GPS开发总结
APK:AndroiTS,GPS test+,Cellular-Z
GSV:GPS Satellites in View
1 NMEA語句
1.1 NMEA數(shù)據(jù)格式
NMEA格式:數(shù)據(jù)傳輸以“語句”的方式進行,每個語句均以“$”開頭,然后是兩個字母的“識別符”和三個字母的“語句名”,接著就是以逗號分割的數(shù)據(jù)體,語句末尾為校驗和,整條語句以回車換行符結(jié)束。
$GNGNS,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*xx<CR><LF>
GN:Global Navigation GNSS,表示使用了多個系統(tǒng)的衛(wèi)星取得位置解算
<1>:UTC時間,hhmmss.ss
<2>:緯度ddmm.mmmmmmm
<3>:緯度標識,N或者S
<4>:經(jīng)度dddmm.mmmmmmm
<5>:經(jīng)度標識,E或者W
<6>:定位標識,NN - 未定位,AA - 定位Active
<7>:定位星數(shù)
<8>:HDOP值
<9>:海拔高度,單位m
<10>:水平面分離度,單位m
<11>:差分數(shù)據(jù)時齡
<12>:差分站代號
*xx:校驗和
$GPACCURACY,<1>*hh<CR><LF>
去掉前綴$GPACCURACY,后,以逗號分隔,*號表示結(jié)束。
<1> 單位為m,表示誤差范圍
$GPBOD,099.3,T,105.6,M,POINTB,*01
去掉前綴$GPBOD,后,以逗號分隔,*號表示結(jié)束。
<1>: 99.3 (運動角度,000 - 359,(前導位數(shù)不足則補0)),真北參照系
<2>: T=真北參照系
<3>: 105.6 (運動角度,000 - 359,(前導位數(shù)不足則補0)),磁北參照系
<4>: M=磁北參照系
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx<CR><LF>
去掉前綴$GPGGA,后,以逗號分隔,*號表示結(jié)束。
GNGGA:如果使用了多個系統(tǒng)的衛(wèi)星取得位置解算,傳送標識符前綴為GN(Global Navigation / Multi-constellation)
<1>:UTC Time,格式為hhmmss.sss
<2>:緯度,格式為ddmm.mmmm(第一位是零也將傳送)
<3>:緯度半球N(北半球)或S(南半球)
<4>:經(jīng)度,格式為dddmm.mmmm(第一位零也將傳送)
<5>:經(jīng)度半球E(東經(jīng))或W(西經(jīng))
<6>:定位質(zhì)量指示,0=定位無效,1=定位有效
<7>:使用衛(wèi)星數(shù)量,從00到12(第一個零也將傳送)
<8>:HDOP-水平精度因子,0.5到99.9,一般認為HDOP越小,質(zhì)量越好
<9>:海拔高度,單位M
<10>:地球橢球面相對大地水準面的高度
<11>:差分時間(從最近一次接收到差分信號開始的秒數(shù),如果不是差分定位將為空)
<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;*號表示結(jié)束。
GPGSV是反應接收機搜索到定位衛(wèi)星的相關(guān)信息,一次搜星如果搜3-4個衛(wèi)星即可定位,在環(huán)境好的情況下可搜到12個衛(wèi)星,每一個GPGSV語句最多保存四個衛(wèi)星的信息,因此超過4顆星,就需要多條GPGSV語句來描述了。一次搜星所有GPGSV稱為一個sentence (系列)
<4>,<5>,<6>,<7>組成一個衛(wèi)星組,有多個衛(wèi)星組的狀態(tài),其中第<7>個字段是SNR。
<1>:一次搜星需要GPGSV語句總數(shù)
<2>:當前GSV在整個序列里的編號,第一條編號為1,最后一條等于<1>
<3>:表示當前可視的定位衛(wèi)星總數(shù)
<4>:表示衛(wèi)星號(PRN碼,偽隨機噪聲碼),GPS衛(wèi)星的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,后,以逗號分隔,*號表示結(jié)束。
???除了GPRMC之外還有GPRMA和GPRMB。
GNRMC:如果使用了多個系統(tǒng)的衛(wèi)星取得位置解算,傳送標識符前綴為GN(Global Navigation / Multi-constellation)
<1>:UTC時間,hhmmss(時分秒)格式
<2>:A表示定位(Active),V表示未定位(Void)
<3>:緯度ddmm.mmmm(度分)格式(前面的0也將被傳輸)
<4>:緯度半球N(北半球)或S(南半球)
<5>:經(jīng)度dddmm.mmmm(度分)格式(前面的0也將被傳輸)
<6>:經(jīng)度半球E(東經(jīng))或W(西經(jīng))
<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>:模式指示(僅NMEA0183 3.00版本輸出,A=自主定位,D=差分,E=估算,N=數(shù)據(jù)無效)
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
去掉前綴$GPVTG,后,以逗號分隔,*號表示結(jié)束。
<1>: 運動角度,000 - 359,(前導位數(shù)不足則補0),真北參照系
T:真北參照系
<2>: 運動角度,000 - 359,(前導位數(shù)不足則補0),磁北參照系
M:磁北參照系
1.2 PRN編號
在一個導航系統(tǒng)(GPS或BD)里,一顆衛(wèi)星對應唯一的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區(qū)分。
1.3 地圖
百度地圖和高德地圖使用了GxRMC和GxGSV做為地圖的數(shù)據(jù)源。
1.4 ToD語句
GPGGA, GPRMC, GPZDA
2 GPS衛(wèi)星信號解析
Apple Watch Ultra:民用GPS通常只使用L1波段,L5是第三種民用波段。
- GPS衛(wèi)星的星歷:描述衛(wèi)星的有關(guān)的軌道信息
- GPS信號是一個CDMA(碼分多址)信號,一般來說,GPS接收機對衛(wèi)星信號的搜索是一個“滿天搜星”的過程,即要搜索天空中的所有衛(wèi)星對應的偽隨機碼。如果預先知道任意時刻所有衛(wèi)星的概略位置,接收機就可以只復現(xiàn)本時刻天空中存在衛(wèi)星的偽隨機碼進行搜索。這樣可以使GPS接收機在搜索衛(wèi)星時做到有的放矢,縮短捕獲衛(wèi)星信號的時間
- GPS衛(wèi)星編號從1到32
- 每個幀為1500bits,而衛(wèi)星是以50bit/s(bps)的速率來發(fā)射信號,因此需要30s的時間才能將完整的一幀數(shù)據(jù)傳完,每個幀包含5個子幀
- Subframe 1-3 包含一顆衛(wèi)星的所有星歷參數(shù),每幀都相同,重復25次主幀
- Subframe 4-5 包含所有衛(wèi)星的歷書參數(shù),每幀都不同
- Subframe 1 中包含WN(Week Number,占用10個bit,0到1023),GPS周;翻轉(zhuǎn)日期分別是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設(shè)備掃描從mmc_rescan函數(shù)開始,mmc_rescan函數(shù)中分別使用400k、300k、200k,100k的速率調(diào)用mmc_rescan_try_freq進行掃描,只要掃描到了設(shè)備,就會退出掃描。所以如果在400k速率時掃描到了SDIO設(shè)備,后面3種速率的掃描就不需要再執(zhí)行。
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),硬件設(shè)計時,只需二選一。
mnld讀取/dev/stpgps,計算獲得NMEA語句,通過路徑是mtk_mnl2hal的socket發(fā)給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字符串說明已經(jīng)打開了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權(quán)限已經(jīng)無效了,需要在Activity中主動調(diào)用requestPermissions()請求權(quán)限,并等待onRequestPermissionsResult()返回的結(jié)果。
[18-Mar-2022] 要在logcat中看到NMEA語句,需要調(diào)整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 - 將發(fā)送到芯片中的當前數(shù)據(jù)保存到外部SPI Flash中
UBX-CFG-RINV - Remote Inventory,數(shù)據(jù)保存在外部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消息的結(jié)束
以GxRMC作為每秒的第一條語句解析出時間,接著的語句時間都用GxRMC中的時間,一直到下個GxRMC開始。The sentence sequence starts with RMC.
4.2 UBX-CFG-MSG
proprietary UBX message configurations format:
[class ID, message ID, frequency]
- 根據(jù)上面的3個參數(shù),設(shè)置某條UBX消息的輸出頻率
- 根據(jù)上面的3個參數(shù),用來輪訓(主動讀)某一條UBX消息
4.3 M8030有源天線狀態(tài)讀取
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天線檢測的參考設(shè)計,天線檢測使用了3個PIO,M8030讀取3個PIO的值,計算出天線的狀態(tài)后,通過UBX-MON-HW.aStatus和UBX-MON-HW.aPower傳給Host CPU。
還有一些OEM沒有使用ublox的參考設(shè)計,而是使用了不同于ublox的參考設(shè)計中的3個PIO,M8030讀取3個PIO的值后,通過UBX-MON-HW.pinVal將PIO的值直接傳給Host CPU,Host CPU根據(jù)PIO的真值表,判斷天線是開路(Open Circuit Detection)還是短路(Short Circuit Detection)等。
4.4 RTCM3
RTK是通過在某個地方設(shè)定一個基站base,然后在自動駕駛車輛上面裝一個rover(這個單詞一般直接翻譯為車輛)。base是固定的,這樣base就可以接收GPS的載波相位A。然后rover就可以在不停的移動過程中收到來自衛(wèi)星的載波相位B和base的載波相位A。A和B做差分,就可以得到載波相位的誤差C,rover利用這個誤差C對自身的B不停的進行修正,這樣就可以得到1~2cm的精確度。
RTK數(shù)據(jù)通訊有兩種方式,一種為電臺模式,另外一種為網(wǎng)絡(luò)模式。
RTCM3 is used by BMW Integration Platform Next 2025 (IPNext25), successor of BDC/BCP.
4.5 時間戳轉(zhuǎn)換為UTC時間
import time
print time.asctime(time.localtime(時間戳))
print time.asctime(time.gmtime(時間戳))
4.6 NMEA語句參數(shù)解析
使用atoi()和atof()將字符串Argx轉(zhuǎn)換成對應的整數(shù)和浮點數(shù)
[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數(shù)據(jù)上報流程
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()
用戶層回調(diào)類
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的主設(shè)備號:cat /proc/devices
創(chuàng)建binary節(jié)點:
mknod /dev/usbmon0 c $major 0
mknod /dev/usbmon1 c $major 1
mknod /dev/usbmon2 c $major 2
Android ueventd進程根據(jù)uevent事件創(chuàng)建設(shè)備節(jié)點,其配置文件ueventd.rc不起實際作用,只是對創(chuàng)建的設(shè)備節(jié)點文件屬性做設(shè)置。usbmon的子系統(tǒng)就是usbmon,而ueventd只處理了子系統(tǒng)usb并且在目錄/dev/bus/usb下創(chuàng)建設(shè)備節(jié)點,為了使ueventd自動創(chuàng)建/dev/usbmonN節(jié)點,需要在ueventd中增加處理usbmon子系統(tǒng)。
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主機發(fā)一個IN token,如果從機CPU不能實時響應,可以回復一個空數(shù)據(jù)包,這種情況是可以接受的。
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令牌發(fā)送太快會導致ublox M8030全速設(shè)備丟包。
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()數(shù)據(jù),strace必須帶-f參數(shù),否則捕獲不到read()數(shù)據(jù)。
strace -p $PID -x -tt -T -f -e trace=read -e read=$FD
9 URLs
NMEA data
http://www.gpsinformation.org/dale/nmea.htm
各種時間換算關(guān)系
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,網(wǎng)絡(luò)發(fā)起的定位
AGPS SI:Subscriber Initiated,用戶發(fā)起的定位
BBR: Backup RAM
C/A碼:Coarse / Acquisition Code,粗碼
CNR:Carrier Noise Ratio
DR:Dead Reckoning,使用ACC和GYRO做航位推算
FLP:Fused Location Provider
Garmin:名字來自于兩位創(chuàng)始人名字前三位字母組合(Gary Burrell和Min Kao)
GPS XTRA:高通提供的一個可以下發(fā)星歷信息的解決方案,類似于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,當前衛(wèi)星信息
GSV: GPS Satellites in View,可見衛(wèi)星星歷
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,準天頂衛(wèi)星系統(tǒng)
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,海事無線電技術(shù)委員會
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
總結(jié)
以上是生活随笔為你收集整理的Android GPS开发总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux文件查找命令
- 下一篇: java 矫正鱼眼图像_鱼眼图像校正