分布式系统硬件资源池原理和接入实践

2023-12-06 18:04

本文主要是介绍分布式系统硬件资源池原理和接入实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、硬件资源池理念产生背景

随着智能设备的发展和普及,越来越多的智能设备已经深入人们的生活,比如手机,PC,平板,各类穿戴设备等。当前单个设备的外设资源已经非常丰富,硬件能力也很强大。像我们的手机、PC、平板都有相机,音频,屏幕,键鼠等各种外设资源;但是这些硬件外设是属于各个设备自身的,如果涉及到跨设备的协同操作就会比较繁琐。

比如用户正在 PC 上编辑文档,需要从平板复制一段文字,或者使用手机拍摄照片,然后插入文档作为素材,需要用户在各个设备上分别操作,然后发送文字或者图片到 PC,然后再回到 PC 进行编辑,非常繁琐。如果应用开发者从应用层实现设备间硬件能力共享,对于应用开发者工作量和难度非常大,而且各个应用之间需要重复开发,能力难以复用和继承。

图 1 单设备硬件孤立难以共享

为此,鸿蒙系统提出了硬件资源池的理念,打破了各个设备硬件的孤立状态,能够做到设备间硬件外设全局共享。我们把各个设备的硬件外设抽象为外设信息单元,外设信息在各个可信设备之间自动同步,如此,实现了外设信息的全局可见;结合分布式硬件虚拟化技术,实现任意设备之间的硬件外设能力跨设备调用;分布式硬件资源池作为系统能力下沉系统底层,北向开发者不感知资源池的存在;跨设备硬件和本地硬件使用同一套 API,开发者调用跨设备硬件体验和本地硬件一致,如此明显的便利了开发者调用跨设备硬件,开发者无需关注硬件底层细节,专注于业务创新。

图 2 硬件资源池打破硬件边界,全局共享

二、鸿蒙系统硬件资源池支持场景

鸿蒙系统采用硬件资源池的理念,能够结合多个设备的优势硬件为用户提供更优的体验,同时支持了消费者和开发者的多种创新体验。

2.1 消费者场景

在消费者层面,华为分布式硬件支持智慧办公,智慧出行等多种创新场景。例如智慧办公场景中,使用一套 PC 键鼠即可和周边平板等设备跨设备操作,使用到键鼠外设的跨设备操控能力;多屏协同场景中,手机屏幕显示到平板,手机视频通话可以使用平板的麦克风和摄像头,用户在平板上即可同时操作手机平板两台设备,避免设备间来回切换,操作方便,这个场景使用到了麦克风,扬声器,摄像头和屏幕等硬件的跨设备分布式能力。

在智慧出行场景中,用户在手机上听音乐或者视频通话,进入座舱后,手机上的音乐和通话可以自动接续到车机,使用车机的音频外设播音和拾音,使用车机的摄像头进行视频通话,更加符合用户在座舱中的使用习惯;手机导航接续到车机后,车机的 GPS 信号可以共享给手机,结合手机 GPS 信号提供更高精度的定位数据;可以看到,在智慧出行场景中,可以通过分布式硬件资源池结合手机和车机的优势硬件,为用户提供更好的服务体验。

图 3 鸿蒙硬件资源池支持各类消费者场景

2.2 开发者场景

对于开发者来说,由于分布式硬件资源池将跨设备硬件调用的复杂度都封装在了系统底层,跨设备硬件复用本地硬件的 API,开发者学习和适配难度可以做到最低。

以分布式相机为例,相机接口可以同时查询到本地相机和跨设备相机外设,本地相机和跨设备相机通过 ConnectionType.CAMERA_CONNECTION_REMOTE 属性相区分,开发者通过该属性过滤出分布式相机后,其他操作和本地相机完全一致。无需为使用跨设备硬件学习一套独立的 API,很大程度上的简化了开发者开发难度。

图 4 分布式硬件开发者使用示例

三、硬件资源池原理

以相机和音频为例,假设设备 A 和设备 B 都有各自的相机和音频外设,驱动层有对应的本地相机和本地音频驱动。

图 5 分布式硬件资源池原理示意

分布式硬件从各自设备本地采集相机和音频驱动信息,存入分布式数据库。如果 AB 两个设备建立了可信关系并且通过软总线组网上线成功,分布式数据库会在 AB 两个设备之间自动同步各自的本地外设数据信息,这样,设备 A 分布式硬件可以拿到设备 B 的相机和音频外设规格数据,同样,设备 B 也可以拿到设备 A 的相机和音频外设规格数据。

以设备 A 的流程为例,分布式硬件收到对端设备 B 的硬件规格数据后,在驱动层注册对应的虚拟相机和虚拟音频驱动,虚拟驱动相当于对端设备物理硬件在本地的代理;虚拟驱动实现和本地硬件驱动相同的 HDI 接口,区别在于,本地硬件驱动操作本地物理硬件,虚拟硬件驱动控制和数据传输通过软总线作用于对端分布式硬件。

由于和本地硬件实现同样的 HDI 接口,设备 B 相机和音频对应的虚拟硬件可以被相机服务和音频服务发现并管理,包括外设的查询,相机的预览拍照录像,音频的播放,声音的录制等功能。

对称的,在设备 B 上会执行同样的过程,为设备 A 相机和音频外设注册对应虚拟驱动,从而实现设备 B 上对设备 A 硬件外设的查询和使用。

如此就实现了外设信息在设备间互通共享,信息感知自动注册虚拟硬件,注册后即可用,成为一个无中心对称的分布式硬件外设管理系统。同时,分布式硬件框架定义了外设热插拔,虚拟硬件保活等机制,保证业务可靠性。在运行时,各个硬件外设的业务运行于独立进程中,在进程层面保证不同硬件的虚拟化业务互相隔离,提高了业务可靠性。

详细实现可以参考分布硬件管理框架源码:https://gitee.com/openharmony/distributedhardware_distributed_hardware_fwk

四、硬件资源池接入实践

4.1 接口定义

通过前文分析,可以看到分布式硬件与南向硬件的交互涉及"硬件信息采集"和"驱动注册"两类业务,与此对应,分布式硬件针对南向硬件接入定义了两类接口。一类是硬件规格采集接口,一类是驱动注册与准备接口。

图 6 分布式硬件资源池接入接口

(1)硬件规格采集接口

硬件规格采集接口定义了规格信息的采集以及外设热插拔事件监听等功能。

接口链接:https://gitee.com/openharmony/distributedhardware_distributed_hardware_fwk/blob/master/common/utils/include/ihardware_handler.h

(2)驱动注册与准备接口

由于我们是跨设备硬件调用,涉及双端设备的硬件,我们定义使用周边其他设备硬件外设的一端为 Source 端,共享本地硬件给其他设备调用的一端为 Sink 端。

驱动注册与准备接口包括 Source 和 Sink 两端。

Source 端包括初始化,释放以及虚拟驱动注册/去注册等功能;Sink 端主要是初始化和释放接口,用于响应 Source 端的控制指令,比如播放声音或者采集视频画面。在设备组网上线后,分布式硬件框架调用各个硬件类型的南向接口实现,分别初始化各类硬件的 Source 和 Sink 端业务进程,为后续的硬件跨设备调用做好准备。

Source 端接口链接:https://gitee.com/openharmony/distributedhardware_distributed_hardware_fwk/blob/master/common/utils/include/idistributed_hardware_source.h

Sink 端接口链接:https://gitee.com/openharmony/distributedhardware_distributed_hardware_fwk/blob/master/common/utils/include/idistributed_hardware_sink.h

4.2 硬件接入实例

由于分布式硬件良好的南向接入解耦设计,如果有新硬件外设接入,只需要如下三步即可,以分布式相机配置为例。

Step1:定义硬件外设类型枚举值 CAMERA。

enum class DHType : uint32_t {    UNKNOWN = 0x0,            // unknown device    CAMERA = 0x01,            // Camera    AUDIO = 0x02,             // Mic    SCREEN = 0x08,           // Display    GPS = 0x10,               // GPS    INPUT = 0x20,             // Key board    MAX_DH = 0x80000000};

文件链接:https://gitee.com/openharmony/distributedhardware_distributed_hardware_fwk/blob/master/common/utils/include/device_type.h

Step2:实现分布式硬件框架定义的南向接入接口,分别实现为三个 so。

1、实现分布式硬件框架定义的硬件规格采集接口 IHardwareHandler,并编译获得接口实现 libdistributed_camera_handler.z.so。

参考代码:https://gitee.com/openharmony/distributedhardware_distributed_camera/blob/master/services/cameraservice/cameraoperator/handler/include/dcamera_handler.h

2、实现 Source 侧接入接口 IDistributedHardwareSource,并编译获得接口实现 libdistributed_camera_source_sdk.z.so。

参考代码:https://gitee.com/openharmony/distributedhardware_distributed_camera/blob/master/interfaces/inner_kits/native_cpp/camera_source/include/dcamera_source_handler.h

3、实现 Sink 侧接入接口 IDistributedHardwareSink,并编译获得接口实现 libdistributed_camera_sink_sdk.z.so。

参考代码:https://gitee.com/openharmony/distributedhardware_distributed_camera/blob/master/interfaces/inner_kits/native_cpp/camera_sink/include/dcamera_sink_handler.h

Step3:在分布式硬件子部件配置文件中,添加新硬件外设相关配置,包括外设类型,南向接口实现的 so 名称,版本号,以及 Source 和 Sink 端服务分配的服务 Id。

● 该配置由产品定义确定,不同的产品可能使用不同的分布式能力。以 RK3568 开发板为例,配置如下:

{    "name": "distributed_camera",    "type": "CAMERA",    "comp_handler_loc": "libdistributed_camera_handler.z.so",    "comp_handler_version": "1.0",    "comp_source_loc": "libdistributed_camera_source_sdk.z.so",    "comp_source_version": "1.0",    "comp_source_sa_id": 4803,    "comp_sink_loc": "libdistributed_camera_sink_sdk.z.so",    "comp_sink_version": "1.0",    "comp_sink_sa_id": 4804}

配置链接:https://gitee.com/openharmony/device_board_hihope/blob/master/rk3568/distributedhardware/distributed_hardware_components_cfg.json

三个接口的 so 实现后,编译打包到系统库路径下,同时配置到分布式硬件部件配置文件中,设备组网上线后,可以看到分布式相机的 dcamera 进程已经成功启动,表明相机外设已经纳入资源池管理,成为分布式相机。

从下述截图也可以看到分布式硬件其他相关进程,dhardware 就是分布式硬件资源池管理框架进程,顾名思义,dcamera 是分布式相机进程,dinput 是分布式键鼠输入进程,dscreen 是分布式屏幕进程。

图 7 分布式硬件相关进程

五、社区已开源分布式硬件代码仓

当前在 OpenHarmony 开源社区,已经开源了硬件资源池管理框架,分布式相机,分布式音频,分布式屏幕,分布式输入的代码仓,开放了相机,音频,屏幕和键鼠输入外设的跨设备控制源码,关于硬件资源池的详细实现,可以参考我们的开源代码仓。

1、  分布式硬件框架(distributedhardware_distributed_hardware_fwk)https://gitee.com/openharmony/distributedhardware_distributed_hardware_fwk

2、分布式相机(distributedhardware_distributed_camera)

https://gitee.com/openharmony/distributedhardware_distributed_camera

3、分布式音频(distributedhardware_distributed_audio)

https://gitee.com/openharmony/distributedhardware_distributed_audio

4、分布式屏幕(distributedhardware_distributed_screen)

https://gitee.com/openharmony/distributedhardware_distributed_screen

5、分布式输入(distributedhardware_distributed_input)https://gitee.com/openharmony/distributedhardware_distributed_input

这篇关于分布式系统硬件资源池原理和接入实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/462765

相关文章

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项