【OpenHarmony】传感器轻量级服务模块架构
传感器轻量级服务模块架构
1. 模块概述
源码:https://gitee.com/openharmony/sensors_sensor_lite
1.1 功能与目标
传感器轻量级服务模块(sensors_sensor_lite)是OpenHarmony系统中提供传感器数据管理功能的核心模块。该模块的主要功能包括:
- 传感器查询:获取系统中所有可用传感器的信息列表
- 传感器控制:启用或禁用指定的传感器设备
- 数据订阅:订阅或取消订阅传感器数据
- 参数配置:设置传感器的数据采样间隔和报告间隔
- 模式设置:配置传感器的数据报告模式
该模块的目标是为上层应用提供统一的传感器数据访问接口,支持多种传感器类型,包括加速度计、陀螺仪、环境光传感器、磁力计等,实现轻量级的传感器服务框架。
1.2 系统位置
传感器轻量级服务模块在OpenHarmony系统中的位置:
- 子系统:sensors(传感器子系统)
- 模块类型:核心服务模块
- 适配系统:mini系统(轻量级系统)
- 资源占用:ROM约92KB,RAM约200KB
该模块作为传感器子系统的核心组件,位于应用层和硬件抽象层之间,为上层的传感器应用提供标准化的API接口,同时通过HDI(硬件设备接口)与底层传感器驱动进行交互。
1.3 设计思路与模式
设计思路:
- 采用分层架构设计,将接口层、服务层和实现层分离
- 使用代理模式实现客户端与服务端的解耦
- 采用回调机制实现异步数据推送
- 支持多用户并发访问,通过回调链表管理多个订阅者
设计模式:
- 代理模式:SensorAgentProxy作为客户端代理,封装与服务的通信细节
- 工厂模式:通过NewSensorInterfaceInstance()创建传感器接口实例
- 观察者模式:通过回调函数实现传感器数据的事件通知
- 单例模式:传感器服务采用单例模式确保全局唯一性
2. 模块结构
2.1 源文件与头文件
2.1.1 框架层(frameworks)
- sensor_agent_proxy.h:传感器代理头文件,定义代理接口和数据结构
- sensor_agent_proxy.c:传感器代理实现,处理客户端与服务端的通信
- sensor_agent_client.c:传感器客户端实现
- sensor_agent.c:传感器代理入口函数实现
2.1.2 接口层(interfaces)
- sensor_agent.h:传感器代理公共API接口定义
- sensor_agent_type.h:传感器数据类型定义,包括传感器信息、事件、用户等结构体
2.1.3 服务层(services)
- sensor_service.h:传感器服务接口定义
- sensor_service_impl.h:传感器服务实现接口
- sensor_service.c:传感器服务实现,处理IPC调用
- sensor_service_impl.c:传感器服务具体实现,与HDI层交互
- proc.c:进程管理相关实现
2.2 类、结构体、函数与方法
2.2.1 主要数据结构
SensorInfo结构体:
typedef struct SensorInfo {char sensorName[SENSOR_NAME_MAX_LEN]; // 传感器名称char vendorName[SENSOR_NAME_MAX_LEN]; // 厂商名称char firmwareVersion[VERSION_MAX_LEN]; // 固件版本char hardwareVersion[VERSION_MAX_LEN]; // 硬件版本int32_t sensorTypeId; // 传感器类型IDint32_t sensorId; // 传感器IDfloat maxRange; // 最大测量范围float precision; // 精度float power; // 功耗
} SensorInfo;
SensorEvent结构体:
typedef struct SensorEvent {int32_t sensorTypeId; // 传感器类型IDint32_t version; // 算法版本int64_t timestamp; // 时间戳uint32_t option; // 数据选项int32_t mode; // 报告模式uint8_t *data; // 传感器数据uint32_t dataLen; // 数据长度
} SensorEvent;
SensorUser结构体:
typedef struct SensorUser {char name[SENSOR_NAME_MAX_LEN]; // 用户名称RecordSensorCallback callback; // 回调函数UserData *userData; // 用户数据
} SensorUser;
2.2.2 主要函数接口
公共API函数:
GetAllSensors(SensorInfo **sensorInfo, int32_t *count)
:获取所有传感器信息SubscribeSensor(int32_t sensorTypeId, SensorUser *user)
:订阅传感器数据UnsubscribeSensor(int32_t sensorTypeId, SensorUser *user)
:取消订阅传感器数据ActivateSensor(int32_t sensorTypeId, SensorUser *user)
:激活传感器DeactivateSensor(int32_t sensorTypeId, SensorUser *user)
:停用传感器SetBatch(int32_t sensorTypeId, SensorUser *user, int64_t samplingInterval, int64_t reportInterval)
:设置批处理参数SetMode(int32_t sensorTypeId, SensorUser *user, int32_t mode)
:设置报告模式
服务端实现函数:
GetAllSensorsImpl()
:获取传感器信息实现ActivateSensorImpl()
:激活传感器实现DeactivateSensorImpl()
:停用传感器实现SubscribeSensorImpl()
:订阅传感器实现UnsubscribeSensorImpl()
:取消订阅实现SetBatchImpl()
:设置批处理实现SetModeImpl()
:设置模式实现
2.2.3 继承与多态
该模块主要使用C语言实现,通过结构体组合和函数指针实现类似面向对象的特性:
- SensorFeatureApi结构体:继承自INHERIT_SERVER_IPROXY,提供服务器代理功能
- SensorService结构体:继承自INHERIT_SERVICE和INHERIT_IUNKNOWNENTRY,提供服务和接口功能
- 函数指针:通过函数指针实现多态,如RecordSensorCallback回调函数
2.2.4 类图
2.3 模块内部依赖框图
3. 模块间交互
3.1 交互描述
与上层应用的交互:
- 通过标准C API接口提供传感器数据访问能力
- 支持异步回调机制,实时推送传感器数据
- 提供统一的错误处理和状态管理
与系统服务的交互:
- 通过SAMGR(系统能力管理)注册服务
- 使用IPC(进程间通信)机制与客户端通信
- 支持多进程并发访问
与硬件抽象层的交互:
- 通过HDI(硬件设备接口)访问底层传感器驱动
- 支持条件编译,适配不同的硬件平台
- 提供传感器数据的标准化处理
异步处理机制:
- 使用回调函数实现异步数据推送
- 通过IPC的异步消息机制处理数据分发
- 支持多线程环境下的并发访问
事件驱动机制:
- 传感器数据变化触发事件
- 通过回调链表管理多个订阅者
- 支持事件的注册、注销和分发
3.2 外部依赖框图
4. 状态机转换图
4.1 状态机模型
传感器服务模块的状态机主要管理传感器的生命周期和数据处理状态:
主要状态:
- 未初始化状态:模块启动前的状态
- 已初始化状态:模块已加载但传感器未激活
- 传感器激活状态:传感器已激活,可以接收数据
- 数据订阅状态:有客户端订阅传感器数据
- 数据报告状态:正在向客户端推送数据
- 错误状态:发生错误时的状态
4.2 状态机切换规则
状态切换条件:
- 初始化:模块加载时从未初始化状态转换到已初始化状态
- 传感器激活:调用ActivateSensor时从已初始化状态转换到传感器激活状态
- 数据订阅:调用SubscribeSensor时从传感器激活状态转换到数据订阅状态
- 数据报告:传感器数据到达时从数据订阅状态转换到数据报告状态
- 错误处理:任何操作失败时转换到错误状态
事件触发:
- 系统事件:模块加载、卸载
- 用户事件:API调用(激活、订阅、取消订阅等)
- 硬件事件:传感器数据到达、硬件错误
- 定时事件:数据报告超时
4.3 状态机转换图
5. 接口设计
5.1 公共接口
5.1.1 传感器信息查询接口
GetAllSensors
int32_t GetAllSensors(SensorInfo **sensorInfo, int32_t *count);
- 功能:获取系统中所有传感器的信息
- 参数:
sensorInfo
:输出参数,传感器信息数组指针count
:输出参数,传感器数量
- 返回值:成功返回0,失败返回错误码
- 异常处理:参数为空时返回SENSOR_ERROR_INVALID_PARAM
5.1.2 传感器控制接口
ActivateSensor
int32_t ActivateSensor(int32_t sensorTypeId, SensorUser *user);
- 功能:激活指定的传感器
- 参数:
sensorTypeId
:传感器类型IDuser
:传感器用户信息
- 返回值:成功返回0,失败返回错误码
- 异常处理:传感器ID无效时返回SENSOR_ERROR_INVALID_ID
DeactivateSensor
int32_t DeactivateSensor(int32_t sensorTypeId, SensorUser *user);
- 功能:停用指定的传感器
- 参数:同ActivateSensor
- 返回值:成功返回0,失败返回错误码
5.1.3 数据订阅接口
SubscribeSensor
int32_t SubscribeSensor(int32_t sensorTypeId, SensorUser *user);
- 功能:订阅传感器数据
- 参数:
sensorTypeId
:传感器类型IDuser
:包含回调函数的用户信息
- 返回值:成功返回0,失败返回错误码
- 异常处理:回调函数为空时返回SENSOR_ERROR_INVALID_PARAM
UnsubscribeSensor
int32_t UnsubscribeSensor(int32_t sensorTypeId, SensorUser *user);
- 功能:取消订阅传感器数据
- 参数:同SubscribeSensor
- 返回值:成功返回0,失败返回错误码
5.1.4 参数配置接口
SetBatch
int32_t SetBatch(int32_t sensorTypeId, SensorUser *user, int64_t samplingInterval, int64_t reportInterval);
- 功能:设置传感器的采样间隔和报告间隔
- 参数:
sensorTypeId
:传感器类型IDuser
:用户信息samplingInterval
:采样间隔(纳秒)reportInterval
:报告间隔(纳秒)
- 返回值:成功返回0,失败返回错误码
SetMode
int32_t SetMode(int32_t sensorTypeId, SensorUser *user, int32_t mode);
- 功能:设置传感器的数据报告模式
- 参数:
sensorTypeId
:传感器类型IDuser
:用户信息mode
:报告模式(SENSOR_DEFAULT_MODE等)
- 返回值:成功返回0,失败返回错误码
5.2 数据交换接口
5.2.1 传感器数据类型
SensorTypeId枚举:
typedef enum SensorTypeId {SENSOR_TYPE_ID_ACCELEROMETER = 1, // 加速度传感器SENSOR_TYPE_ID_GYROSCOPE = 2, // 陀螺仪SENSOR_TYPE_ID_AMBIENT_LIGHT = 5, // 环境光传感器SENSOR_TYPE_ID_MAGNETIC_FIELD = 6, // 磁力计SENSOR_TYPE_ID_BAROMETER = 8, // 气压计SENSOR_TYPE_ID_TEMPERATURE = 9, // 温度传感器// ... 更多传感器类型
} SensorTypeId;
SensorMode枚举:
typedef enum SensorMode {SENSOR_DEFAULT_MODE = 0, // 默认模式SENSOR_REALTIME_MODE = 1, // 实时模式SENSOR_ON_CHANGE = 2, // 变化时报告SENSOR_ONE_SHOT = 3, // 单次报告SENSOR_FIFO_MODE = 4, // FIFO模式
} SensorMode;
5.2.2 回调函数接口
RecordSensorCallback
typedef void (*RecordSensorCallback)(SensorEvent *event);
- 功能:传感器数据回调函数
- 参数:
event
- 传感器事件数据 - 说明:当传感器数据到达时,系统会调用此回调函数
5.3 接口调用时序图
6. 总结
传感器轻量级服务模块作为OpenHarmony系统传感器子系统的核心组件,采用了分层架构设计,通过代理模式实现了客户端与服务端的解耦,使用回调机制支持异步数据推送。该模块具有良好的可扩展性和可维护性,能够满足轻量级系统对传感器服务的需求。
模块的主要特点包括:
- 轻量级设计:资源占用小,适合mini系统
- 标准化接口:提供统一的C API接口
- 异步处理:支持回调机制和事件驱动
- 多用户支持:支持多个客户端并发访问
- 错误处理:完善的错误处理和状态管理机制
该模块为上层应用提供了完整的传感器数据访问能力,是构建传感器相关应用的重要基础组件。