GPS定位流程_(1)
1.1 Android定位架构
整个定位服务的架构如上图 所示。该结构共分为五层:
第一层是应用层,app层,需要定位服务的客户端。
第二层是框架层,这一层实现了系统服务,主要由Java语言来实现。
第三层是JNI层,frameworks/base/core/jni/android_location_GpsLocationProvider.cpp
JNI层只有一个文件,起到承上启下的作用。向上提供本地函数,向下加载HAL文件并调用HAL的函数。
第四层是HAL层,负责访问驱动程序执行硬件操作。HAL层相当于一个linux应用程序接口,通过open,close等操作,操作硬件设备
第五层是Kernel层,也就是Linux内核层,整个Android系统都是以Linux内核为基础的。
最下面一层是GPS的硬件模块,由驱动层来驱动工作。
1.2 GpsLocationProvider工作流程
上图 GpsLocationProvider工作流程图
JNI层是由C/C++编写的,JNI层通过JNI回调函数集与JAVA层通信,JAVA层通过native函数集与JNI通信。和GpsLP相关的JNI函数位于com_android_server_loca-tion_GpsLocationProvider.cpp中
JNI层和HAL层都是native层,JNI层和HAL层安卓的接口函数集文件(位于gps.h中)进行通信。 so是shared object的缩写,见名思义就是共享的对象,机器可以直接运行的二进制代码,是由C/C++编译成的动态库。
Java层主要文件是GpsLocationProvider.java。它通过native函数集与JNI层模块通信。
JNI层包括一个核心动态库,即libandr-oid_server.so。其中,和GpsLP相关的JNI函数位于com_android_server_loca-tion_GpsLocationProvider.cpp中。JNI层通过JNI回调函数集将GPS信息返回给Java层。
HAL层也包含一个核心动态库,其命名规范为"gps.xxx.so"。其中,"xxx"为手机所使用的硬件平台名。以笔者的Galaxy Note 2为例,对应的GPS HAL层动态库文件名为gps.exynos4.so。Android系统为GPS HAL层和GPS JNI层双向通信定义了多个接口函数集(如GpsInterface等,它们都定义在gps.h文件中),最后,GPS HAL层将和内核层中的gps驱动交互,驱动来驱动相应的GPS硬件模块。
1.3 GPS定位的实现
GPS定位框架
整个框架分为2个数据流,由上向下的控制流,由下向上的数据流。
“由下向上”:从接受到GPS信号开始到上层应用程序显示定位信息的过程。Modem->系统
“由上向下”:从客户端发起定位请求到GPS定位开启的过程;
框架主要分为Modem的天线、射频、基带、导航数据计算部分,AP侧的UART串口(硬件和驱动)、Android HAL层、Android应用层。
图3 GPS定位流程框图(由下至上的数据流)
定位流程:(由上至下的数据流)
基带射频Modem侧:
1、 射频部分对无线信号(模拟信号)进行放大滤波、模数转换成数字量;
2、 基带对数字量进行捕获,得到导航电文、伪距码、星历等数据;
3、 导航计算部分:Modem侧处理器根据上一步得到数据求得用户的经纬度;
4、 将定位信息等转换成标准数据形式(NMEA),通过串口送给系统AP侧。
系统AP侧:(与Modem侧通过QMI通信-遵循数据协议NMEA)。
1、底层通过串口读取GPS标准数据;(LinuxUART驱动);
2、根据标准输出协议NMEA解析Modem传来的GPS数据,并填写GPSLocation结构体(在HAL);
3、实现各个函数接口打开、关闭、启动、停止等。
4、GPSlocation数据上报给上层
5、安卓上层获取GPSLocation数据,获取想要的经纬度、海拔、UTC、时间等。(安卓应用层);
6、客户端显示最终的位置信息。(安卓应用层)。