如果想对Android的整个框架有一个更深层次的感性认识,我们还需要抓住一个点去研究一下。Android按照模块分成很多个系统,比如Audio,Video Out,Camera,Phone,WIFI,Blue Tooth,Light,Battery,Input,Codec,3D accelerator,Vibrator,Sensor,Alarm,Gps。
分析了一下这些模块,发现GPS模块是相对简单的一个模块,比较适合拿来做初学的分析,这一期我们就来分析一下Android中GPS的工作原理,然后我们做几个和GPS相关的实验。
GPS(Global Positioning System), 即全球定位系统,它是一个由覆盖全球的24颗卫星组成的卫星系统。其目的是在全球范围内对地面和空中目标进行准确定位和监测。随着全球性空间定位信息应用的日益广泛,GPS提供的全时域、全天候、高精度定位服务将给空间技术、地球物理、大地测绘、遥感技术、交通调度、军事作战以及人们的日常生活带来巨大的变化和深远的影响。
我们手机中内置的是一个GPS信号接收机,通过接收卫星产生的测距信号确定三维位置。从设备驱动的角度来看GPS接收机,就相当于一个定时输出的UART,所以从驱动的角度来讲想对简单,可以看做一个只有输出没有输出的驱动就好了。它的输出格式为NMEA 0183。
NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association )为海用电子设备制定的标准格式。目前业已成了GPS导航设备统一的RTCM(Radio Technical Commission for Maritime services)标准协议。
NMEA-0183数据实例1如下:
$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,M,,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,19,13,28,070,17,26,23,252,,04,14,186,14*79
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092750.000,A,5321.6802,N,00630.3372,W,0.02,31.66,280511,,,A*43
$GPGGA,092751.000,5321.6802,N,00630.3371,W,1,8,1.03,61.7,M,55.3,M,,*75
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,16,13,28,070,17,26,23,252,,04,14,186,15*77
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45
驱动程序通过解析NMEA数据可以分析出当前的坐标信息,移动信息和卫星信息,然后通过Android的结构框架逐层上报,最后我们的APP就能获得当前的位置信息。
下面这张图列出了在Android系统中GPS系统是怎么实现的:
整个定位服务的架构结构共分为四层:
最上面是应用层,即 android.location 包中包含的内容,是以 Java 语言提供的 API。
第二层是框架层,这一层包含了系统服务的实现,主要由 Java 语言来实现。
第三层是共享库层,本层由 C 以及 C++ 语言实现 , 框架层与共享库层使用 JNI 进行衔接。
最下面一层是 Linux 内核层 , 整个 Android 系统都是以 Linux 内核为基础的。
从上至下它们是逐层依赖的关系,每层依赖下面一层完成其所需提供的服务。
下面就要每个层次的开始分析,这里推荐几篇大神写的文章,讲得非常详细:
和菜鸟一起学android4.0.3源码之硬件gps简单移植
http://www.cnblogs.com/LiaoHao/p/3298511.html
Android 系统中 Location Service 的实现与架构
http://www.ibm.com/developerworks/cn/opensource/os-cn-android-location/
看完上面的两篇文章后我们来总结一下,当硬件接受到位置更新之后,为了通知这个信息,整个调用关系是如何的 ( 为了描述方便,下文将 com_android_server_location_GpsLocationProvider.cpp 简称为 GpsLocationProvider.cpp)。
当硬件检测到有位置更新之后,最初调用的是 GpsLocationProvider.cpp 中的 location_callback 函数。
location_callback 函数中对应的是调用 GpsLocationProvider.java 中的 reportLocation 方法。
GpsLocationProvider.java 中的 reportLocation 方法会调用 ILocationManager 的 reportLocation 方法,然后是调用 LocationManagerService 的 reportLocation 方法。
LocationManagerService 的 reportLocation 方法中会对 LocationWorkerHandler 发送消息 MESSAGE_LOCATION_CHANGED。该消息在 LocationWorkerHandler 的 handleMessage 方法中被处理。处理方法中会调用 LocationProviderInterface 的 updateLocation 方法和 LocationManagerService 的 handleLocationChangedLocked 的方法。前者对于 Gps 模块来说就是调用 GpsLocationProvider 的 updateLocation 方法。
GpsLocationProvider 的 updateLocation 方法会对 ProviderHandler 发送消息 UPDATE_LOCATION,该消息在 ProviderHandler 的 handler 方法中被处理,处理的方法是调用 handleUpdateLocation 方法,该方法中会调用 native_inject_location 方法以注入。
而 LocationManagerService 的 handleLocationChangedLocked 的方法会将最新的位置存放到 mLastKnownLocation 中。至此,便可以通过 LocationManagerService 的 getLastKnownLocation 方法获取到最新更新的位置信息了。
定位服务实现中牵涉到的文件一览
路径 说明
frameworks/base/location/java/android 包含提供给应用开发的 API
frameworks/base/services/java/com/android/server 包含 LocationManagerService.java
frameworks/base/core/java/android/os 包含 ServiceManager.java
frameworks/base/core/java/android/app 包含 ContextImpl.java
system/core/rootdir 包含 init.rc
frameworks/base/services/java/com/android/server/location 包含 LocationManagerService.java
frameworks/base/services/jni 包含 com_android_server_location_GpsLocationProvider.cpp
hardware/libhardware/include/hardware 包含了 HAL 层的接口
hardware/qcom/gps 包含了对于高通公司的 Gps 模块的实现

第十八期 Android GPS原理分析《手机就是开发板》相关推荐

  1. ZYNQ7000学习(十八)多路 PWM 原理分析以及实现试验

    多路 PWM 原理分析以及实现试验 基本原理(参考 http͗//www͘fpga4fun͘com/PWM_D_C͘html) PWM_(Pulse_Width_Modulation) A PWM t ...

  2. CSDN 编程竞赛十八期题解

    竞赛总览 CSDN 编程竞赛十八期:比赛详情 (csdn.net) 感觉这次竞赛的题目有点偏数学了,尤其是第三道题,输入+输出就完事了,答案是一个数学公式. 竞赛题解 题目1.单链表排序 单链表的节点 ...

  3. FME模板兴趣班第十八期(面遮挡处理) 任务小结

    班长欣欣 一.题目说明 对面进行遮挡处理,处理要求如下: 多个面之间存在压盖,要求压盖区域用Level高的遮挡Level低的,并将压盖区域从Level低的面中擦除.如下图所示: 面1.面2.面3 的L ...

  4. Android LayoutInflater原理分析,带你一步步深入了解View

    Android视图绘制流程完全解析,带你一步步深入了解View(一) 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12921889 ...

  5. 发布 项目_第十八期科创基金项目发布会圆满结束

    第十八期科创基金项目发布会圆满结束 贺电!贺电! 电子信息工程学院发来贺电:第十八届科创基金项目发布会圆满结束啦!感谢导师们的支持.现场同学的热情参与和科协朋友后勤服务! NUAA 即使是寒冷的冬天也 ...

  6. android 实例源码解释,Android Handler 原理分析及实例代码

    Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler的原理 Handler使 ...

  7. 鲁大师电动车智能化测评报告第十八期:加量降价,九号完成产品破圈?

    鲁大师第十八期智能化电动车测评排行榜数据来源于鲁大师智慧实验室,测评的车型均为市面上主流品牌的主流车型.截止目前,鲁大师智能化电动车测评的车型高达90余种,且还在不断增加和丰富中. 1. 测评依据 鲁 ...

  8. CSDN 编程竞赛二十八期题解

    竞赛总览 CSDN 编程竞赛二十八期:比赛详情 (csdn.net) 本期竞赛的题目都很简单,但是非常考验读题和编码速度.这一次没有遇到bug,竞赛体验较好. 竞赛题解 题目1.小Q的鲜榨柠檬汁 团建 ...

  9. COS访谈第十八期:陈天奇

    COS访谈第十八期:陈天奇 [COS编辑部按] 受访者:陈天奇      采访者:何通   编辑:王小宁 简介:陈天奇,华盛顿大学计算机系博士生,研究方向为大规模机器学习.他曾获得KDD CUP 20 ...

最新文章

  1. 如果有电脑——计算机达人成长之路(36)
  2. 第十六届全国大学智能车竞赛全国总决赛竞速组别成绩与奖项
  3. vs2008调试c#网页时出现“加载配置文件时出错: 未能映射路径'/' 错误 .
  4. spring——使用注解声明式事务整合jdbc——GRUD
  5. 在sql中将表建在别的构件中用什么语句_SQL实战
  6. Centos 6.6 安装
  7. 线程超时 php-fpm,php-fpm线程僵死导致网站无响应
  8. linux平台下MongoDB安装和环境搭建及踩过的坑
  9. 一篇搞定导航守卫(vue-router源码学习)
  10. 全球第二和第四大航运公司加入物流巨头Maersk的区块链平台
  11. Sql Server 数据库出现“可疑”的解决办法
  12. html广告清理,谷歌浏览器插件-清除CSDN广告
  13. syslog工具_INAV:一款专用的日志审查导航工具
  14. [附源码]java毕业设计景区门票系统
  15. U盘里面的文件夹变成文件也打不开文件的寻回方法
  16. 聊聊Java面向对象(OOP)
  17. 小程序开发学习一:开发语言解析
  18. 2.系统发生树构建(非加权分组平均法、邻接法python实现)
  19. 论颈椎病与架构师的关系
  20. python如何赋值给元组_【Python 1-9】Python手把手教程之——元组和元组的使用技巧...

热门文章

  1. 基于UDS服务的BootLoader架构和刷写流程
  2. WIFI系列协议--802.11i--介质访问控制(MAC)安全性增强
  3. 陕西计算机在职研究生院校排名,西安在职研究生院校
  4. 携创教育:函授本科全国承认吗?成人高考学历含金量是不是很低?
  5. 抖音小店无货源玩法分享(一)开店前准备,核心思路奉上
  6. echarts 报错Cannot read properties of undefined (reading ‘coord‘)
  7. hr竟主动给这位测试小姐姐涨工资,她是怎么做到的?
  8. 【完美解决】MyBatis中怎么查询某个时间段内的数据
  9. 新一代硬件安全-自序
  10. 跟明汯投资学习适合散户的量化投资策略和方法!