【OpenHarmony】医疗传感器模块架构
医疗传感器模块架构
1. 模块概述
源码:https://gitee.com/openharmony/sensors_medical_sensor
1.1 功能与目标
主要功能:
医疗传感器模块是OpenHarmony系统传感器子系统的核心组件,专门用于处理健康类传感器数据,主要功能包括:
- 健康数据采集:采集人体心率、心电图、设备佩戴情况等健康相关数据
- 传感器管理:管理PPG(光电容积描记)、ECG(心电图)、心率、佩戴检测等医疗传感器
- 数据预处理:对原始传感器数据进行滤波、校准和预处理
- 算法集成:集成相关健康算法,提供智能分析能力
- 权限管理:管理健康数据访问权限,确保数据安全
- 数据上报:通过回调机制向应用层上报处理后的健康数据
- 生命周期管理:管理传感器的启用、禁用和数据订阅生命周期
使用场景:
- 心率监测和健康追踪
- 心电图数据采集和分析
- 设备佩戴状态检测
- 健康数据统计和分析
- 医疗设备数据采集
- 健康应用开发
1.2 系统位置
系统架构位置:
医疗传感器模块位于OpenHarmony系统的base/sensors
子系统下,是传感器子系统的重要组成部分。
模块关系:
- 上层对接:为应用层提供统一的医疗传感器API
- 下层对接:对接HDF框架和传感器驱动模型
- 横向协作:与权限管理、系统能力管理、IPC通信等模块协作
- 系统集成:集成到系统能力管理器中,提供系统级医疗传感器服务
核心模块地位:
该模块是传感器子系统的核心模块,专门处理健康类传感器数据,与传统传感器区分开来单独实现,承担着健康数据采集和处理的重要职责。
1.3 设计思路与模式
设计思路:
- 分层架构设计:采用Framework-Service-HDI分层架构,职责清晰
- 插件化设计:支持不同类型医疗传感器的插件化集成
- 数据驱动设计:基于传感器数据流进行实时处理和上报
- 权限控制设计:严格控制健康数据访问权限
- 异步处理机制:采用异步回调机制处理传感器数据
- 生命周期管理:完善的传感器生命周期管理机制
设计模式:
- 单例模式:MedicalSensorManager、ClientInfo等核心组件采用单例模式
- 观察者模式:通过回调机制实现数据订阅和通知
- 工厂模式:传感器对象的创建和管理
- 适配器模式:HDI连接适配器支持不同硬件接口
- 代理模式:服务代理模式实现跨进程通信
- 策略模式:不同传感器类型采用不同的处理策略
1.4 系统框图
2. 模块结构
2.1 源文件与头文件
核心接口文件:
医疗传感器类型定义:
interfaces/native/include/medical_native_type.h
- 医疗传感器数据类型定义interfaces/native/include/medical_native_impl.h
- 医疗传感器接口实现interfaces/plugin/include/medical_js.h
- JavaScript接口定义interfaces/plugin/include/medical_napi_utils.h
- NAPI工具类
服务端组件:
services/medical_sensor/include/medical_sensor_service.h
- 医疗传感器服务services/medical_sensor/include/medical_sensor_manager.h
- 医疗传感器管理器services/medical_sensor/include/medical_sensor_data_processer.h
- 数据处理器services/medical_sensor/include/client_info.h
- 客户端信息管理
客户端组件:
frameworks/native/medical_sensor/include/medical_sensor_service_client.h
- 服务客户端frameworks/native/medical_sensor/include/medical_sensor_data_channel.h
- 数据通道frameworks/native/medical_sensor/include/medical_sensor_client_stub.h
- 客户端存根
HDI连接组件:
services/medical_sensor/hdi_connection/interface/include/sensor_hdi_connection.h
- HDI连接接口services/medical_sensor/hdi_connection/hardware/include/hdi_service_impl.h
- HDI服务实现services/medical_sensor/hdi_connection/adapter/include/hdi_connection.h
- HDI连接适配器
2.2 类、结构体、函数与方法
核心类定义:
MedicalSensorService类
class MedicalSensorService : public SystemAbility, public MedicalSensorServiceStub {DECLARE_SYSTEM_ABILITY(MedicalSensorService)
public:explicit MedicalSensorService(int32_t systemAbilityId, bool runOnCreate = false);virtual ~MedicalSensorService() = default;void OnDump() override;void OnStart() override;void OnStop() override;int Dump(int fd, const std::vector<std::u16string> &args) override;ErrCode EnableSensor(uint32_t sensorId, int64_t samplingPeriodNs, int64_t maxReportDelayNs) override;ErrCode DisableSensor(uint32_t sensorId) override;ErrCode SetOption(uint32_t sensorId, uint32_t opt) override;int32_t GetSensorState(uint32_t sensorId) override;ErrCode RunCommand(uint32_t sensorId, uint32_t cmdType, uint32_t params) override;std::vector<MedicalSensor> GetSensorList() override;ErrCode TransferDataChannel(const sptr<MedicalSensorBasicDataChannel> &sensorBasicDataChannel,const sptr<IRemoteObject> &sensorClient) override;ErrCode DestroySensorChannel(sptr<IRemoteObject> sensorClient) override;void ProcessDeathObserver(const wptr<IRemoteObject> &object);private:MedicalSensorServiceState state_;std::mutex serviceLock_;std::mutex sensorsMutex_;std::mutex sensorMapMutex_;std::vector<MedicalSensor> sensors_;std::unordered_map<uint32_t, MedicalSensor> sensorMap_;SensorHdiConnection &sensorHdiConnection_;ClientInfo &clientInfo_;MedicalSensorManager &sensorManager_;FlushInfoRecord &flushInfo_;sptr<MedicalSensorDataProcesser> sensorDataProcesser_;sptr<ReportDataCache> reportDataCache_;sptr<IRemoteObject::DeathRecipient> clientDeathObserver_;
};
MedicalSensorManager类
class MedicalSensorManager : public Singleton<MedicalSensorManager> {
public:bool SetBestSensorParams(uint32_t sensorId, int64_t samplingPeriodNs, int64_t maxReportDelayNs);bool ResetBestSensorParams(uint32_t sensorId);ErrCode SaveSubscriber(uint32_t sensorId, uint32_t pid, int64_t samplingPeriodNs, int64_t maxReportDelayNs);void StartDataReportThread();MedicalSensorBasicInfo GetSensorInfo(uint32_t sensorId, int64_t samplingPeriodNs, int64_t maxReportDelayNs);bool IsOtherClientUsingSensor(uint32_t sensorId, int32_t clientPid);ErrCode AfterDisableSensor(uint32_t sensorId);void InitSensorMap(std::unordered_map<uint32_t, MedicalSensor> &sensorMap,sptr<MedicalSensorDataProcesser> dataProcesser,sptr<ReportDataCache> dataCache);uint32_t GetSensorFlag(uint32_t sensorId);void GetPackageNameFromUid(int32_t uid, std::string &packageName);private:SensorHdiConnection &sensorHdiConnection_;ClientInfo &clientInfo_;std::thread dataThread_;sptr<MedicalSensorDataProcesser> sensorDataProcesser_;sptr<ReportDataCache> reportDataCache_;std::unordered_map<uint32_t, MedicalSensor> sensorMap_;std::mutex sensorMapMutex_;
};
MedicalSensorServiceClient类
class MedicalSensorServiceClient : public Singleton<MedicalSensorServiceClient> {
public:std::vector<MedicalSensor> GetSensorList();int32_t EnableSensor(uint32_t sensorId, int64_t samplingPeroid, int64_t maxReportDelay);int32_t DisableSensor(uint32_t sensorId);int32_t RunCommand(uint32_t sensorId, int32_t cmdType, int32_t parms);int32_t TransferDataChannel(sptr<MedicalSensorDataChannel> sensorDataChannel);int32_t DestroyDataChannel();void ProcessDeathObserver(const wptr<IRemoteObject> &object);int32_t SetOption(uint32_t sensorId, uint32_t opt);private:int32_t InitServiceClient();void UpdateSensorInfoMap(uint32_t sensorId, int64_t samplingPeroid, int64_t maxReportDelay);void DeleteSensorInfoItem(uint32_t sensorId);bool IsValidSensorId(uint32_t sensorId);std::mutex clientMutex_;sptr<IRemoteObject::DeathRecipient> serviceDeathObserver_;sptr<IMedicalSensorService> afeServer_;std::vector<MedicalSensor> afeList_;sptr<MedicalSensorDataChannel> dataChannel_;sptr<MedicalSensorClientStub> afeClientStub_;std::mutex mapMutex_;std::map<uint32_t, MedicalSensorBasicInfo> sensorInfoMap_;
};
重要结构体:
MedicalSensorInfo结构体
typedef struct MedicalSensorInfo {char sensorName[AFE_NAME_MAX_LEN2]; /**< Sensor name */char vendorName[AFE_NAME_MAX_LEN2]; /**< Sensor vendor */char firmwareVersion[VERSION_MAX_LEN]; /**< Sensor firmware version */char hardwareVersion[VERSION_MAX_LEN]; /**< Sensor hardware version */int32_t sensorTypeId; /**< Sensor type ID */int32_t sensorId; /**< Sensor ID */float maxRange; /**< Maximum measurement range of the sensor */float precision; /**< Sensor accuracy */float power; /**< Sensor power */
} MedicalSensorInfo;
SensorEvent结构体
typedef struct SensorEvent {int32_t sensorTypeId; /**< Sensor type ID */int32_t version; /**< Sensor algorithm version */int64_t timestamp; /**< Time when sensor data was reported */uint32_t option; /**< Sensor data options, including the measurement range and accuracy */int32_t mode; /**< Sensor data reporting mode (described in {@link SensorMode}) */uint8_t *data; /**< Sensor data */uint32_t dataLen; /**< Sensor data length */
} SensorEvent;
PpgData结构体
typedef struct PpgData {uint32_t reserve : 2;uint32_t adcData : 22;uint32_t tl : 2;uint32_t rx : 2;uint32_t phaseGroup : 4;
} PpgData;
HeartRateData结构体
typedef struct HeartRateData {/**< 心率值,单位bpm */int32_t heartRateBpm;/**< 心率状态 */int32_t temperatureStatus;
} HeartRateData;
WearDetectionData结构体
typedef struct WearDetectionData {/**< 标量 */int32_t scalar;
} WearDetectionData;
重要枚举:
MedicalSensorTypeId枚举
typedef enum {TYPE_ID_NONE = 0, /**< None, for testing only */TYPE_ID_PHOTOPLETHYSMOGRAPH = 129, /**< Photoplethysmography sensor */TYPE_ID_ELECTROCARDIOGRAPH = 130, /**< Electrocardiogram (ECG) sensor */TYPE_ID_HEART_RATE = 278, /**< Heart rate sensor */TYPE_ID_WEAR_DETECTION = 280, /**< Wear detection sensor */TYPE_ID_MAX = 0xFFF, /**< Maximum number of sensor type IDs */
} MedicalSensorTypeId;
SensorMode枚举
typedef enum SensorMode {SENSOR_DEFAULT_MODE = 0, /**< Default data reporting mode */SENSOR_REALTIME_MODE = 1, /**< Real-time data reporting mode to report a group of data each time */SENSOR_ON_CHANGE = 2, /**< Real-time data reporting mode to report data upon status changes */SENSOR_ONE_SHOT = 3, /**< Real-time data reporting mode to report data only once */SENSOR_FIFO_MODE = 4, /**< FIFO-based data reporting mode to report data based on the <b>BatchCnt</b> setting */SENSOR_MODE_MAX2, /**< Maximum sensor data reporting mode */
} SensorMode;
2.3 继承与多态
继承关系:
MedicalSensorService
继承自SystemAbility
和MedicalSensorServiceStub
MedicalSensorManager
继承自Singleton<MedicalSensorManager>
MedicalSensorServiceClient
继承自Singleton<MedicalSensorServiceClient>
- 各种回调类继承自相应的回调接口基类
多态设计:
- 通过
MedicalSensorServiceStub
接口实现不同传感器类型的统一管理 - 通过回调机制支持多种事件类型的统一处理
- 通过工厂模式实现不同传感器对象的动态创建
- 通过策略模式实现不同传感器类型的处理策略
2.4 类图
2.5 模块内部依赖框图
3. 模块间交互
3.1 交互描述
与系统模块的交互:
- 系统能力管理器:通过SAMGR模块注册和管理医疗传感器服务
- IPC通信:通过IPC模块实现客户端与服务端的通信
- 日志系统:通过Hilog模块记录医疗传感器模块的运行日志
- 权限管理:通过权限管理模块控制健康数据访问权限
- HDF框架:通过HDF框架对接底层传感器驱动
外部库依赖:
- 系统框架:SAMGR、IPC、权限管理等系统框架
- 工具库:c_utils、eventhandler、napi等基础库
- 传感器驱动:drivers_interface_sensor、drivers_peripheral_sensor等驱动接口
异步处理机制:
- 使用线程池进行异步数据处理
- 通过回调机制处理传感器数据上报
- 支持多种数据上报模式(实时、按需、FIFO等)
- 采用事件驱动机制处理传感器状态变化
3.2 事件驱动机制
事件类型:
- 传感器数据变化事件
- 传感器启用/禁用事件
- 客户端连接/断开事件
- 权限状态变化事件
- 传感器状态变化事件
事件处理流程:
- 注册事件监听器
- 接收传感器或系统事件通知
- 解析事件参数
- 更新内部状态
- 通知相关回调
- 执行相应的处理逻辑
3.3 外部依赖框图
4. 状态机转换图
4.1 状态机模型
医疗传感器模块的状态机包含以下主要状态:
服务状态:
STATE_STOPPED
- 服务停止STATE_RUNNING
- 服务运行中
传感器状态:
SENSOR_DISABLED
- 传感器禁用SENSOR_ENABLED
- 传感器启用SENSOR_SUSPENDED
- 传感器暂停SENSOR_ERROR
- 传感器错误
数据上报状态:
REPORT_IDLE
- 上报空闲REPORT_ACTIVE
- 上报活跃REPORT_PAUSED
- 上报暂停REPORT_ERROR
- 上报错误
客户端状态:
CLIENT_DISCONNECTED
- 客户端断开CLIENT_CONNECTED
- 客户端连接CLIENT_SUBSCRIBED
- 客户端订阅CLIENT_UNSUBSCRIBED
- 客户端取消订阅
4.2 状态切换规则
服务启动流程:
- 服务初始状态为
STATE_STOPPED
- 收到启动事件后,进入
STATE_RUNNING
状态 - 初始化各个子模块和传感器管理器
- 注册到系统能力管理器
传感器状态转换:
- 传感器初始状态为
SENSOR_DISABLED
- 收到启用请求时,进入
SENSOR_ENABLED
状态 - 收到暂停请求时,进入
SENSOR_SUSPENDED
状态 - 发生错误时,进入
SENSOR_ERROR
状态 - 收到禁用请求时,回到
SENSOR_DISABLED
状态
数据上报状态转换:
- 数据上报初始状态为
REPORT_IDLE
- 有客户端订阅时,进入
REPORT_ACTIVE
状态 - 暂停上报时,进入
REPORT_PAUSED
状态 - 发生错误时,进入
REPORT_ERROR
状态 - 无客户端订阅时,回到
REPORT_IDLE
状态
客户端状态转换:
- 客户端初始状态为
CLIENT_DISCONNECTED
- 连接服务时,进入
CLIENT_CONNECTED
状态 - 订阅传感器时,进入
CLIENT_SUBSCRIBED
状态 - 取消订阅时,进入
CLIENT_UNSUBSCRIBED
状态 - 断开连接时,回到
CLIENT_DISCONNECTED
状态
事件触发条件:
- 服务启动/停止事件
- 传感器启用/禁用事件
- 客户端连接/断开事件
- 数据订阅/取消订阅事件
- 权限状态变化事件
4.3 状态机转换图
5. 接口设计
5.1 公共接口
医疗传感器服务接口:
启用传感器
ErrCode EnableSensor(uint32_t sensorId, int64_t samplingPeriodNs, int64_t maxReportDelayNs);
- 功能:启用指定的医疗传感器
- 参数:
sensorId
- 传感器IDsamplingPeriodNs
- 采样周期(纳秒)maxReportDelayNs
- 最大上报延迟(纳秒)
- 返回值:操作结果码
- 权限要求:
ohos.permission.READ_HEALTH_DATA
- 异常处理:权限不足时返回错误码
禁用传感器
ErrCode DisableSensor(uint32_t sensorId);
- 功能:禁用指定的医疗传感器
- 参数:
sensorId
- 传感器ID - 返回值:操作结果码
- 异常处理:传感器不存在时返回错误码
设置传感器选项
ErrCode SetOption(uint32_t sensorId, uint32_t opt);
- 功能:设置传感器选项
- 参数:
sensorId
- 传感器IDopt
- 选项值
- 返回值:操作结果码
- 异常处理:选项无效时返回错误码
获取传感器状态
int32_t GetSensorState(uint32_t sensorId);
- 功能:获取传感器状态
- 参数:
sensorId
- 传感器ID - 返回值:传感器状态值
- 异常处理:传感器不存在时返回错误状态
执行传感器命令
ErrCode RunCommand(uint32_t sensorId, uint32_t cmdType, uint32_t params);
- 功能:执行传感器命令
- 参数:
sensorId
- 传感器IDcmdType
- 命令类型params
- 命令参数
- 返回值:操作结果码
- 异常处理:命令无效时返回错误码
获取传感器列表
std::vector<MedicalSensor> GetSensorList();
- 功能:获取所有医疗传感器列表
- 返回值:传感器列表
- 异常处理:无异常
传输数据通道
ErrCode TransferDataChannel(const sptr<MedicalSensorBasicDataChannel> &sensorBasicDataChannel,const sptr<IRemoteObject> &sensorClient);
- 功能:传输数据通道
- 参数:
sensorBasicDataChannel
- 数据通道sensorClient
- 传感器客户端
- 返回值:操作结果码
- 异常处理:通道无效时返回错误码
销毁传感器通道
ErrCode DestroySensorChannel(sptr<IRemoteObject> sensorClient);
- 功能:销毁传感器通道
- 参数:
sensorClient
- 传感器客户端 - 返回值:操作结果码
- 异常处理:客户端无效时返回错误码
医疗传感器客户端接口:
获取传感器列表
std::vector<MedicalSensor> GetSensorList();
- 功能:获取所有医疗传感器列表
- 返回值:传感器列表
- 异常处理:无异常
启用传感器
int32_t EnableSensor(uint32_t sensorId, int64_t samplingPeroid, int64_t maxReportDelay);
- 功能:启用指定的医疗传感器
- 参数:
sensorId
- 传感器IDsamplingPeroid
- 采样周期maxReportDelay
- 最大上报延迟
- 返回值:操作结果码
- 异常处理:启用失败时返回错误码
禁用传感器
int32_t DisableSensor(uint32_t sensorId);
- 功能:禁用指定的医疗传感器
- 参数:
sensorId
- 传感器ID - 返回值:操作结果码
- 异常处理:禁用失败时返回错误码
执行传感器命令
int32_t RunCommand(uint32_t sensorId, int32_t cmdType, int32_t parms);
- 功能:执行传感器命令
- 参数:
sensorId
- 传感器IDcmdType
- 命令类型parms
- 命令参数
- 返回值:操作结果码
- 异常处理:命令执行失败时返回错误码
传输数据通道
int32_t TransferDataChannel(sptr<MedicalSensorDataChannel> sensorDataChannel);
- 功能:传输数据通道
- 参数:
sensorDataChannel
- 数据通道 - 返回值:操作结果码
- 异常处理:通道传输失败时返回错误码
销毁数据通道
int32_t DestroyDataChannel();
- 功能:销毁数据通道
- 返回值:操作结果码
- 异常处理:销毁失败时返回错误码
设置传感器选项
int32_t SetOption(uint32_t sensorId, uint32_t opt);
- 功能:设置传感器选项
- 参数:
sensorId
- 传感器IDopt
- 选项值
- 返回值:操作结果码
- 异常处理:选项设置失败时返回错误码
JavaScript接口:
订阅传感器数据
function on(type: MedicalSensorType.TYPE_ID_PHOTOPLETHYSMOGRAPH, callback: Callback<PpgResponse>, options?: Options): void;
- 功能:订阅医疗传感器数据
- 参数:
type
- 传感器类型callback
- 数据回调函数options
- 可选参数
- 权限要求:
ohos.permission.READ_HEALTH_DATA
- 异常处理:权限不足时抛出异常
取消订阅传感器数据
function off(type: MedicalSensorType.TYPE_ID_PHOTOPLETHYSMOGRAPH, callback?: Callback<PpgResponse>): void;
- 功能:取消订阅医疗传感器数据
- 参数:
type
- 传感器类型callback
- 数据回调函数(可选)
- 异常处理:无异常
5.2 数据交换接口
IPC接口定义:
- 使用系统能力接口进行跨进程通信
- 支持MedicalSensorInfo结构体的序列化传输
- 提供异步回调机制
数据格式:
- PpgData结构体支持PPG传感器数据传输
- HeartRateData结构体支持心率数据传输
- WearDetectionData结构体支持佩戴检测数据传输
- SensorEvent结构体支持通用传感器事件传输
5.3 接口调用时序图
6. 总结
医疗传感器模块是OpenHarmony系统传感器子系统的重要组件,专门用于处理健康类传感器数据。该模块采用分层架构设计,为系统和应用提供统一的医疗传感器能力接口。
主要特点:
- 专门处理健康类传感器数据
- 支持多种医疗传感器类型(PPG、ECG、心率、佩戴检测等)
- 完善的权限控制机制
- 高效的异步数据处理能力
- 灵活的传感器生命周期管理
- 统一的数据上报接口
技术优势:
- 基于HDF框架的驱动模型
- 完善的错误处理和异常管理
- 支持多种数据上报模式
- 高效的跨进程通信机制
- 灵活的传感器配置选项
该模块为OpenHarmony系统的健康应用提供了坚实的基础,支持各种健康数据采集需求,是构建智能健康应用的重要基础设施。通过分层设计和统一接口,为开发者提供了灵活、高效、易用的医疗传感器开发能力。