GPS
gps用户级驱动允许你的app通过Android Location service来发布设备的物理定位及其更新
gps模块是通过接受远方卫星的三角信号来判定设备的精准的物理定位的接收设备,一旦gps设备接收到足够计算出一个精确位置的卫星数据后就会上报一个有效的定位(location)
Gps模块特别的通过UART协议连接到主机系统(卫星定位系统),但是可以使用外设的其他格式的协议,比如他们包含额外的GPIO标准的精确导航系统来进行电量控制或者这个模块获取和丢失一个方位的时候进行上报。(个人理解意思就是:gps模块通过UART协议链接,但是也包含其他协议进行功能控制或扩展)
注意:框架仅仅支持单源gps定位数据,所以不能够注册多个gps 驱动(不理解:?)
创建一个gps 驱动
驱动实现了和gps硬件的链接,沟通和响应,控制有效的定位改变,上报定位的变化给framework,创建一个gps驱动的步骤是:
- 创建一个GpsDriver 的对象实例
- 注册这个driver对象到UserDriverManager中,注册方式如下(代码都以图片方式展示,具体可以去官网复制):
- 当定位不需要使用的时候,解除定位,解除方式是:
上报定位位置(Location)
使用方法reportLocation() 上报每一个新的位置方位给Android framework。这个方法接受一个包含上报内容更新的Location对象,设置每一个上报的Location的provider(提供者)为LocationManager.GPS_PROVIDER,即:
注意:驱动应该发送来自GPS硬件的每一次更新,framework会根据app的请求标准(上报频率和间隔时长等)来过滤定位更新(即driver不会对gps改变做过滤,根据时间频率或者位置距离响应到app都是framework处理的)
下面描述了gps driver上报给framework的location属性,表明required的属性字段必须上传,不然framework会拒绝这个位置更新
required attributes(必须上传的属性字段)
Accuracy(精确度),Timestamp(时间频率),Latitude(经度),Longitude(纬度)
Optional attributes(可选属性)
Altitude(海拔),Bearing(方位),Speed(速度)
转换GPS数据到一个Location对象
Gps硬件以NMEA standard format格式转化为ASCII码的字符串上报定位信息,每一行数据是以逗号隔开的数据值列表(下面有描述,就是将上报字段以逗号为隔拼接到一块的句子),每一个gps设备可能选择上报基于NMEA协议的不同部分字段,绝大多数gps设备发送下面格式数据:
GPGGA(Fix Position)方位位置
包含位置方位,海拔,时间频率和卫星的元数据
GPGLL(Geographic Latitude/Longitude)地理经纬度
仅仅包含位置方位和时间频率
GPRMC(Recommended Minimum Navigation)推荐的最小导航数据
包含位置方位,速度,时间频率和导航元数据
例子:GPRMC格式数据如下(上面是数据格式,下面是根据上面格式写的一个实例):
下面的代码解析了GPRMC格式数据成为Location数据: