当前位置: 首页 > news >正文

【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类
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继承自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 公共接口

医疗传感器服务接口:

启用传感器
ErrCode EnableSensor(uint32_t sensorId, int64_t samplingPeriodNs, int64_t maxReportDelayNs);
  • 功能:启用指定的医疗传感器
  • 参数
    • sensorId - 传感器ID
    • samplingPeriodNs - 采样周期(纳秒)
    • maxReportDelayNs - 最大上报延迟(纳秒)
  • 返回值:操作结果码
  • 权限要求ohos.permission.READ_HEALTH_DATA
  • 异常处理:权限不足时返回错误码
禁用传感器
ErrCode DisableSensor(uint32_t sensorId);
  • 功能:禁用指定的医疗传感器
  • 参数sensorId - 传感器ID
  • 返回值:操作结果码
  • 异常处理:传感器不存在时返回错误码
设置传感器选项
ErrCode SetOption(uint32_t sensorId, uint32_t opt);
  • 功能:设置传感器选项
  • 参数
    • sensorId - 传感器ID
    • opt - 选项值
  • 返回值:操作结果码
  • 异常处理:选项无效时返回错误码
获取传感器状态
int32_t GetSensorState(uint32_t sensorId);
  • 功能:获取传感器状态
  • 参数sensorId - 传感器ID
  • 返回值:传感器状态值
  • 异常处理:传感器不存在时返回错误状态
执行传感器命令
ErrCode RunCommand(uint32_t sensorId, uint32_t cmdType, uint32_t params);
  • 功能:执行传感器命令
  • 参数
    • sensorId - 传感器ID
    • cmdType - 命令类型
    • 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 - 传感器ID
    • samplingPeroid - 采样周期
    • maxReportDelay - 最大上报延迟
  • 返回值:操作结果码
  • 异常处理:启用失败时返回错误码
禁用传感器
int32_t DisableSensor(uint32_t sensorId);
  • 功能:禁用指定的医疗传感器
  • 参数sensorId - 传感器ID
  • 返回值:操作结果码
  • 异常处理:禁用失败时返回错误码
执行传感器命令
int32_t RunCommand(uint32_t sensorId, int32_t cmdType, int32_t parms);
  • 功能:执行传感器命令
  • 参数
    • sensorId - 传感器ID
    • cmdType - 命令类型
    • parms - 命令参数
  • 返回值:操作结果码
  • 异常处理:命令执行失败时返回错误码
传输数据通道
int32_t TransferDataChannel(sptr<MedicalSensorDataChannel> sensorDataChannel);
  • 功能:传输数据通道
  • 参数sensorDataChannel - 数据通道
  • 返回值:操作结果码
  • 异常处理:通道传输失败时返回错误码
销毁数据通道
int32_t DestroyDataChannel();
  • 功能:销毁数据通道
  • 返回值:操作结果码
  • 异常处理:销毁失败时返回错误码
设置传感器选项
int32_t SetOption(uint32_t sensorId, uint32_t opt);
  • 功能:设置传感器选项
  • 参数
    • sensorId - 传感器ID
    • opt - 选项值
  • 返回值:操作结果码
  • 异常处理:选项设置失败时返回错误码

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 接口调用时序图

应用程序MedicalSensorServiceClientMedicalSensorServiceMedicalSensorManagerSensorHdiConnection传感器驱动回调函数GetSensorList()GetSensorList()GetSensorList()返回传感器列表返回传感器列表返回传感器列表EnableSensor()EnableSensor()SaveSubscriber()启用传感器启用传感器启用成功启用成功启用成功启用成功启用成功传感器数据回调数据上报数据处理数据通知数据回调数据回调DisableSensor()DisableSensor()AfterDisableSensor()禁用传感器禁用传感器禁用成功禁用成功禁用成功禁用成功禁用成功应用程序MedicalSensorServiceClientMedicalSensorServiceMedicalSensorManagerSensorHdiConnection传感器驱动回调函数

6. 总结

医疗传感器模块是OpenHarmony系统传感器子系统的重要组件,专门用于处理健康类传感器数据。该模块采用分层架构设计,为系统和应用提供统一的医疗传感器能力接口。

主要特点:

  • 专门处理健康类传感器数据
  • 支持多种医疗传感器类型(PPG、ECG、心率、佩戴检测等)
  • 完善的权限控制机制
  • 高效的异步数据处理能力
  • 灵活的传感器生命周期管理
  • 统一的数据上报接口

技术优势:

  • 基于HDF框架的驱动模型
  • 完善的错误处理和异常管理
  • 支持多种数据上报模式
  • 高效的跨进程通信机制
  • 灵活的传感器配置选项

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

http://www.dtcms.com/a/495802.html

相关文章:

  • 「日拱一码」119 CP2K
  • 台阶仪在表面计量学的应用:基于表面纹理最大高度S±3σ的表征研究
  • 大型企业应该如何选择RPA?
  • 杭州哪里做网站好建设网站公司哪儿济南兴田德润有活动吗
  • 引流人脉推广软件莆田seo外包公司
  • SeC - 视频对象分割/AI抠像/视频绿幕抠像/视频一键换背景 支持50系显卡 一键整合包下载
  • 【ROS2】gdb、coredump 调试ROS2程序
  • h5页面生成青岛网站seo公司
  • PRNet:原始信息即全部所需
  • 【文档】部署 MySQL-Exporter
  • 南宁网站seo服务绛帐做网站
  • 10.17 枚举中间|图论
  • if条件语句 三目运算符 汇编分析
  • LeetCode 401 - 二进制手表
  • 【Leetcodenowcode数据结构】顺序表的应用
  • 软考高项论文考试攻略2:从备考到写作的专业指南
  • vue2和vue3函数式调用组件学习记录
  • 廊坊市固安县建设局网站中小企业网络设计论文
  • 3D打印技术在金属材料上的应用现状
  • 网站数据库丢失注册公司网站需要什么资料
  • 重生之我在大学自学鸿蒙开发第九天-《分布式流转》
  • 做手机网站公司wordpress萌主题下载
  • 【Android15快速自定义与集成音效实战课】:正式上线了(二百六十二)
  • 数字化时代,企业应该如何看待商业智能BI
  • 算法---队列+宽搜
  • 解锁分布式唯一 ID:技术、实践与最佳方案
  • 检察院门户网站建设方案网站建设a2345
  • GB200 NVL72超节点深度解析:架构、生态与产业格局
  • 课程网站的设计做网站被骗去哪投诉
  • YOLO家族进化史:从V1到V3的跨越