当前位置: 首页 > news >正文

Android 10 Gnss数据流程

Android 10 Gnss数据流程

一、LocationManager 数据成员:

GnssMeasurementCallbackTransport:高精度定位数据回调对象的封装,回调对象为GnssMeasurementsEvent.Callback,传递的对象为是GnssMeasurement,包含单颗 GNSS 卫星的原始观测值(如伪距、载波相位、多普勒频移)及计算参数(卫星 ID、信号强度、时间戳等),为 RTK/PPK 等高精度算法提供基础数据。

frameworks/base/location/java/android/location/GnssMeasurementCallbackTransport.java
frameworks/base/location/java/android/location/GnssMeasurement.java
//通过addGnssMeasurementsListener注册到LocationManagerService中

GnssNavigationMessageCallbackTransport:GnssNavigationMessage.Callback对象的封装,GNSS 框架中用于传递卫星导航原始数据(如星历、历书等)

//base/location/java/android/location/GnssNavigationMessageCallbackTransport.java
//base/location/java/android/location/GnssNavigationMessage.java
//通过addGnssNavigationMessageListener注册到LocationManagerService中

BatchedLocationCallbackTransport:将连续的单点位置更新聚合为批次数据(List),通过单次回调传递,减少跨进程通信开销,根据应用需求(如运动状态、精度要求)自动调整批次大小和上报频率

//base/location/java/android/location/BatchedLocationCallbackTransport.java
//通过addGnssBatchingCallback注册到LocationManagerService中

GnssStatusListenerTransport:LocationManagerService 回调接口,接收GNSS状态(onGnssStarted、onGnssStopped、onFirstFix、onSvStatusChanged)及Nmea数据

//base/location/java/android/location/IGnssStatusListener.aidl

mGnssStatusListeners:Gnss状态回调,代码如下

//base/location/java/android/location/LocationManager.java
public boolean registerGnssStatusCallback(@NonNull GnssStatus.Callback callback, @Nullable Handler handler){boolean result;synchronized (mGnssStatusListeners) {if (mGnssStatusListeners.get(callback) != null) {return true;}//为什么这么设计?每注册一次回调都创建一个GnssStatusListenerTransport(IGnssStatusListener.Stub)并注册到LocationManagerService中,如果一个Manager注册多个回调会导致与Service建立多个Binder通讯通道,如果回调数据量比较大或者通讯比较频繁的话这样设计非常占用binder资源try {GnssStatusListenerTransport transport = new GnssStatusListenerTransport(callback, handler);result = mService.registerGnssStatusCallback(transport, mContext.getPackageName());if (result) {mGnssStatusListeners.put(callback, transport);}}catch (RemoteException e) {throw e.rethrowFromSystemServer();}}return result;
}

mGnssNmeaListeners:Nmea数据回调`

//base/location/java/android/location/OnNmeaMessageListener.java

mGpsStatusListeners:GPS状态回调,与Gnss状态回调类似少一个 onSatelliteStatusChanged(GnssStatus status) 接口

二、服务端LocationManagerService(以Nmea数据为例)

源码路径:base/services/core/java/com/android/server/LocationManagerService.java

  1. 初始化GnssLocationProvider
     private void initializeProvidersLocked() {//初始化provider...LocationProvider gnssProviderManager = new LocationProvider(GPS_PROVIDER, true);//监听GNSS状态及数据,更新Service内的信息,如mLastLocationGnssLocationProvider gnssProvider = new GnssLocationProvider(mContext,gnssProviderManager,mHandler.getLooper());mGnssStatusProvider = gnssProvider.getGnssStatusProvider();...}
    
  2. Nmea注册回调

    //注册回调,在GnssStatusListenerHelper中管理客户端(Stub)相关接口
    public boolean registerGnssStatusCallback(IGnssStatusListener listener, String packageName) {return addGnssDataListener(listener, packageName, "GnssStatusListener",mGnssStatusProvider, mGnssStatusListeners,this::unregisterGnssStatusCallback);
    }
    
  3. GnssLocationProvider

    GnssLocationProvider主要通过JNI处理与HAL层交互逻辑。GnssLocationProvider通过class_init_native()初始化jni,jni 通过android_location_GnssLocationProvider_set_gps_service_handle方法判断当前HAL层使用那个版本,从2.0获取Service,如果获取不到认为不支持2.0,继续试获取1.1的服务,如果获取不到默认使用1.0服务。

    查看当前系统运行的是那个服务如下:

    msm8953_64:/ # ps -A| grep gnss
    gps            558     1  285176   4516 binder_ioctl        0 S android.hardware.gnss@2.0-service-qti
    msm8953_64:/ #
    
    //base/services/core/java/com/android/server/location/GnssLocationProvider.java
    //base/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
  4. HAL层

    接口:hardware\interfaces\gnss\2.0
    服务:hardware\qcom\gps

http://www.lryc.cn/news/582205.html

相关文章:

  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频质量评估与智能修复(337)
  • uniapp的navigator跳转功能
  • STEP 7 MicroWIN SMART V2.2 的详细安装步骤及注意事项
  • 【世纪龙科技】汽车钣金虚拟仿真教学实训软件
  • 源码推送到gitee码云仓库
  • 华为OD 二维伞的雨滴效应
  • JDBC 注册驱动的常用方法详解
  • Spring Data JPA基本方法调用规律
  • RK3588 Android SDK 实战全解析 —— 架构、原理与开发关键点
  • linux qt 使用log4cpp库
  • 对象存储-OSS
  • centos停止维护后更换yum源
  • Centos Docker 安装(100%成功)
  • 腾讯云 CDN 不支持 WebSocket 的现状与华为云 CDN 的替代方案-优雅草卓伊凡
  • 【DPDK应用篇】事件驱动架构:eventdev异步处理模型的设计与实现
  • 循环移位网络设计
  • ubuntu server系统 安装宝塔
  • 【build.gradle中的各种jdk或者是jvm,sdk版本作用区别,详细说明】
  • RKAndroid11-系统设置新增开关选项
  • Kotlin流操作符简介
  • 力扣网编程274题:H指数之计数排序(中等)
  • 分布式推客系统架构设计:从微服务到高性能计算的实践路径
  • 安装 Elasticsearch IK 分词器
  • Coco AI 实战(一):Coco Server Linux 平台部署
  • 前端技术博客汇总文档
  • 万物智联时代启航:鸿蒙OS重塑全场景开发新生态
  • 【读代码】深度解析TEN VAD:实时语音活动检测的高性能开源解决方案
  • 一份激光雷达农业数据的分析
  • 【Linux | 网络】网络编程套接字
  • [netty5: LifecycleTracer ResourceSupport]-源码分析