Android和蓝牙GPS结合的方法

这篇未完成的文章写于2016年初,两年后翻到了,贴出来。。。

1.1. Android LMS的原理

Android系统设计了一个以LocationManagerService为核心的位置管理架构提供相关的位置服务[1],以下基于Android4.4的代码展开。

 

图1 LMS原理

 

1. LocationManagerService和其客户端LocationManager。

LocationManagerService和Android Java Framework中其他Service一样由SystemServer创建并运行在system_process进程中。LocationManagerService内部将统一管理Android平台中能提供位置服务的相关模块,而LocationManager为那些需要使用位置服务的应用程序服务。LocationManager和LocationManagerService之间通过Binder进行交互

 

2. Android平台中能提供位置服务的相关模块统称为Location Provider(位置提供者,LP)。位置提供者必须实现LocationProviderInterface接口。这些接口对应的对象实例由LMS来创建和管理。在所有这些位置提供者中,Android Framework实现了其中的PassiveProvider和GpsLocationProvider。这两个LP由LMS创建并运行在system_process进程中。

 

3. 除了使用GPS定位外,系统还支持网络定位(NetworkLocation)方法来获取位置信息。这种方法大致的工作原理是,某地区的移动通信基站(Cell Tower)或无线网络AP的位置信息都已事先获取并保存在相关服务提供商的服务器上。当手机使用网络定位时,它首先向服务器查询自己所连接或搜索到的基站位置或AP的位置,然后根据信号的强度推算自己的大致位置。相比GPS定位而言,网络定位速度快,耗电少,适用于室内和室外,但精度较GPS差。Android原生代码并不提供Network Location Provider相关的功能,它一般由第三方应用厂商提供,例如Google的GMS(Google Mobile Service)包中有一个NetworkLocation.apk就提供了该功能,而国内上市的手机则使用百度公司提供的NetworkLocation_Baidu.apk。它们运行在应用程序所在的进程中。

 

4. FusedLocationProvider是一个比较特殊的LP。它本身不能提供位置信息,其内部将综合GpsLP和NetworkLP的位置信息,然后向使用者提供最符合使用者需求的数据。即它能根据使用者对电源消耗、精度两方面的要求以选择GpsLP或/和NetworkLP

作为真实的LP。同时,FusedLP能选择GpsLP或NetworkLP提供的位置信息中最好的那一个返回给使用者。简单点说,FusedLP出现之前,一个比较完善的LP客户端需要同时操作和管理GpsLP和NetworkLP,而有了FusedLP后,客户端只需要使用它即可,其余事情由FusedLP内部来管理。注意,FusedLP也由应用程序提供,它运行在FusedLocationProvider.apk所在的进程中。

 

5. GeoCodeProvider: 除了提供位置信息外,系统(借助第三方应用提供)还支持位置信息和地址信息相互转换,即得到某个地址(如国家、市区、街道名等)的位置信息(如经纬度信息),或者根据位置信息得到其对应的地址信息。由于地址和位置信息的映射关系一般也由第三方应用提供,所以LMS 和第三方应用中实现GeocodeProvider的对象交互。

 

6. libgps.so 包含了对GPS NMEA协议信息的解析, 其源代码主要位于

hardware/libhardware_legacy/gps/gps_qemu.c

NMEA是(National Marine Electronics Association )为海用电子设备制定的标准格式,是GPS接收机最通用的数据输出格式。

 

 

1.2. 通用架构设计

1.     设计原则: 低耦合,可替换

 

从上一节的AndroidLocation原理图上可以看出,GPS接入的处理在硬件抽象层(HAL)的libgps.so 对于普通的应用层App,是无法对此作出修改的。

如果直接修改HAL的代码,固然简单,但是需要拿到整个系统的源码,这种情况只能适用于特殊的机型,不属于本文通用框架的考虑范畴。

本文提出低耦合的,可以替换各种GPS来源的框架,既有利于架构分层明晰,也有利于对不同的GPS设备做对比的评测。

 

Android 处理之前提到的各种LocationProvider以外,还提供了一种模拟Location的Provider。借助这个特性,可以对LocationManager设置模拟的位置信息,从而达到不改变App层的代码,就能使用各种来源GPS的效果。

该方案的性能虽然略弱于直接修改HAL,但是贵在维护性好,扩展性好,能够满足大部分定位要求。

 

2.     设计原则:可记录,可回放

 

记录信号和事后回放是LBSApp的常用调试手段,对于不同的GPS来源,使用LocationManager的位置输出,作为统一的位置记录格式。

各个GPS Agent 可以按实际情况记录原始的位置信息。

 

3.     通用设计架构图

 

图2 通用架构图

 

LBS App 就是我们主要的基于位置的App。用于记录位置信息,使用位置信息。

 

MockLocationProvider是一个单独的App,用于提供伪装的位置服务,该位置信息则由蓝牙,COM口或者网络连接获取的GPS数据来解析得到。GPS位置信息提取之后,构造MockLocation传给LocationManager。LocationManager将该MockLocation视同真正的位置信息,提供给所有App使用。

以上两个App使我们的主要制品。尤以Mo

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值