Android GPS开发总结

Android GPS Satellites in View(GSV)
APK:AndroiTS, GPS test+

1 NMEA语句
1.1 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,后,以逗号分隔,*号表示结束。
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 地图
百度地图和高德地图使用了GxRMC和GxGSV做为地图的数据源。

2 GPS卫星信号解析
- 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 U-BLOX
3.1 u-center
查询目前串口波特率配置:
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
UBX-NAV-EOE - 每秒NMEA和UBX消息的结束

以GxRMC作为每秒的第一条语句解析出时间,接着的语句时间都用GxRMC中的时间,一直到下个GxRMC开始。

The sentence sequence starts with RMC

3.2 UBX-CFG-MSG
proprietary UBX message configurations format:
[class ID, message ID, frequency]
- 根据上面的3个参数,设置某条UBX消息的输出频率
- 根据上面的3个参数,用来轮训(主动读)某一条UBX消息

3.3 天线状态读取
Pin14、Pin15、Pin16 - 表示天线状态

3.4 ​​​USB Bulk传输速度计算
- Full-speed
每个frame最大可以传输19个Bulk包,每个Bulk包最大是64Bytes,所以其最大传输速率是:64 x 19 x 1000 = 1.16MB/s。
- High-speed
USB2.0在每个微帧中最大可传输13个Bulk包,每个Bulk包最大是512Bytes,而每个微帧长固定为125μs,所以其最大传输速率为:512 x 13 x 8 x 1000 = 53MB/s。

3.5 时间戳转换为UTC时间
import time
print time.asctime(time.localtime(时间戳))
print time.asctime(time.gmtime(时间戳))

3.6 NMEA语句参数解析
使用atoi()和atof()将字符串Argx转换成对应的整数和浮点数

4 Android GPS
4.1 Android Location Provider加载流程
LocationManagerService
->
loadProvidersLocked
->
config_locationProviderPackageNames
->
createAndBind - 获得后台APK Service的Binder接口

at base/packages/FusedLocation/src/com/android/location/fused/
at ./framework/java/com/qualcomm/location/izatserviceprovider/provider/IzatProviderEngine.java

4.2 Android GPS数据上报流程
at JNI com_android_server_location_GnssLocationProvider.cpp
android_location_GnssLocationProvider_init()
GnssCallback::gnssLocationCb()

at framework GnssLocationProvider.java
reportLocation()
reportNmea(long timestamp) 

at framework LocationManagerService.java
reportLocation()
handleLocationChangedLocked()

at framework GnssStatusListenerHelper.java
onNmeaReceived()

用户层回调类
GpsStatus.java - GpsStatus.NmeaListener
LocationListener.java

5 USB host抓包方法
5.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

5.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/usblog.pcap &
5)killall tcpdump
6)wireshark工具打开usblog.pcap
7)wireshark过滤:usb.src == "1.6.1" and usb.dst == "host" - 改到对应的USB bus_no.addr.ep_no

usbmon1:xHCI LF/HS/HS
usbmon2:xHCI SS

6 strace
strace -e epoll_wait -x -p $PID
strace -p $PID -tt -T -s 128 -x 2>&1 | grep "read(17"

7 URLs
NMEA data
http://www.gpsinformation.org/dale/nmea.htm

各种时间换算关系
http://leapsecond.com/java/gpsclock.htm

8 Abbreviations
8.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:Battery backed RAM
C/A码:Coarse / Acquisition Code,粗码
CNR:Carrier Noise Ratio
DR:Dead Reckoning,使用ACC和GYRO做航位推算
FLP:Fused Location Provider
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 EPO: Extended Prediction Orbit
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,时间日期信息

8.2 U-BLOX
NAV-DOP:Dilution of Precision,精度因子,U-BLOX的私有的UBX消息包
NAV-PVT:Position Velocity and Time(UTC),U-BLOX的私有的UBX消息包;fixType表示定位有没有成功标志字段,velN表示NED north velocity
RTCM:Radio Technical Commission for Maritime services,海事无线电技术委员会
u-blox M8T:Multi-constellation 8 Timing,多重星系

8.3 CarPlay
PASCD:Proprietary Apple Vehicle Speed Data,for CarPlay
PAACD:Proprietary Apple Acc Data,for CarPlay
PAGCD:Proprietary Apple Gyro Data,for CarPlay

你可能感兴趣的:(Wireless)