【HarmonyOS开发】分布式应用的开发实践(元旦快乐)

元旦快乐,再见2023,加油2024,未来可期,愿新的一年带来健康、幸福和成功!💪 💪💪

多种设备之间能够实现硬件互助、资源共享,依赖的关键技术包括分布式软总线、分布式设备虚拟化、分布式数据管理、分布式任务调度等。

分布式软总线是手机、平板、智能穿戴、智慧屏、车机等分布式设备的通信基座,为设备之间的互联互通提供了统一的分布式通信能力,为设备之间的无感发现和零等待传输创造了条件。开发者只需聚焦于业务逻辑的实现,无需关注组网方式与底层协议。

图片

1、分布式应用框架

基于分布式的架构,我们可以实现:多端协同、跨端迁移、分布式窗口管理、分布式硬件等

https://www.51cto.com/article/694452.html

1.1 分布式架构

图片

1.2 运行视图

图片

运行时每个应用在独立的沙箱里面,彼此隔离互不影响,这样保证了系统的安全性。系统里面包含像AppSpawn负责进程的孵化,AppMS负责进程的管理,BMS(Bundle Manager Service)负责包的管理,AMS(Ability Manager Service)负责基本的组件管理,DMS(Distributed Manager Service)负责分布式业务的,是专门的一个底层的服务,我们好多上层的服务都有分布式的业务,经由它进行一个连接的业务的归一,它的主要职责包括像分布式任务管理、跨设备状态和数据同步。

2、实现分布式应用的步骤

2.1 【分布式应用】设备搜索

分布式设备搜索就是通过 @ohos.distributedHardware.deviceManager 模块提供的相关 API 查询组网内的分布式设备。

首先调用 createDistributeDeviceManager() 方法获取一个 deviceManager 实例,接下来调用该实例的相关 API 查询和监听设备的上下线状态等操作。

  • 创建deviceManager实例

  • 根据deviceManager实例搜寻设备

  • 监听设备状态

// 创建deviceManager实例
private createDeviceManager() {distributedDeviceManager.createDeviceManager(BUNDLE_NAME, (error, deviceManager) => {if(deviceManager) {this.deviceManager = deviceManager;this.searchDevice();this.monitorDevice();} else {console.log("error: " + error);}});
}// 根据deviceManager实例搜寻设备
// 文档:https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/apis/js-apis-device-manager.md/#startdevicediscovery9
private searchDevice() {if(this.deviceManager) {// 设备发现的方式(0x55: 被动, 0xAA: 主动)// 生成发现标识,随机数确保每次调用发现接口的标识不一致const subscribeId = Math.floor(Math.random() * 10000 + 1000);this.deviceManager.startDeviceDiscovery({subscribeId: subscribeId,// 设备发现的模式mode: distributedDeviceManager.DiscoverMode.DISCOVER_MODE_ACTIVE,// 设备发现的渠道(自动、蓝牙、wifi、usb)medium:distributedDeviceManager.ExchangeMedium.COAP,// 查找频率(低、中、高、超高)freq: distributedDeviceManager.ExchangeFreq.HIGH,// 是否同一账号isSameAccount: false,// 是否唤醒设备isWakeRemote: true,// 发现能力capability: distributedDeviceManager.SubscribeCap.SUBSCRIBE_CAPABILITY_DDMP});// 获取在线设备let devices = this.deviceManager.getTrustedDeviceListSync();devices.forEach((device) => {this.notifyDeviceOnline(device);});} else {this.createDeviceManager();}
}// 监听设备上下线状态
private monitorDevice() {if(this.deviceManager) {// 监听设备状态this.deviceManager.on("deviceStateChange", (data) => {if(data) {switch(data.action) {case distributedDeviceManager.DeviceStateChangeAction.ONLINE:case distributedDeviceManager.DeviceStateChangeAction.READY:this.notifyDeviceOnline(data.device);break;case distributedDeviceManager.DeviceStateChangeAction.CHANGE:case distributedDeviceManager.DeviceStateChangeAction.OFFLINE:this.notifyDeviceOffline(data.device);break;}}});// 发现设备this.deviceManager.on("deviceFound", (data) => {if(data) {this.notifyDeviceOnline(data.device);}});} else{this.createDeviceManager();}
}// 调用方法,将设备进行保存
private notifyDeviceOnline(deviceList) {AppStorage.SetOrCreate('deviceList', JSON.stringify(deviceList));
}

2.2 【分布式应用】拉起设备

当用户选择一个分布式设备后,要把这个设备拉起,需要借助 @ohos.ability.featureAbility 模块相关的 API。

// 参考:https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/apis/js-apis-app-ability-want.md/
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
import distributedUtil from '../../common/distributedStrong'const BUNDLE_NAME = 'com.example.accountbookets'
const DATA_CHANGE: string = 'accountbooketsData'async startAbility(deviceId: string | undefined) {let context = getContext(this) as common.UIAbilityContextlet want: Want = {// Ability所在的应用Bundle名称bundleName: BUNDLE_NAME,// 待启动Ability名称abilityName: 'MainAbility',// Ability的设备IDdeviceId: deviceId,// 表示WantParams描述,由开发者自行决定传入的键值对parameters: {isRemote: 'isRemote'}}// 拉起选中的设备context.startAbility(want).then((data) => {this.saveStore(DATA_CHANGE, data)})
}private saveStoreData = (key: string, data: Object) => {distributedUtil.putStoreData(DATA_CHANGE, data)
}

2.3 【分布式应用】数据管理

分布式数据管理用于实现协同计算时数据在多端设备之间的相互同步,因此需要创建一个分布式数据库来保存协同计算时数据,并通过分布式数据通信进行同步。

  • @ohos.data.distributedDataObject(分布式数据对象)

  • @ohos.data.distributedKVStore(分布式键值数据库)

// kvManager实例
private createKVManager() {distributedData.createKVManager({userInfo: {userId: User.get().getId(),userType: distributedData.UserType.SAME_USER_ID},bundleName: Constant.BUNDLE_NAME}, (error, data) => {if(data) {this.kvManager = data;}});
}// kvStore实例
private createKVStore() {if(this.kvManager) {this.kvManager.getKVStore(Constant.STORE_ID, {createIfMissing: true,encrypt: false,backup: false,autoSync: true,kvStoreType: distributedData.KVStoreType.MULTI_VERSION,securityLevel: distributedData.SecurityLevel.S0}, (error, result) => {if(result) {this.kvStore = result;}});}
}// 监听数据变化
private monitorData() {if(this.kvStore) {this.kvStore.on("dataChange", distributedData.SubscribeType.SUBSCRIBE_TYPE_REMOTE, (data) => {// received data})}
}// 向远端设备发送数据
public sendData(key: string, value: string) {if(this.kvStore) {this.kvStore.put(key, value, (error, data) => {// send data});}
}

参考:

【OpenHarmony】@ohos.data.distributedDataObject (分布式数据对象)width=device-width,initial-scale=1.0icon-default.png?t=N7T8https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/reference/apis/js-apis-data-distributedobject.md/【OpenHarmony】@ohos.data.distributedKVStore (分布式键值数据库)width=device-width,initial-scale=1.0icon-default.png?t=N7T8https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/reference/apis/js-apis-distributedKVStore.md/#ondistributeddataservicedie

2.4 【分布式应用】效果展示

图片

图片

3、设备管理(deviceManager)API的区别

startdiscovering 和 startdevicediscovery 都是用于启动分布式设备的发现过程。 

startdiscovering 是用于启动分布式设备的发现过程,这个过程会尝试连接所有可用的分布式设备。这个方法适用于需要发现所有可用的分布式设备的应用,例如音乐播放器,因为它需要连接到多个分布式设备以播放音乐。 

startdevicediscovery 是用于启动指定设备的发现过程,这个过程会尝试连接指定的分布式设备。这个方法适用于需要连接到特定的分布式设备的应用,例如计算器,因为它只需要连接到一个分布式设备进行计算。

  • @ohos.distributedDeviceManager(从API version 10开始支持)

  • @ohos.distributedHardware.deviceManager(逐渐废弃, 从API version 7开始支持)

@ohos.distributedDeviceManager (设备管理)width=device-width,initial-scale=1.0icon-default.png?t=N7T8https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/apis/js-apis-distributedDeviceManager.md/

4、设置SDK为OpenHarmony4.0.X版本

4.1 下载IDEDevEco Studio 4.0版本,安装API10的SDK

https://docs.openharmony.cn/pages/v4.0/zh-cn/release-notes/OpenHarmony-v4.0-release.md/#/配套关系

图片

4.2 配置编译的SDK版本

图片

"products": [{"name": "default","signingConfig": "default","compileSdkVersion": 10,      //指定OpenHarmony应用/服务编译时的版本"compatibleSdkVersion": 9,   //指定OpenHarmony应用/服务兼容的最低版本。"targetSdkVersion": 10,       //指定OpenHarmony应用/服务目标版本。若没有设置,默认为compatibleSdkVersion"runtimeOS": "OpenHarmony",   //指定为OpenHarmony}
]

备注:目前模拟器不支持API10,无法运行,可以在预览器中查看效果

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

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

相关文章

LM386简易OCL功放电路

LM386简易OCL功放电路是使用低功耗集成功率放大器LM386构成的OCL功放电路,电路结构简单,容易调试,非常适于自制。 电路工作原理:图中IC1和IC2是两片集成功放LM386,接成OCL电路。C1起到电源滤波及退耦作用,C…

WPF+Halcon 培训项目实战 完结(13):HS 鼠标绘制图形

文章目录 前言相关链接项目专栏运行环境匹配图片矩形鼠标绘制Halcon添加右键事件Task封装运行结果个人引用问题原因推测 圆形鼠标绘制代码运行结果 课程完结: 前言 为了更好地去学习WPFHalcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视…

记一次Oracle Cloud计算实例ssh恢复过程

#ssh秘钥丢失# , #Oracle Cloud# 。 电脑上的ssh秘钥文件不知道什么时候丢失了,直到用的时候才发现没有了,这下可好,Oracle Cloud的计算实例连不上了,这个实例只能通过ssh连接上去: 以下是解决步骤&#x…

【PTA-C语言】编程练习6 - 结构体与共用体 - 函数题

如果代码存在问题,麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习6 - 结构体与共用体 - 编程题 7-1 查找书籍(分数 20)7-2 一帮一(分数 15)7-3 计算职工工资(分数 15) 7-1 查找书籍&#xff08…

72内网安全-域横向CSMSF联动及应急响应知识

拿到才行,拿不到就是多余的 案例一MSF&CobaltStrike 联动 Shell 有一些功能可能cs或者msf强大一些,他们两个可以相互调用,在真实情况下也是可以cs和msf同时启动的, cs移交给msf .创建Foreign监听器 “Listeners”“Add”…

Portraiture4.1汉化版PS磨皮插件(支持原生m1芯片m2)

Portraiture汉化版PS磨皮插件。本期推荐一款全新ai算法ps2024中文汉化版ps磨皮插件Portraiture 4.1.2美颜滤镜安装包最新版ps调整肤色插件! 全新Portraiture 4.1.2版本PS人像修图美颜磨皮插件,升级AI算法,并支持多人及全身磨皮美化模式,推荐…

Python爬虫---selenium基本使用

为什么使用selenium? 使用urllib.request.urlopen()模拟浏览器有时候获取不到数据,所以使用selenium (1) selenium是一个用于web应用程序测试的工具 (2) selenium 测试直接运行在浏览器中,就像真正的用户在操作一样 (3) 支持通过各种driver (FirfoxDri…

appium入门基础

介绍 appium支持在不同平台的UI自动化,如web,移动端,桌面端等。还支持使用java,python,js等语言编写自动化代码。主要用于自动化测试脚本,省去重复的手动操作。 Appium官网 安装 首先必须环境有Node.js用于安装Appium。 总体来…

c盘扩容时,d盘无法删除卷问题

C盘扩容时,磁盘管理中D盘右键无法删除卷的原因 首先,D盘下文件夹为空,但是显示可用空间不是100%,经过排查,发现是虚拟内存设置在了D盘导致无法删除卷,这里只需要将虚拟内存放到其他盘,如E盘即可…

骑砍战团MOD开发(29)-module_scenes.py游戏场景

骑砍1战团mod开发-场景制作方法_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Cw411N7G4/ 一.骑砍游戏场景 骑砍战团中进入城堡,乡村,战斗地图都被定义为场景,由module_scenes.py进行管理。 scene(游戏场景) 天空盒(Skyboxes.py) 地形(terrain code) 场景物(scene_…

Halcon闭运算closing

Halcon闭运算 文章目录 Halcon闭运算 闭运算的计算步骤,为先膨胀,后腐蚀。这两步操作能将看起来很接近的元素,如区域内部的空洞或外部孤立的点连接成一体,区域的外观和面积也不会有明显的改变。通俗地说,就是类似于“填…

Linux:/proc/sys/vm/目录各文件详解

目录 前言一、/proc/sys/vm/目录各文件二、相关功能的API函数 前言 /proc/sys/vm/ 目录是 Linux 系统中的一个特殊目录,它包含了与虚拟内存子系统相关的系统内核参数。这些参数可以用来配置系统的虚拟内存管理策略,包括内存分配、页面置换、内存压缩、NU…