医疗传感器模块架构
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 系统框图
外部依赖 传感器类型 HDI组件 Service组件 Framework组件 医疗传感器模块 应用层 SAMGR IPC Hilog 权限管理 HDF框架 PPG传感器 ECG传感器 心率传感器 佩戴检测传感器 SensorHdiConnection HdiServiceImpl CompatibleConnection SensorEventCallback MedicalSensorService MedicalSensorManager MedicalSensorDataProcesser ClientInfo MedicalSensorServiceClient MedicalSensorDataChannel MedicalSensorClientStub MyEventHandler JS API Native API Framework Service 健康应用 医疗应用 健身应用 系统服务
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类
cpp
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类
cpp
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类
cpp
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结构体
cpp
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结构体
cpp
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结构体
cpp
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结构体
cpp
typedef struct HeartRateData {
/**< 心率值,单位bpm */
int32_t heartRateBpm;
/**< 心率状态 */
int32_t temperatureStatus;
} HeartRateData;
WearDetectionData结构体
cpp
typedef struct WearDetectionData {
/**< 标量 */
int32_t scalar;
} WearDetectionData;
重要枚举:
MedicalSensorTypeId枚举
cpp
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枚举
cpp
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 类图
uses uses uses uses contains contains contains uses uses MedicalSensorService -state_: MedicalSensorServiceState -serviceLock_: mutex -sensorsMutex_: mutex -sensorMapMutex_: mutex -sensors_: vector<MedicalSensor> -sensorMap_: unordered_map<uint32_t, MedicalSensor> -sensorHdiConnection_: SensorHdiConnection& -clientInfo_: ClientInfo& -sensorManager_: MedicalSensorManager& -flushInfo_: FlushInfoRecord& -sensorDataProcesser_: sptr<MedicalSensorDataProcesser> -reportDataCache_: sptr<ReportDataCache> -clientDeathObserver_: sptr<IRemoteObject::DeathRecipient> +OnStart() : void +OnStop() : void +EnableSensor() : ErrCode +DisableSensor() : ErrCode +SetOption() : ErrCode +GetSensorState() : int32_t +RunCommand() : ErrCode +GetSensorList() : vector<MedicalSensor> +TransferDataChannel() : ErrCode +DestroySensorChannel() : ErrCode +ProcessDeathObserver() : void MedicalSensorManager -sensorHdiConnection_: SensorHdiConnection& -clientInfo_: ClientInfo& -dataThread_: thread -sensorDataProcesser_: sptr<MedicalSensorDataProcesser> -reportDataCache_: sptr<ReportDataCache> -sensorMap_: unordered_map<uint32_t, MedicalSensor> -sensorMapMutex_: mutex +SetBestSensorParams() : bool +ResetBestSensorParams() : bool +SaveSubscriber() : ErrCode +StartDataReportThread() : void +GetSensorInfo() : MedicalSensorBasicInfo +IsOtherClientUsingSensor() : bool +AfterDisableSensor() : ErrCode +InitSensorMap() : void +GetSensorFlag() : uint32_t +GetPackageNameFromUid() : void MedicalSensorServiceClient -clientMutex_: mutex -serviceDeathObserver_: sptr<IRemoteObject::DeathRecipient> -afeServer_: sptr<IMedicalSensorService> -afeList_: vector<MedicalSensor> -dataChannel_: sptr<MedicalSensorDataChannel> -afeClientStub_: sptr<MedicalSensorClientStub> -mapMutex_: mutex -sensorInfoMap_: map<uint32_t, MedicalSensorBasicInfo> +GetSensorList() : vector<MedicalSensor> +EnableSensor() : int32_t +DisableSensor() : int32_t +RunCommand() : int32_t +TransferDataChannel() : int32_t +DestroyDataChannel() : int32_t +ProcessDeathObserver() : void +SetOption() : int32_t -InitServiceClient() : int32_t -UpdateSensorInfoMap() : void -DeleteSensorInfoItem() : void -IsValidSensorId() : bool MedicalSensorInfo +sensorName: char[48] +vendorName: char[48] +firmwareVersion: char[16] +hardwareVersion: char[16] +sensorTypeId: int32_t +sensorId: int32_t +maxRange: float +precision: float +power: float SensorEvent +sensorTypeId: int32_t +version: int32_t +timestamp: int64_t +option: uint32_t +mode: int32_t +data: uint8_t* +dataLen: uint32_t PpgData +reserve: uint32_t +adcData: uint32_t +tl: uint32_t +rx: uint32_t +phaseGroup: uint32_t HeartRateData +heartRateBpm: int32_t +temperatureStatus: int32_t WearDetectionData +scalar: int32_t <<enumeration>> MedicalSensorTypeId TYPE_ID_NONE TYPE_ID_PHOTOPLETHYSMOGRAPH TYPE_ID_ELECTROCARDIOGRAPH TYPE_ID_HEART_RATE TYPE_ID_WEAR_DETECTION TYPE_ID_MAX <<enumeration>> SensorMode SENSOR_DEFAULT_MODE SENSOR_REALTIME_MODE SENSOR_ON_CHANGE SENSOR_ONE_SHOT SENSOR_FIFO_MODE SENSOR_MODE_MAX2 <<abstract>> SystemAbility +OnStart() : void +OnStop() : void +OnDump() : void <<interface>> MedicalSensorServiceStub +EnableSensor() : ErrCode +DisableSensor() : ErrCode +SetOption() : ErrCode +GetSensorState() : int32_t +RunCommand() : ErrCode +GetSensorList() : vector<MedicalSensor> +TransferDataChannel() : ErrCode +DestroySensorChannel() : ErrCode <<template>> Singleton<T> +GetInstance()
2.5 模块内部依赖框图
枚举类型 数据结构 HDI连接组件 Service组件 Framework组件 医疗传感器模块内部结构 MedicalSensorTypeId SensorMode MedicalSensorServiceState MedicalSensorInfo SensorEvent PpgData HeartRateData WearDetectionData SensorHdiConnection HdiServiceImpl CompatibleConnection SensorEventCallback MedicalSensorService MedicalSensorManager MedicalSensorDataProcesser ClientInfo FlushInfoRecord FifoCacheData MedicalSensorServiceClient MedicalSensorDataChannel MedicalSensorClientStub MyEventHandler MyFileDescriptorListener JS API Native API Framework Service
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 外部依赖框图
应用层 传感器驱动 系统框架 系统服务 医疗传感器模块 健康应用 医疗应用 健身应用 系统服务 drivers_interface_sensor drivers_peripheral_sensor HDF框架 传感器驱动模型 NAPI SAFWK HiSysEvent AccessToken SAMGR IPC Hilog 权限管理 EventHandler JS API Native API Framework Service
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 状态机转换图
系统启动 OnStart() OnStop() 初始化传感器 EnableSensor() 暂停请求 恢复请求 发生错误 错误恢复 重新启用 初始化上报 客户端订阅 暂停上报 恢复上报 发生错误 错误恢复 重新订阅 初始化客户端 连接服务 订阅传感器 取消订阅 重新订阅 断开连接 断开连接 ServiceStopped ServiceRunning SensorDisabled SensorEnabled SensorSuspended SensorError ReportIdle ReportActive ReportPaused ReportError ClientDisconnected ClientConnected ClientSubscribed ClientUnsubscribed 服务运行状态,可以处理
各种传感器请求 传感器启用状态,可以
采集和上报数据 数据上报活跃状态,正在
向客户端推送数据 客户端订阅状态,正在
接收传感器数据
5. 接口设计
5.1 公共接口
医疗传感器服务接口:
启用传感器
cpp
ErrCode EnableSensor(uint32_t sensorId, int64_t samplingPeriodNs, int64_t maxReportDelayNs);
- 功能:启用指定的医疗传感器
- 参数 :
sensorId
- 传感器IDsamplingPeriodNs
- 采样周期(纳秒)maxReportDelayNs
- 最大上报延迟(纳秒)
- 返回值:操作结果码
- 权限要求 :
ohos.permission.READ_HEALTH_DATA
- 异常处理:权限不足时返回错误码
禁用传感器
cpp
ErrCode DisableSensor(uint32_t sensorId);
- 功能:禁用指定的医疗传感器
- 参数 :
sensorId
- 传感器ID - 返回值:操作结果码
- 异常处理:传感器不存在时返回错误码
设置传感器选项
cpp
ErrCode SetOption(uint32_t sensorId, uint32_t opt);
- 功能:设置传感器选项
- 参数 :
sensorId
- 传感器IDopt
- 选项值
- 返回值:操作结果码
- 异常处理:选项无效时返回错误码
获取传感器状态
cpp
int32_t GetSensorState(uint32_t sensorId);
- 功能:获取传感器状态
- 参数 :
sensorId
- 传感器ID - 返回值:传感器状态值
- 异常处理:传感器不存在时返回错误状态
执行传感器命令
cpp
ErrCode RunCommand(uint32_t sensorId, uint32_t cmdType, uint32_t params);
- 功能:执行传感器命令
- 参数 :
sensorId
- 传感器IDcmdType
- 命令类型params
- 命令参数
- 返回值:操作结果码
- 异常处理:命令无效时返回错误码
获取传感器列表
cpp
std::vector<MedicalSensor> GetSensorList();
- 功能:获取所有医疗传感器列表
- 返回值:传感器列表
- 异常处理:无异常
传输数据通道
cpp
ErrCode TransferDataChannel(const sptr<MedicalSensorBasicDataChannel> &sensorBasicDataChannel,
const sptr<IRemoteObject> &sensorClient);
- 功能:传输数据通道
- 参数 :
sensorBasicDataChannel
- 数据通道sensorClient
- 传感器客户端
- 返回值:操作结果码
- 异常处理:通道无效时返回错误码
销毁传感器通道
cpp
ErrCode DestroySensorChannel(sptr<IRemoteObject> sensorClient);
- 功能:销毁传感器通道
- 参数 :
sensorClient
- 传感器客户端 - 返回值:操作结果码
- 异常处理:客户端无效时返回错误码
医疗传感器客户端接口:
获取传感器列表
cpp
std::vector<MedicalSensor> GetSensorList();
- 功能:获取所有医疗传感器列表
- 返回值:传感器列表
- 异常处理:无异常
启用传感器
cpp
int32_t EnableSensor(uint32_t sensorId, int64_t samplingPeroid, int64_t maxReportDelay);
- 功能:启用指定的医疗传感器
- 参数 :
sensorId
- 传感器IDsamplingPeroid
- 采样周期maxReportDelay
- 最大上报延迟
- 返回值:操作结果码
- 异常处理:启用失败时返回错误码
禁用传感器
cpp
int32_t DisableSensor(uint32_t sensorId);
- 功能:禁用指定的医疗传感器
- 参数 :
sensorId
- 传感器ID - 返回值:操作结果码
- 异常处理:禁用失败时返回错误码
执行传感器命令
cpp
int32_t RunCommand(uint32_t sensorId, int32_t cmdType, int32_t parms);
- 功能:执行传感器命令
- 参数 :
sensorId
- 传感器IDcmdType
- 命令类型parms
- 命令参数
- 返回值:操作结果码
- 异常处理:命令执行失败时返回错误码
传输数据通道
cpp
int32_t TransferDataChannel(sptr<MedicalSensorDataChannel> sensorDataChannel);
- 功能:传输数据通道
- 参数 :
sensorDataChannel
- 数据通道 - 返回值:操作结果码
- 异常处理:通道传输失败时返回错误码
销毁数据通道
cpp
int32_t DestroyDataChannel();
- 功能:销毁数据通道
- 返回值:操作结果码
- 异常处理:销毁失败时返回错误码
设置传感器选项
cpp
int32_t SetOption(uint32_t sensorId, uint32_t opt);
- 功能:设置传感器选项
- 参数 :
sensorId
- 传感器IDopt
- 选项值
- 返回值:操作结果码
- 异常处理:选项设置失败时返回错误码
JavaScript接口:
订阅传感器数据
typescript
function on(type: MedicalSensorType.TYPE_ID_PHOTOPLETHYSMOGRAPH, callback: Callback<PpgResponse>, options?: Options): void;
- 功能:订阅医疗传感器数据
- 参数 :
type
- 传感器类型callback
- 数据回调函数options
- 可选参数
- 权限要求 :
ohos.permission.READ_HEALTH_DATA
- 异常处理:权限不足时抛出异常
取消订阅传感器数据
typescript
function off(type: MedicalSensorType.TYPE_ID_PHOTOPLETHYSMOGRAPH, callback?: Callback<PpgResponse>): void;
- 功能:取消订阅医疗传感器数据
- 参数 :
type
- 传感器类型callback
- 数据回调函数(可选)
- 异常处理:无异常
5.2 数据交换接口
IPC接口定义:
- 使用系统能力接口进行跨进程通信
- 支持MedicalSensorInfo结构体的序列化传输
- 提供异步回调机制
数据格式:
- PpgData结构体支持PPG传感器数据传输
- HeartRateData结构体支持心率数据传输
- WearDetectionData结构体支持佩戴检测数据传输
- SensorEvent结构体支持通用传感器事件传输
5.3 接口调用时序图
应用程序 MedicalSensorServiceClient MedicalSensorService MedicalSensorManager SensorHdiConnection 传感器驱动 回调函数 GetSensorList() GetSensorList() GetSensorList() 返回传感器列表 返回传感器列表 返回传感器列表 EnableSensor() EnableSensor() SaveSubscriber() 启用传感器 启用传感器 启用成功 启用成功 启用成功 启用成功 启用成功 传感器数据回调 数据上报 数据处理 数据通知 数据回调 数据回调 DisableSensor() DisableSensor() AfterDisableSensor() 禁用传感器 禁用传感器 禁用成功 禁用成功 禁用成功 禁用成功 禁用成功 应用程序 MedicalSensorServiceClient MedicalSensorService MedicalSensorManager SensorHdiConnection 传感器驱动 回调函数
6. 总结
医疗传感器模块是OpenHarmony系统传感器子系统的重要组件,专门用于处理健康类传感器数据。该模块采用分层架构设计,为系统和应用提供统一的医疗传感器能力接口。
主要特点:
- 专门处理健康类传感器数据
- 支持多种医疗传感器类型(PPG、ECG、心率、佩戴检测等)
- 完善的权限控制机制
- 高效的异步数据处理能力
- 灵活的传感器生命周期管理
- 统一的数据上报接口
技术优势:
- 基于HDF框架的驱动模型
- 完善的错误处理和异常管理
- 支持多种数据上报模式
- 高效的跨进程通信机制
- 灵活的传感器配置选项
该模块为OpenHarmony系统的健康应用提供了坚实的基础,支持各种健康数据采集需求,是构建智能健康应用的重要基础设施。通过分层设计和统一接口,为开发者提供了灵活、高效、易用的医疗传感器开发能力。