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

【OpenHarmony】传感器轻量级服务模块架构

传感器轻量级服务模块架构

1. 模块概述

源码:https://gitee.com/openharmony/sensors_sensor_lite

1.1 功能与目标

传感器轻量级服务模块(sensors_sensor_lite)是OpenHarmony系统中提供传感器数据管理功能的核心模块。该模块的主要功能包括:

  • 传感器查询:获取系统中所有可用传感器的信息列表
  • 传感器控制:启用或禁用指定的传感器设备
  • 数据订阅:订阅或取消订阅传感器数据
  • 参数配置:设置传感器的数据采样间隔和报告间隔
  • 模式设置:配置传感器的数据报告模式

该模块的目标是为上层应用提供统一的传感器数据访问接口,支持多种传感器类型,包括加速度计、陀螺仪、环境光传感器、磁力计等,实现轻量级的传感器服务框架。

1.2 系统位置

传感器轻量级服务模块在OpenHarmony系统中的位置:

  • 子系统:sensors(传感器子系统)
  • 模块类型:核心服务模块
  • 适配系统:mini系统(轻量级系统)
  • 资源占用:ROM约92KB,RAM约200KB

该模块作为传感器子系统的核心组件,位于应用层和硬件抽象层之间,为上层的传感器应用提供标准化的API接口,同时通过HDI(硬件设备接口)与底层传感器驱动进行交互。

1.3 设计思路与模式

设计思路

  • 采用分层架构设计,将接口层、服务层和实现层分离
  • 使用代理模式实现客户端与服务端的解耦
  • 采用回调机制实现异步数据推送
  • 支持多用户并发访问,通过回调链表管理多个订阅者

设计模式

  • 代理模式:SensorAgentProxy作为客户端代理,封装与服务的通信细节
  • 工厂模式:通过NewSensorInterfaceInstance()创建传感器接口实例
  • 观察者模式:通过回调函数实现传感器数据的事件通知
  • 单例模式:传感器服务采用单例模式确保全局唯一性

2. 模块结构

2.1 源文件与头文件

2.1.1 框架层(frameworks)
  • sensor_agent_proxy.h:传感器代理头文件,定义代理接口和数据结构
  • sensor_agent_proxy.c:传感器代理实现,处理客户端与服务端的通信
  • sensor_agent_client.c:传感器客户端实现
  • sensor_agent.c:传感器代理入口函数实现
2.1.2 接口层(interfaces)
  • sensor_agent.h:传感器代理公共API接口定义
  • sensor_agent_type.h:传感器数据类型定义,包括传感器信息、事件、用户等结构体
2.1.3 服务层(services)
  • sensor_service.h:传感器服务接口定义
  • sensor_service_impl.h:传感器服务实现接口
  • sensor_service.c:传感器服务实现,处理IPC调用
  • sensor_service_impl.c:传感器服务具体实现,与HDI层交互
  • proc.c:进程管理相关实现

2.2 类、结构体、函数与方法

2.2.1 主要数据结构

SensorInfo结构体

typedef struct SensorInfo {char sensorName[SENSOR_NAME_MAX_LEN];   // 传感器名称char vendorName[SENSOR_NAME_MAX_LEN];   // 厂商名称char firmwareVersion[VERSION_MAX_LEN];  // 固件版本char hardwareVersion[VERSION_MAX_LEN];  // 硬件版本int32_t sensorTypeId;  // 传感器类型IDint32_t sensorId;      // 传感器IDfloat maxRange;        // 最大测量范围float precision;       // 精度float power;           // 功耗
} SensorInfo;

SensorEvent结构体

typedef struct SensorEvent {int32_t sensorTypeId;  // 传感器类型IDint32_t version;       // 算法版本int64_t timestamp;     // 时间戳uint32_t option;       // 数据选项int32_t mode;          // 报告模式uint8_t *data;         // 传感器数据uint32_t dataLen;      // 数据长度
} SensorEvent;

SensorUser结构体

typedef struct SensorUser {char name[SENSOR_NAME_MAX_LEN];  // 用户名称RecordSensorCallback callback;   // 回调函数UserData *userData;              // 用户数据
} SensorUser;
2.2.2 主要函数接口

公共API函数

  • GetAllSensors(SensorInfo **sensorInfo, int32_t *count):获取所有传感器信息
  • SubscribeSensor(int32_t sensorTypeId, SensorUser *user):订阅传感器数据
  • UnsubscribeSensor(int32_t sensorTypeId, SensorUser *user):取消订阅传感器数据
  • ActivateSensor(int32_t sensorTypeId, SensorUser *user):激活传感器
  • DeactivateSensor(int32_t sensorTypeId, SensorUser *user):停用传感器
  • SetBatch(int32_t sensorTypeId, SensorUser *user, int64_t samplingInterval, int64_t reportInterval):设置批处理参数
  • SetMode(int32_t sensorTypeId, SensorUser *user, int32_t mode):设置报告模式

服务端实现函数

  • GetAllSensorsImpl():获取传感器信息实现
  • ActivateSensorImpl():激活传感器实现
  • DeactivateSensorImpl():停用传感器实现
  • SubscribeSensorImpl():订阅传感器实现
  • UnsubscribeSensorImpl():取消订阅实现
  • SetBatchImpl():设置批处理实现
  • SetModeImpl():设置模式实现
2.2.3 继承与多态

该模块主要使用C语言实现,通过结构体组合和函数指针实现类似面向对象的特性:

  • SensorFeatureApi结构体:继承自INHERIT_SERVER_IPROXY,提供服务器代理功能
  • SensorService结构体:继承自INHERIT_SERVICE和INHERIT_IUNKNOWNENTRY,提供服务和接口功能
  • 函数指针:通过函数指针实现多态,如RecordSensorCallback回调函数
2.2.4 类图
contains
uses
returns
uses
implements
contains
SensorInfo
+char sensorName[16]
+char vendorName[16]
+char firmwareVersion[16]
+char hardwareVersion[16]
+int32_t sensorTypeId
+int32_t sensorId
+float maxRange
+float precision
+float power
SensorEvent
+int32_t sensorTypeId
+int32_t version
+int64_t timestamp
+uint32_t option
+int32_t mode
+uint8_t* data
+uint32_t dataLen
SensorUser
+char name[16]
+RecordSensorCallback callback
+UserData* userData
UserData
+char userData[104]
SensorFeatureApi
+GetAllSensors()
+ActivateSensor()
+DeactivateSensor()
+SetBatch()
+SubscribeSensor()
+UnsubscribeSensor()
+SetMode()
+SetOption()
SensorService
+GetName()
+Initialize()
+MessageHandle()
+GetTaskConfig()
+Invoke()
CallbackNode
+RecordSensorCallback callback
+void* next
RecordSensorCallback

2.3 模块内部依赖框图

传感器轻量级服务模块
接口层 (interfaces)
框架层 (frameworks)
服务层 (services)
sensor_service.c
IPC处理
sensor_service_impl.c
服务实现
proc.c
进程管理
sensor_agent.c
API入口
sensor_agent_proxy.c
代理实现
sensor_agent_client.c
客户端实现
sensor_agent.h
公共API
sensor_agent_type.h
数据类型定义

3. 模块间交互

3.1 交互描述

与上层应用的交互

  • 通过标准C API接口提供传感器数据访问能力
  • 支持异步回调机制,实时推送传感器数据
  • 提供统一的错误处理和状态管理

与系统服务的交互

  • 通过SAMGR(系统能力管理)注册服务
  • 使用IPC(进程间通信)机制与客户端通信
  • 支持多进程并发访问

与硬件抽象层的交互

  • 通过HDI(硬件设备接口)访问底层传感器驱动
  • 支持条件编译,适配不同的硬件平台
  • 提供传感器数据的标准化处理

异步处理机制

  • 使用回调函数实现异步数据推送
  • 通过IPC的异步消息机制处理数据分发
  • 支持多线程环境下的并发访问

事件驱动机制

  • 传感器数据变化触发事件
  • 通过回调链表管理多个订阅者
  • 支持事件的注册、注销和分发

3.2 外部依赖框图

硬件层
硬件抽象层
系统服务层
传感器轻量级服务模块
应用层
物理传感器
传感器硬件
传感器HDI
传感器驱动
SAMGR服务
IPC通信
API接口层
服务实现层
传感器应用
系统应用

4. 状态机转换图

4.1 状态机模型

传感器服务模块的状态机主要管理传感器的生命周期和数据处理状态:

主要状态

  • 未初始化状态:模块启动前的状态
  • 已初始化状态:模块已加载但传感器未激活
  • 传感器激活状态:传感器已激活,可以接收数据
  • 数据订阅状态:有客户端订阅传感器数据
  • 数据报告状态:正在向客户端推送数据
  • 错误状态:发生错误时的状态

4.2 状态机切换规则

状态切换条件

  • 初始化:模块加载时从未初始化状态转换到已初始化状态
  • 传感器激活:调用ActivateSensor时从已初始化状态转换到传感器激活状态
  • 数据订阅:调用SubscribeSensor时从传感器激活状态转换到数据订阅状态
  • 数据报告:传感器数据到达时从数据订阅状态转换到数据报告状态
  • 错误处理:任何操作失败时转换到错误状态

事件触发

  • 系统事件:模块加载、卸载
  • 用户事件:API调用(激活、订阅、取消订阅等)
  • 硬件事件:传感器数据到达、硬件错误
  • 定时事件:数据报告超时

4.3 状态机转换图

模块启动
模块加载
ActivateSensor
初始化失败
SubscribeSensor
DeactivateSensor
激活失败
数据到达
UnsubscribeSensor
订阅失败
继续处理数据
处理完成
报告失败
错误恢复
重试成功
模块卸载
未初始化状态
已初始化状态
传感器激活状态
错误状态
数据订阅状态
数据报告状态

5. 接口设计

5.1 公共接口

5.1.1 传感器信息查询接口

GetAllSensors

int32_t GetAllSensors(SensorInfo **sensorInfo, int32_t *count);
  • 功能:获取系统中所有传感器的信息
  • 参数
    • sensorInfo:输出参数,传感器信息数组指针
    • count:输出参数,传感器数量
  • 返回值:成功返回0,失败返回错误码
  • 异常处理:参数为空时返回SENSOR_ERROR_INVALID_PARAM
5.1.2 传感器控制接口

ActivateSensor

int32_t ActivateSensor(int32_t sensorTypeId, SensorUser *user);
  • 功能:激活指定的传感器
  • 参数
    • sensorTypeId:传感器类型ID
    • user:传感器用户信息
  • 返回值:成功返回0,失败返回错误码
  • 异常处理:传感器ID无效时返回SENSOR_ERROR_INVALID_ID

DeactivateSensor

int32_t DeactivateSensor(int32_t sensorTypeId, SensorUser *user);
  • 功能:停用指定的传感器
  • 参数:同ActivateSensor
  • 返回值:成功返回0,失败返回错误码
5.1.3 数据订阅接口

SubscribeSensor

int32_t SubscribeSensor(int32_t sensorTypeId, SensorUser *user);
  • 功能:订阅传感器数据
  • 参数
    • sensorTypeId:传感器类型ID
    • user:包含回调函数的用户信息
  • 返回值:成功返回0,失败返回错误码
  • 异常处理:回调函数为空时返回SENSOR_ERROR_INVALID_PARAM

UnsubscribeSensor

int32_t UnsubscribeSensor(int32_t sensorTypeId, SensorUser *user);
  • 功能:取消订阅传感器数据
  • 参数:同SubscribeSensor
  • 返回值:成功返回0,失败返回错误码
5.1.4 参数配置接口

SetBatch

int32_t SetBatch(int32_t sensorTypeId, SensorUser *user, int64_t samplingInterval, int64_t reportInterval);
  • 功能:设置传感器的采样间隔和报告间隔
  • 参数
    • sensorTypeId:传感器类型ID
    • user:用户信息
    • samplingInterval:采样间隔(纳秒)
    • reportInterval:报告间隔(纳秒)
  • 返回值:成功返回0,失败返回错误码

SetMode

int32_t SetMode(int32_t sensorTypeId, SensorUser *user, int32_t mode);
  • 功能:设置传感器的数据报告模式
  • 参数
    • sensorTypeId:传感器类型ID
    • user:用户信息
    • mode:报告模式(SENSOR_DEFAULT_MODE等)
  • 返回值:成功返回0,失败返回错误码

5.2 数据交换接口

5.2.1 传感器数据类型

SensorTypeId枚举

typedef enum SensorTypeId {SENSOR_TYPE_ID_ACCELEROMETER = 1,          // 加速度传感器SENSOR_TYPE_ID_GYROSCOPE = 2,              // 陀螺仪SENSOR_TYPE_ID_AMBIENT_LIGHT = 5,          // 环境光传感器SENSOR_TYPE_ID_MAGNETIC_FIELD = 6,         // 磁力计SENSOR_TYPE_ID_BAROMETER = 8,              // 气压计SENSOR_TYPE_ID_TEMPERATURE = 9,            // 温度传感器// ... 更多传感器类型
} SensorTypeId;

SensorMode枚举

typedef enum SensorMode {SENSOR_DEFAULT_MODE = 0,   // 默认模式SENSOR_REALTIME_MODE = 1,  // 实时模式SENSOR_ON_CHANGE = 2,      // 变化时报告SENSOR_ONE_SHOT = 3,       // 单次报告SENSOR_FIFO_MODE = 4,      // FIFO模式
} SensorMode;
5.2.2 回调函数接口

RecordSensorCallback

typedef void (*RecordSensorCallback)(SensorEvent *event);
  • 功能:传感器数据回调函数
  • 参数event - 传感器事件数据
  • 说明:当传感器数据到达时,系统会调用此回调函数

5.3 接口调用时序图

客户端应用传感器代理传感器服务传感器驱动1. GetAllSensors()2. IPC调用3. 查询传感器列表4. 返回传感器信息5. 返回结果6. 返回传感器列表7. SubscribeSensor()8. IPC调用9. 注册回调10. 注册成功11. 返回成功12. 订阅成功传感器数据到达13. 传感器数据到达14. 数据回调15. 接收数据客户端应用传感器代理传感器服务传感器驱动

6. 总结

传感器轻量级服务模块作为OpenHarmony系统传感器子系统的核心组件,采用了分层架构设计,通过代理模式实现了客户端与服务端的解耦,使用回调机制支持异步数据推送。该模块具有良好的可扩展性和可维护性,能够满足轻量级系统对传感器服务的需求。

模块的主要特点包括:

  1. 轻量级设计:资源占用小,适合mini系统
  2. 标准化接口:提供统一的C API接口
  3. 异步处理:支持回调机制和事件驱动
  4. 多用户支持:支持多个客户端并发访问
  5. 错误处理:完善的错误处理和状态管理机制

该模块为上层应用提供了完整的传感器数据访问能力,是构建传感器相关应用的重要基础组件。

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

相关文章:

  • 面向服务架构(SOA)模式全解析:设计、实践与价值
  • HTML 零基础入门到实战:从骨架到页面的完整指南
  • 【Java EE进阶 --- SpringBoot】Mybatis操作数据库(进阶)
  • 成都海鸥手表网站crm系统的销售管理功能包括
  • 『 QT 』QT信号机制深度解析
  • stp,rstp,mstp的区别
  • 海外盲盒APP开发:从“未知”到“精准”的用户体验革命
  • 网站建设yuanmus站长工具seo综合查询5g
  • 使用 IntelliJ IDEA 结合 DBeaver 连接 MySQL 数据库并实现数据增删查改的详细步骤:
  • 零知IDE——基于STM32F407VET6和ESP-01的SHT2X温湿度监测与云传输系统
  • 记一次生产服务器磁盘I/O性能瓶颈与负载过高分析与处理
  • MEMS加速度计深度解析:从智能手机到结构健康监测
  • LLMs-from-scratch(dataloader)
  • 兴义哪有做网站婚纱影楼网站源码
  • C++_394_tableWidget控件,两种模式,1、行显示模式 2、网格显示模式
  • MyBatis拦截器实现saas租户同库同表数据隔离
  • 求n以内最大的k个素数以及它们的和
  • 手机 网站建设在线自动取名网站怎么做
  • PHP电动汽车租赁管理系统-计算机毕业设计源码35824
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十二)Python3编程之python基础
  • 大型网站怎样做优化PHP营销推广的主要方法
  • 【泛3C篇】AI深度学习在手机前/后摄像头外观缺陷检测应用方案
  • 建设网站需要申请网站建设与管理专业好找工作吗
  • 绿色在线网站模板下载工具别人做的网站不能用怎么办
  • Initiater for mac 小巧的菜单栏OCR工具
  • ntfs可以用在mac上吗?3 种实用方案,解决Mac与NTFS硬盘兼容问题
  • 数据结构——二十、树与森林的遍历
  • 洛杉矶服务器常见问题汇总与解决方案大全
  • Linux云计算基础篇(27)-NFS网络文件系统
  • Mac安装使用Gradle