OpenHarmony的分布式服务框架介绍与实现解析

在这里插入图片描述

OpenHarmony的分布式服务框架是一个用于实现设备间高效协作与资源共享的重要架构,以下是其详细介绍:

框架概述

  • OpenHarmony的分布式服务框架基于分布式软总线、分布式数据管理、分布式Profile等技术特性,构建了统一的分布式服务管理机制,包括服务的发现、同步、注册、调用等功能,支持对跨设备的应用进行远程启动、远程调用、绑定/解绑以及迁移等操作.
  • 它使得不同设备能够像一个整体一样协同工作,打破了设备之间的物理界限,为用户提供更加自然流畅的分布式体验,比如实现多设备协同编辑文档、跨设备投屏等功能.

核心组成部分及源代码说明

设备与服务管理
  • 设备的表示与识别:在代码中,通过特定的结构体来表示设备信息。例如,DeviceInfo结构体定义了设备的各种属性,如设备ID、帐户哈希码、设备类型、设备名称、在线状态等.
typedef struct {
    char deviceId[DEVICE_ID_LENGTH];
    char accountHashCode[ACCOUNT_HASH_CODE_LENGTH];
    DeviceType deviceType;
    char deviceName[DEVICE_NAME_LENGTH];
    bool online;
    int availableConnectionCount;
    ConnectionAddr connectionInfo;
    DataBitMap capabilityBitmapArray[MAX_CAPABILITY_BITMAP_COUNT];
    char customData[MAX_CUSTOM_DATA_LENGTH];
    int distance;
} DeviceInfo;
  • 服务的注册与发布:设备上的服务通过调用相关函数向框架注册和发布自身。比如,PublishService函数用于发布服务,使得其他设备可以发现该服务,其函数原型如下 :
int PublishService(const char* serviceId, const PublishInfo* publishInfo);

其中,serviceId是服务的唯一标识符,publishInfo是一个包含发布模式、发布介质、发布频率等信息的结构体,用于详细描述服务的发布特性.

远程服务调用
  • 接口定义与实现:定义远程服务接口,供其他设备调用。以一个简单的加法服务为例,其接口定义如下 :
public interface IRemoteService extends IRemoteBroker {
    int add(int a, int b);
}

public class RemoteServiceStub extends RemoteObject implements IRemoteService {
    public RemoteServiceStub() {
        super();
    }

    @Override
    public int add(int a, int b) {
        return a + b;
    }
}

这里,IRemoteService接口定义了add方法,RemoteServiceStub类实现了该接口,具体实现了加法操作。

  • 代理与通信:为了在不同设备间进行通信,引入服务代理。服务代理负责与远程设备进行通信,并将请求转发给相应的服务提供者。以下是服务代理的部分代码示例 :
public class RemoteServiceProxy implements IRemoteService {
    private static final String DESCRIPTOR = "example.RemoteService";
    private OHOSBinder remote;

    public RemoteServiceProxy(OHOSBinder remote) {
        this.remote = remote;
    }

    @Override
    public int add(int a, int b) {
        MessageParcel data = MessageParcel.obtain();
        MessageParcel reply = MessageParcel.obtain();
        int result = 0;
        try {
            data.writeInt(a);
            data.writeInt(b);
            remote.sendRequest(0, data, reply, new MessageOption());
            result = reply.readInt();
        } finally {
            data.reclaim();
            reply.reclaim();
        }
        return result;
    }

    @Override
    public OHOSBinder asObject() {
        return remote;
    }
}

RemoteServiceProxyadd方法中,通过MessageParcel来封装请求参数,并使用remote.sendRequest发送请求到远程设备,然后获取并返回响应结果 。

数据传输与同步
  • 数据传输接口:分布式服务框架提供了统一的数据传输接口,用于设备间的数据交互。例如,session.h头文件中声明了创建和删除会话服务器、打开和关闭会话、接收数据和查询基本会话信息等接口.
int CreateSessionServer(const char* sessionName, const SessionServerConfig* config);
int RemoveSessionServer(const char* sessionName);
int OpenSession(const char* sessionName, const ConnectionAddr* peerAddr, Session* session);
int CloseSession(Session* session);
int ReceiveData(Session* session, void* buffer, int bufferLen);
int QuerySessionInfo(Session* session, SessionInfo* info);

这些接口在设备发现其他设备并建立连接后,可用于跨设备传输各种数据,如文本、图像、音频等。

  • 数据同步机制:框架还支持数据的同步操作,确保不同设备上的数据一致性。例如,在分布式数据管理模块中,通过相关的函数和数据结构来实现数据的同步更新,当一处数据发生变化时,能够及时通知并更新到其他相关设备上,具体代码可参考分布式数据管理模块的相关源码,其实现涉及到数据的监听、比对、更新等复杂逻辑,以保证数据在多设备环境下的一致性和完整性.

服务发现与连接

  • 设备发现:利用如CoAP协议等多种通信协议实现设备的自动发现。在discovery_service.h头文件中定义了相关的设备发现函数,如StartDiscoveryStopDiscovery,设备通过调用这些函数来开始或停止发现附近的设备 :
int StartDiscovery(const DiscoveryOption* option);
int StopDiscovery();
  • 连接建立:在发现设备后,会进行安全认证等处理,以确保连接的安全性,然后建立连接链路。连接相关的代码主要在connection模块中,通过一系列函数来管理和维护设备间的连接,如ConnectDevice函数用于发起设备连接操作,其内部实现了连接的建立、参数配置、状态监测等功能.
int ConnectDevice(const char* deviceId, const ConnectionOption* option);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/941575.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

360pika—弹性 KV 数据存储系统入门安装使用

一、简介 github官网说Pika 是一个高性能、大容量、多租户、数据持久化的弹性 KV 数据存储系统,使用 RocksDB 作为存储引擎。它完全兼容 Redis 协议,并支持其常用的数据结构,如字符串/哈希/列表/有序集合/集合/地理位置/HyperLogLog/发布-订阅/位图/数据流等。 二、对标啥能干…

springboot中使用gdal将表中的空间数据转shapefile文件

springboot中使用gdal将表中的空间数据转shapefile文件 代码: // 样本导出-将样本表导出为shapefile,复制样本shp文件到临时目录下 sampleDir是文件夹pathpublic void setYbShapeFile(Yb yb, File sampleDir) {// 创建 前时项 和 后时项 文件夹File y…

【学习笔记】蒙特卡洛与强化学习

视频链接:https://www.bilibili.com/video/BV1SV4y1i7bW 文章目录 [蒙特卡洛方法] 02 重要性采样(importance sampling)及 python 实现Basics实现重要性采样 [蒙特卡洛方法] 03 接受/拒绝采样(accept/reject samping)初…

查看MySQL存储引擎方法,表操作

修改数据库表存储引擎 show create table dept; show table status from itpux where name s2\G; select * from information_schema.TABLES where table_schemaitpux and table_names3; 查询整个mysql里面存储引擎是innodb/myisam的表 建表时候要写好存储引擎 -- 创建表 -- 表…

项目亮点案例

其实对我来说是日常操作,但是如果在面试的时候面试者能把日常的事情总结好发出来,其实足矣。 想让别人认同项目,选取的示例需要包含以下要素: 亮点项目四要素:明确的目标,问题点,解决方法和结果…

MyBatis通过注解配置执行SQL语句原理源码分析

文章目录 前置准备流程简要分析配置文件解析加载 Mapper 接口MapperAnnotationBuilder解析接口方法注解parseStatement 方法详解MapperBuilderAssistant 前置准备 创建一个mybatis-config.xml文件&#xff0c;配置mapper接口 <mappers><!--注解配置--><mapper…

蓝桥杯物联网开发板硬件组成

第一节 开发板简介 物联网设计与开发竞赛实训平台由蓝桥杯大赛技术支持单位北京四梯科技有限公司设计和生产&#xff0c;该产品可用于参加蓝桥杯物联网设计与开发赛道的竞赛实训或院校相关课程的 实践教学环节。 开发板基于STM32WLE5无线微控制器设计&#xff0c;芯片提供了25…

常用矢量图标库

常用矢量图标库 1. iconfont 阿里巴巴旗下的矢量图标素材库&#xff1b;很强大且图标内容很丰富的矢量图标库,提供矢量图标下载&#xff08;AI / SVG / PNG / 代码格式&#xff09;、在线存储等功能&#xff0c;支持按路径改变 icon 颜色。 iconfont 网址 设备图标 2. IconP…

Unity动态读取外部图片转Texture2D,内存过大问题解决方案

问题描述 加载原始图片2.63M的图片,分辨率为3023*4032,占用内存108.5M 加载原始图片12.6 M的图片,分辨率为6000*8000,占用内存427.2M 太恐怖了吧 解决方案 1.加载完图片,等比缩放,宽高改为1024或者512以下 1024占用5.2M,512占用1.3M,相比小了很多 2.原始Texture2…

在Visual Studio 2022中配置C++计算机视觉库Opencv

本文主要介绍下载OpenCV库以及在Visual Studio 2022中配置、编译C计算机视觉库OpenCv的方法 1.Opencv库安装 ​ 首先&#xff0c;我们需要安装OpenCV库&#xff0c;作为一个开源库&#xff0c;我们可以直接在其官网下载Releases - OpenCV&#xff0c;如果官网下载过慢&#x…

【AIGC】ChatGPT 结构化 Prompt 的高级应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;标识符的使用&#xff08;Use of Identifiers&#xff09;1. #2. <>3. - 或 4. [] &#x1f4af;属性词的重要性和应用应用场景 &#x1f4af;具体模块…

git使用和gitlab部署

1.ci,cd,DevOps ci&#xff1a;持续集成&#xff1a;开发的代码集成到代码仓库 cd&#xff1a;持续交互&#xff1a;从代码仓库拉取代码到部署到测试环境 cd&#xff1a;持续部署&#xff1a;从代码仓库拉取代码到部署到生产环境 DevOps:开发写完的代码自动集成&#xff0c…

学习因子异步化的粒子群优化算法(AsyLnCPSO)——源码

目录 1. 学习因子异步化的概念 2. 算法步骤 2.1 初始化 2.2 迭代过程 3.优势 4. 与传统粒子群算法的区别 5.代码下载&#xff1a; 学习因子异步化的粒子群优化算法&#xff08;AsyLnCPSO&#xff09;是一种改进的粒子群优化&#xff08;PSO&#xff09;算法&#xff0c;…

BEVFormer论文总结

BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers BEVFormer&#xff1a;利用时空变换从多相机图像中学习鸟瞰表示 研究团队&#xff1a;南京大学、上海AI实验室、香港大学 ​ 代码地址&#xff1a;https://g…

ABAQUS纤维混凝土冲击破坏三维模型

纤维混凝土作为土木工程领域常用的复合材料具备良好的抗裂性及抗冲击性能&#xff0c;纤维混凝土在荷载下的破坏行为及本构关系对其应用范围具有重要影响。本案例通过AutoCAD随机三维纤维插件建立随机投放的圆柱体纤维模型&#xff0c;并将模型导入ABAQUS内&#xff0c;通过混凝…

selenium学习笔记(一)

文章目录 前言一、selenium的简介java使用seleniumPython使用selenium常用的浏览器selenium的功能 二、chromeDriver的安装查看本机的chrome版本&#xff1f;匹配对应的chromedriver并下载在服务器上例如Centos如何安装Chrome 三、selenium内容详解chrome启动chrome启动参数元素…

如何利用Java爬虫按关键字搜索苏宁易购商品

在信息技术飞速发展的今天&#xff0c;数据的获取和分析对于企业决策、市场研究和用户行为分析至关重要。本文将介绍如何使用Java编写爬虫程序&#xff0c;通过关键字搜索苏宁易购的商品&#xff0c;并获取搜索结果。 1. 爬虫简介 爬虫是一种自动化程序&#xff0c;用于从互联…

网页生成鸿蒙App

如何网页生成鸿蒙App 纯鸿蒙发布后&#xff0c;鸿蒙App需求上升。如何快速生成鸿蒙App。变色龙云(http://www.appbsl.cn)推出了鸿蒙App打包服务。可以在线自动打包鸿蒙App。 第一步 创建应用 输入网站网址&#xff0c;上传图标。 第二步 生成鸿蒙证书 打开华为开发者管理中…

【Linux进程】进程间通信(共享内存、消息队列、信号量)

目录 前言 1. System V IPC 2. 共享内存 系统调用接口 shmget ftok shmat shmdt shmctl 共享内存的读写 共享内存的描述对象 3. 消息队列 msgget msgsnd msgctl 消息队列描述对象 4. 信号量 系统调用接口 semget semctl 信号量描述对象 5. 系统层面IPC资源 6.…

endnote插参考文献【毕业论文设置】

一、GBT7714下载 https://endnote.com/downloads/styles/ 二、最新过滤器下载 Import filters - EndNote 三、设置修改 Conference Proceedings Author. Title[C]//Conference Name|. Conference Location|: Publisher|, Year of Conference|: Pages|. Thesis Author. Ti…