【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 系统框图

外部依赖 传感器类型 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继承自SystemAbilityMedicalSensorServiceStub
  • 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 事件驱动机制

事件类型:

  • 传感器数据变化事件
  • 传感器启用/禁用事件
  • 客户端连接/断开事件
  • 权限状态变化事件
  • 传感器状态变化事件

事件处理流程:

  1. 注册事件监听器
  2. 接收传感器或系统事件通知
  3. 解析事件参数
  4. 更新内部状态
  5. 通知相关回调
  6. 执行相应的处理逻辑

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 状态切换规则

服务启动流程:

  1. 服务初始状态为STATE_STOPPED
  2. 收到启动事件后,进入STATE_RUNNING状态
  3. 初始化各个子模块和传感器管理器
  4. 注册到系统能力管理器

传感器状态转换:

  1. 传感器初始状态为SENSOR_DISABLED
  2. 收到启用请求时,进入SENSOR_ENABLED状态
  3. 收到暂停请求时,进入SENSOR_SUSPENDED状态
  4. 发生错误时,进入SENSOR_ERROR状态
  5. 收到禁用请求时,回到SENSOR_DISABLED状态

数据上报状态转换:

  1. 数据上报初始状态为REPORT_IDLE
  2. 有客户端订阅时,进入REPORT_ACTIVE状态
  3. 暂停上报时,进入REPORT_PAUSED状态
  4. 发生错误时,进入REPORT_ERROR状态
  5. 无客户端订阅时,回到REPORT_IDLE状态

客户端状态转换:

  1. 客户端初始状态为CLIENT_DISCONNECTED
  2. 连接服务时,进入CLIENT_CONNECTED状态
  3. 订阅传感器时,进入CLIENT_SUBSCRIBED状态
  4. 取消订阅时,进入CLIENT_UNSUBSCRIBED状态
  5. 断开连接时,回到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 - 传感器ID
    • samplingPeriodNs - 采样周期(纳秒)
    • maxReportDelayNs - 最大上报延迟(纳秒)
  • 返回值:操作结果码
  • 权限要求ohos.permission.READ_HEALTH_DATA
  • 异常处理:权限不足时返回错误码
禁用传感器
cpp 复制代码
ErrCode DisableSensor(uint32_t sensorId);
  • 功能:禁用指定的医疗传感器
  • 参数sensorId - 传感器ID
  • 返回值:操作结果码
  • 异常处理:传感器不存在时返回错误码
设置传感器选项
cpp 复制代码
ErrCode SetOption(uint32_t sensorId, uint32_t opt);
  • 功能:设置传感器选项
  • 参数
    • sensorId - 传感器ID
    • opt - 选项值
  • 返回值:操作结果码
  • 异常处理:选项无效时返回错误码
获取传感器状态
cpp 复制代码
int32_t GetSensorState(uint32_t sensorId);
  • 功能:获取传感器状态
  • 参数sensorId - 传感器ID
  • 返回值:传感器状态值
  • 异常处理:传感器不存在时返回错误状态
执行传感器命令
cpp 复制代码
ErrCode RunCommand(uint32_t sensorId, uint32_t cmdType, uint32_t params);
  • 功能:执行传感器命令
  • 参数
    • sensorId - 传感器ID
    • cmdType - 命令类型
    • 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 - 传感器ID
    • samplingPeroid - 采样周期
    • maxReportDelay - 最大上报延迟
  • 返回值:操作结果码
  • 异常处理:启用失败时返回错误码
禁用传感器
cpp 复制代码
int32_t DisableSensor(uint32_t sensorId);
  • 功能:禁用指定的医疗传感器
  • 参数sensorId - 传感器ID
  • 返回值:操作结果码
  • 异常处理:禁用失败时返回错误码
执行传感器命令
cpp 复制代码
int32_t RunCommand(uint32_t sensorId, int32_t cmdType, int32_t parms);
  • 功能:执行传感器命令
  • 参数
    • sensorId - 传感器ID
    • cmdType - 命令类型
    • parms - 命令参数
  • 返回值:操作结果码
  • 异常处理:命令执行失败时返回错误码
传输数据通道
cpp 复制代码
int32_t TransferDataChannel(sptr<MedicalSensorDataChannel> sensorDataChannel);
  • 功能:传输数据通道
  • 参数sensorDataChannel - 数据通道
  • 返回值:操作结果码
  • 异常处理:通道传输失败时返回错误码
销毁数据通道
cpp 复制代码
int32_t DestroyDataChannel();
  • 功能:销毁数据通道
  • 返回值:操作结果码
  • 异常处理:销毁失败时返回错误码
设置传感器选项
cpp 复制代码
int32_t SetOption(uint32_t sensorId, uint32_t opt);
  • 功能:设置传感器选项
  • 参数
    • sensorId - 传感器ID
    • opt - 选项值
  • 返回值:操作结果码
  • 异常处理:选项设置失败时返回错误码

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系统的健康应用提供了坚实的基础,支持各种健康数据采集需求,是构建智能健康应用的重要基础设施。通过分层设计和统一接口,为开发者提供了灵活、高效、易用的医疗传感器开发能力。

相关推荐
没有bug.的程序员5 小时前
云原生与分布式架构的完美融合:从理论到生产实践
java·分布式·微服务·云原生·架构
JanelSirry6 小时前
分布式和微服务的区别是什么?
分布式·微服务·架构
徐子童6 小时前
基于微服务的在线判题系统重点总结
java·微服务·架构
飞哥的AI笔记8 小时前
AI群星闪耀时:从识别到思考的认知升级
架构
迎風吹頭髮8 小时前
Linux内核架构浅谈44-Linux slab分配器:通用缓存与专用缓存的创建与使用
linux·spring·架构
在云上(oncloudai)8 小时前
Amazon ElastiCache 全解析:打造高性能的智能缓存架构
缓存·架构
半夏微凉半夏殇8 小时前
除了arm 还有那些开源的芯片架构
arm开发·架构·开源
望获linux9 小时前
【实时Linux实战系列】使用 u-trace 或 a-trace 进行用户态应用剖析
java·linux·前端·网络·数据库·elasticsearch·操作系统
白衣鸽子9 小时前
CAP理论:分布式系统的“不可能三角”
后端·架构