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();}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java爬虫获取1688关键字接口详细解析

概述 在电商领域,获取商品信息和价格对于市场分析、价格监控和供应链管理至关重要。1688作为中国领先的B2B电商平台,提供了海量的商品数据。本文将详细介绍如何利用Java爬虫技术合法合规地获取1688商品关键字接口数据。 前期准备 Java开发环境&#x…

【漏洞复现】BIG-IP Next Central Manager OData 注入漏洞(CVE-2024-21793)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 一、漏洞概述 1.1漏洞简介 漏洞名称:BIG-IP Next Central Manager OData 注入漏洞漏洞编号:CVE-2024-21793漏洞威胁等级:超危影响范围:BIG-IP Next Central Manage…

vscode 识别git目录

vscode 偶尔无法识别使用git 新托管的项目。 以下是我提供的解决方案——重启 git.enabled VS Code配置问题: 有时候,VS Code的配置可能会导致无法识别.git文件夹。确保你的VS Code配置中启用了Git的相关功能。你可以通过”Settings”(设置…

网安瞭望台第17期:Rockstar 2FA 故障催生 FlowerStorm 钓鱼即服务扩张现象剖析

国内外要闻 Rockstar 2FA 故障催生 FlowerStorm 钓鱼即服务扩张现象剖析 在网络安全的复杂战场中,近期出现了一个值得关注的动态:名为 Rockstar 2FA 的钓鱼即服务(PhaaS)工具包遭遇变故,意外推动了另一个新生服务 Flo…

抚琴成一快-如何即兴谱例

如何即兴配套谱例 1.即兴01谱例2.即兴02谱例 1.即兴01谱例 2.即兴02谱例 慢推弦,1.5比较合适

希腊字母表

希腊字母 以下是数学和科学中常用的 希腊字母 及其用途的对照表,包括大写和小写形式: 序号字母名称发音(英文)数学与科学用途1ΑαAlphaˈlfə表示角度、系数、角速度等2ΒβBetaˈbeɪtə 或 ˈbiːtə表示系数、β辐射、概率密…

3090. 每个字符最多出现两次的最长子字符串

题目内容: 给你一个字符串 s ,请找出满足每个字符最多出现两次的最长子字符串,并返回该 子字符串 的 最大 长度。 示例 1: 输入: s "bcbbbcba" 输出: 4 解释: 以下子字符串长…

uniapp登录

第一步整登录 先整个appid APPID和APPSecret https://developers.weixin.qq.com/community/develop/article/doc/000ca4601b8f70e379febac985b413 一个账号只能整一个小程序 正确流程 调用uni.login https://juejin.cn/post/7126553599445827621 https://www.jb51.net/a…

[python]pymc3-3.11.0安装后测试代码

测试通过环境: pymc33.11.0 python3.8 测试代码: import arviz as az import matplotlib.pyplot as plt import numpy as np import pymc3 as pm RANDOM_SEED 8927 np.random.seed(RANDOM_SEED) az.style.use("arviz-darkgrid") # True p…

基于微信小程序的短视频系统(SpringBoot)+文档

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

深入理解 Linux wc 命令

文章目录 深入理解 Linux wc 命令1. 基本功能2. 常用选项3. 示例3.1 统计文件的行、单词和字符数3.2 仅统计行数3.3 统计多个文件的总和3.4 使用管道统计命令输出的行数 4. 实用案例4.1 日志分析4.2 快速统计代码行数4.3 统计单词频率 5. 注意事项6. 总结 深入理解 Linux wc 命…

HarmonyOs:创建线程的3种方式

使用Worker创建线程 基本概念:Worker主要为应用程序提供多线程运行环境,可让应用程序在执行过程中与宿主线程分离,在后台线程中运行脚本进行耗时操作,避免计算密集型或高延迟任务阻塞宿主线程。使用方法: 创建Worker线…

DataV的安装与使用(Vue3版本)

1、DataV(vue3)地址:DataV Vue3TSVite版 | DataV - Vue3 2、使用 npm install kjgl77/datav-vue3 安装 3、全局引入。 4、此时就可以按需使用了~

云原生服务网格Istio实战

基础介绍 1、Istio的定义 Istio 是一个开源服务网格,它透明地分层到现有的分布式应用程序上。 Istio 强大的特性提供了一种统一和更有效的方式来保护、连接和监视服务。 Istio 是实现负载平衡、服务到服务身份验证和监视的路径——只需要很少或不需要更改服务代码…

Flutter web - 5 项目打包优化

介绍 目前 flutter 对 web 的打包产物优化较少,存在 main.dart.js 单个文件体积过大问题,打包文件名没有 hash 值,如果有使用 CDN 会存在资源不能及时更新问题。本文章会对这些问题进行优化。 优化打包产物体积 从打包产物中可以看到其中 …

Java 8使用Stream流去除一个list中包含另一个list已存在的某个字段的对象

项目场景: 在Java中,我们经常会遇到需要对List中的数据进行操作的情况。有时候,我们需要从一个List中删除另一个List已经包含的数据。这种情况下,我们可以使用Java Stream来简洁高效地完成操作。 代码示例 假设我们有两个对象列表…

哪些产品可以做FSC森林认证?

FSC森林认证 FSC即森林管理委员会(FSC-Forest Stewardship Council)的英文缩写,一些民间环保组织、非政府组织以及社会责任感强的企业共同发起并逐渐形成了森林认证。 FSC认证是森林认证,又叫木材认证或统称为认证,是一…

KingbaseES(金仓数据库)入门学习

前言 金仓是一种多进程架构,每一个连接到服务器的会话,在服务器上面都会为该会话分配进程 图形化界面管理 新建数据库名 然后新建一个模式 再创建一个表 新建一个表,然后设置列名 记得要保存 查询数据 也可以新建数据表,用命令…

前端导出PDF的组件及方法

前端导出PDF的组件及方法 在Web应用程序中,导出PDF文件是一项常见的需求。无论是为了打印、分享还是存档,能够将网页内容转换为PDF格式都非常有用。幸运的是,前端开发者有多种方法和组件可以实现这一功能。在本文中,我们将详细介…

基于Springboot的数字科技风险报告管理系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…