【OpenHarmony】医疗传感器模块架构
医疗传感器模块是OpenHarmony系统中负责健康数据采集与处理的核心组件。该模块采用分层架构设计,包含应用层API、框架层、服务层和HDI接口层,支持PPG、ECG、心率等多种医疗传感器。主要功能包括健康数据采集、传感器管理、数据预处理和算法集成,通过严格权限控制确保数据安全。模块采用单例模式、观察者模式等设计模式,实现传感器生命周期管理和数据订阅机制。该模块作为传感器子系统的专用部分,为健康
医疗传感器模块架构
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和MedicalSensorServiceStubMedicalSensorManager继承自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系统的健康应用提供了坚实的基础,支持各种健康数据采集需求,是构建智能健康应用的重要基础设施。通过分层设计和统一接口,为开发者提供了灵活、高效、易用的医疗传感器开发能力。
更多推荐



所有评论(0)