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
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
去掉前缀$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
去掉前缀$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
去掉前缀$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. D

4 ublox
4.1 u-center
Download u-center from u-blox website.
[View][Messages View][Disable Child Messages]

查询目前串口波特率配置:
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) xHCI FS USB IN token sends too fast to cause NMEA dropped
2) external flash bit flip
3) two continous NAV-PVT have same UTC
4) Firmware Log
定位最低要求是4颗星,信号要求28dB以上。
u-blox u-center enables Debug messages(爬虫图标) to catch firmware log, it's a UBX binary log.

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

你可能感兴趣的:(Connectivity,nmea,u-blox,u-center)