Android GPS驱动

Posted 四季帆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android GPS驱动相关的知识,希望对你有一定的参考价值。

1.android定位方式

        android 定位一般有四种方法,这四种方式分别是GPS定位、WIFI定位、基站定位、AGPS定位。

1.1 Android GPS

        需要GPS硬件支持直接和卫星交互来获取当前经纬度,通过GPS方式准确度是最高的,但确定是比较耗电、从GPS模块启动到获取第一次定位数据可能需要比较长的时间、室内几乎无法使用等等;

1.2 Android Wifi定位

        根据一个固定的Wifi MAC地址通过收集到的该Wifi热点的位置然后访问网络上的定位服务以获得经纬度坐标。

1.3 Android基站定位

        基站定位一般有几种:第一种是利用手机附近的三个基站进行三角定位,由于每个基站的位置是固定的,利用电磁波在这三个基站间中转所需要时间来算出手机所在的坐标;第二种则是利用获取最近的基站的信息,其中包括基站 id、location area code、mobile country code、mobile network code和信号强度将这些数据发送到google的定位web服务里,就能拿到当前所在的位置信息,误差一般在几十米到几百米之内。其中信号强度这个数据很重要。

1.4 AGPS定位

        AGPS(AssistedGPS)辅助全球卫星定位系统是结合GSM或GPRS与传统卫星定位,利用基地台代送辅助卫星信息以缩减GPS芯片获取卫星信号的延迟时间,受遮盖的室内也能借基地台讯号弥补减轻GPS芯片对卫星的依赖度。和纯GPS、基地台三角定位比较,AGPS能提供范围更广、更省电、速度更快的定位服务,理想误差范围在10公尺以内。该技术的另一优点为首次捕获GPS信号的时间一般仅需几秒,不像GPS的首次捕获时间可能要2-3分钟。

2. Android GPS 架构

        因为linux底层驱动只需要有uart接口就可以接收到gps数据了,而android的hal层会调用linux内核层的uart驱动,只要hal层打开串口,然后read就可以了,将read出来的信息按照逗号为间隔符解析成各个字符串(语句ID、时间、经纬度等等),然后将这些信放到结构体中,将结构体上传至JNI层,上层就可以获取到GPS的具体消息了。

3. GNSS NMEA

3.1基本介绍

        Android gps hal层从串口中读取到的信息就是nmea格式的,在hal层中就是对NMEA数据进行解析,解析出时间、精度、维度等信息并保存至对应结构体。

        GNSS的全称是全球导航卫星系统(Global Navigation Satellite System),它是泛指所有的卫星导航系统,包括全球的、区域的和增强的,如美国的GPS、俄罗斯的Glonass、欧洲的Galileo、中国的北斗卫星导航系统,国际GNSS系统是个多系统、多层面、多模式的复杂组合系统。

        NMEA的全称是美国国家海洋电子协会(National Marine Electronics Association),现在是GPS导航设备统一的RTCM(Radio Technical Commission for Maritime services)标准协议。NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有GGA、GSA、GSV、RMC、VTG、GLL等。下面给出这些常用NMEA-0183语句的字段定义解释。

3.2 GP、GL、GA、GQ、GB、GN说明

GP (GPS)

GL (GLONASS)

GA (Galileo)

GQ (QZSS)

GB (Beidou)

GN (Any combination GNSS),表示使用了多个系统的卫星取得位置解算

3.3 GSV(可见卫星信息)

例:$GPGSV,3,1,09,16,26,218,19,29,29,071,38,31,66,027,33,32,40,140,24,163

字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息

字段1:本次GSV语句的总数目(1 - 3)

字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)

字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)

字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)

字段5:卫星仰角(00 - 90)度(前导位数不足则补0)

字段6:卫星方位角(00 - 359)度(前导位数不足则补0)

字段7:信噪比(00-99)dbHz

字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)

字段9:卫星仰角(00 - 90)度(前导位数不足则补0)

字段10:卫星方位角(00 - 359)度(前导位数不足则补0)

字段11:信噪比(00-99)dbHz

字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)

字段13:卫星仰角(00 - 90)度(前导位数不足则补0)

字段14:卫星方位角(00 - 359)度(前导位数不足则补0)

字段15:信噪比(00-99)dbHz

字段16:校验值($与之间的数异或后的值)

3.4 GSA( 当前卫星信息)

例:$GNGSA,A,3,16,29,31,32,1.2,1.0,0.8,134

字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息

字段1:定位模式(选择2D/3D),A=自动选择,M=手动选择

字段2:定位类型,1=未定位,2=2D定位,3=3D定位

字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

字段15:PDOP综合位置精度因子(0.5 - 99.9)

字段16:HDOP水平精度因子(0.5 - 99.9)

字段17:VDOP垂直精度因子(0.5 - 99.9)

字段18:校验值($与之间的数异或后的值)

3.5 RMC(推荐定位信息数据格式)

例:$GNRMC,082923.00,A,3901.106815,N,11712.322006,E,0.0,231121,5.8,W,A,V61

字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息

字段1:UTC时间,hhmmss.sss格式

字段2:状态,A=定位,V=未定位

字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

字段4:纬度N(北纬)或S(南纬)

字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)

字段6:经度E(东经)或W(西经)

字段7:速度,节,Knots

字段8:方位角,度

字段9:UTC日期,DDMMYY格式

字段10:磁偏角,(000 - 180)度(前导位数不足则补0)

字段11:磁偏角方向,E=东W=西

字段12: 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

字段13:校验值($与之间的数异或后的值)

3.6 GNS(定位信息)

例:$GNGNS,082923.00,3901.106815,N,11712.322006,E,AAAAA,14,1.0,60.6,-4.0,V4D

字段0:$GNGNS,语句ID,表明该语句为Global Positioning System Fix Data(GNS)GPS定位信息

字段1:UTC 时间,hhmmss.sss,时分秒格式

字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

字段3:纬度N(北纬)或S(南纬)

字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)

字段5:经度E(东经)或W(西经)

字段6:定位标识,NN - 未定位,AA - 定位Active

字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)

字段8:HDOP水平精度因子(0.5 - 99.9)

字段9:海拔高度(-9999.9 - 99999.9)单位:M(米)

字段10:地球椭球面相对大地水准面的高度 WGS84水准面划分 单位:M(米)

字段11:差分时间(从接收到差分信号开始的秒数,如果不是差分定位将为空)

字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)

字段13:校验值($与之间的数异或后的值)

3.7 GGA(定位信息)

例:$GNGGA,082923.00,3901.106815,N,11712.322006,E,1,12,1.0,60.6,M,-4.0,M,5A

字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息

字段1:UTC 时间,hhmmss.sss,时分秒格式

字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

字段3:纬度N(北纬)或S(南纬)

字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)

字段5:经度E(东经)或W(西经)

字段6:GPS状态,0=不可用(FIX NOT valid),1=单点定位(GPS FIX),2=差分定位(DGPS),3=无效PPS,4=实时差分定位(RTK FIX),5=RTK FLOAT,6=正在估算

字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)

字段8:HDOP水平精度因子(0.5 - 99.9)

字段9:海拔高度(-9999.9 - 99999.9)

字段10:海拔高度 单位:M(米)

字段11:地球椭球面相对大地水准面的高度 WGS84水准面划分

字段12:WGS84水准面划分 单位:M(米)

字段13:差分时间(从接收到差分信号开始的秒数,如果不是差分定位将为空)

字段14:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)

字段15:校验值($与之间的数异或后的值)

3.8 GLL(地理定位信息)

例:$GNGLL,4250.5589,S,14718.5084,E,092204.999,A2D

字段0:$GNGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息

字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

字段2:纬度N(北纬)或S(南纬)

字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)

字段4:经度E(东经)或W(西经)

字段5:UTC时间,hhmmss.sss格式

字段6:状态,A=定位,V=未定位

字段7:校验值($与之间的数异或后的值)

3.9 VTG(地面速度信息)

例:$GNVTG,T,M,0.0,N,0.0,K,A3D

字段0:$GPVTG,语句ID,表明该语句为Track Made Good and Ground Speed(VTG)地面速度信息

字段1:运动角度,000 - 359,(前导位数不足则补0)

字段2:T=真北参照系

字段3:运动角度,000 - 359,(前导位数不足则补0)

字段4:M=磁北参照系

字段5:水平运动速度(0.00)(前导位数不足则补0)

字段6:N=节,Knots

字段7:水平运动速度(0.00)(前导位数不足则补0)

字段8:K=公里/时,km/h

字段9:校验值($与之间的数异或后的值)

3.10 ZDA(时间和日期信息)

例:$GNZDA,160012.71,11,03,2004,-1,007D

字段0:$GNZDA,语句ID,表明该语句为Data and time(ZDA)时间和日期信息

字段1:UTC时间,hhmmss(时分秒)格式

字段2:UTC日期,日

字段3:UTC日期,月

字段4:UTC日期,年

字段5:时区

字段6:校验值($与之间的数异或后的值)

3.11 DTM(大地坐标系信息)

例:$GNDTM,P90,0000.000025,S,00000.000002,W,0.981,W8449

字段0:$GNDTM,语句ID,表明该语句为Datum(DTM)大地坐标系信息

字段1:本地坐标系代码 W84

字段2:坐标系子代码 空

字段3:纬度偏移量

字段4:纬度半球N(北半球)或S(南半球)

字段5:经度偏移量

字段6:经度半球E(东经)或W(西经)

字段7:高度偏移量

字段8:坐标系代码 W84

字段9:校验值($与之间的数异或后的值)

以上是关于Android GPS驱动的主要内容,如果未能解决你的问题,请参考以下文章

Android7.1 移植 GPS Ublox HAL

经纬度数据在模型如何运用

Android深度探索HAL与驱动开发-——第八章

Windows 平台的 GPS 中间驱动程序相当于啥?

在哪里可以找到 Android 设备驱动程序的源代码?

如何使用地理定位器确定纬度是北还是南,或者是西经还是东经?