一、框架图
1.应用层
App:这个是给手机软件来使用的。
2. framework层
(1)SensorManager:
作用:
初始化并连接SensorService;
对应用层提供接口,获取sensor类型和sensor数据;
处理sensor传感器数据,转化成android可以识别的数据格式;
(2)SensorService:
作用:
根据平台动态加载hal层的库,初始化hal库;
抓取底层数据根据需要向上转发sensor数据;
3.hal层
是一套标准的接口,sensorHal是一个动态库,每当启动sensorService时,就会动态的加载sensorHal库,也就是sensorlib.so,根据不同的平台load不同的动态库。 这样就能根据不同平台的硬件设置来把这些库添加到系统中,让sensorSevice自动的匹配hal层,hal层又连接着底层驱动,也就是真正的sensor实体。
作用:
封装底层接口,向上提供统一接口;
打开sensor设备,提供相关操作函数接口;
4.kernal层
这些实体sensor在dev/input/目录生成一系列的设备节点,这些设备节点就是传感器设备节点,真正和硬件打交道的就是kernal。打交道的方式就是I2C,SPI加一些时钟以及一些IO的控制,这样就能拿到所有传感器的信息。
二、数据流程
当应用层需要获取一个传感器的数据的时候,首先会拿到sensorManager,然后向sensorManager注册一个监听sensor的接口,这样sensorManager就会和sensorService建立通信。sensorService把收到的信息发送给sensorManager, 然后sensorManager通过一系列的回调接口通知上层应用,这样上层应用就能拿到具体的数值,这些数值是经过android系统处理过的数值。
sensorService初始化的时候就挂接上所有的传感器设备,传感器发出来的值是自启的值,需要经过android系统进行转化才能被系统识别,拿到识别后的数据就会根据上层监听的个数来向监听接口发送消息,也就是发送数据,这样每一个sensor应用就会获取到数据。