【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.mzph.cn/news/591886.shtml

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

相关文章

机器学习基本概念及模型简单代码(自用)

监督学习 监督学习是机器学习的一种方法,其中我们教导模型如何做出预测或决策,通过使用包含输入和对应输出的已标注数据集进行训练。这种方法的关键特点是利用这些标注数据**(即带有正确答案的数据)**来指导模型的学习过程。 一言…

uni-app 前后端调用实例 基于Springboot 数据列表显示实现

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

【ArcGIS微课1000例】0084:甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)

甘肃积石山地震震中100km范围内历史灾害点分布图(2005-2020)。 文章目录 一、成果预览二、实验数据三、符号化四、地图整饰一、成果预览 本实验最终效果图如下所示: 二、实验数据 以下数据可以从本专栏配套的实验数据包中0084.rar中获取。 1. 历史灾害数据。为2005-2020时…

深度学习|10.5 卷积步长 10.6 三维卷积

文章目录 10.5 卷积步长10. 6 三维卷积![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b5bfa24f57964b0f81f9602f5780c278.png) 10.5 卷积步长 卷积步长是指每计算一次卷积,卷积移动的距离。 设步长为k,原矩阵规模为nxn,核矩阵…

BIOS:计算机中的特洛伊木马

内容概述: 由于主板制造商在计算机启动时用来显示品牌徽标的图像分析组件相关的问题,多个安全漏洞(统称为 LogoFAIL)允许攻击者干扰计算机设备的启动过程并安装 bootkit。x86 和 ARM 设备都面临风险。主板固件供应链安全公司 Bin…

valgrind跨平台调试及其问题分析

背景 同事在项目中遇到了内存泄漏问题,长时间没有解决,领导临时让我支援一下。心想,应该不难,毕竟我之间做过valgrind的使用总结。并输出内存泄漏问题分析思路(案例篇)和快速定位内存泄漏的套路两篇文章&a…

【C语言】Ubuntu 22上用GTK写GUI程序

一、GTK介绍 GTK (GIMP Toolkit) 是一个多平台的图形用户界面工具包。它最初是为图像处理程序 GIMP 开发的,后来演变成为许多操作系统上开发图形界面应用程序的通用库。GTK 是用C语言编写的,并且是自由和开源软件,遵循LGPL (GNU Lesser Gene…

三菱MR-JE伺服脉冲轴应用参数设置

三菱MR-JE伺服在脉冲轴控制上的应用,常用参数设置如下: 1、常用参数 未完...

Linux用shell脚本执行乘法口诀表的两种方式

#!/bin/bash # *********************************************************# # # # * Author : 藻头男 # # * QQ邮箱 : 2322944912qq.com # …

nginx 配置代理ip访问https的域名配置

前言 代理服务器是一种中间服务器,用于转发客户端请求到目标服务器。Nginx是一款高性能的Web服务器和反向代理服务器,可以用于配置代理IP访问HTTPS的域名。在本篇文章中,我们将介绍如何使用Nginx配置代理IP访问HTTPS域名,并提供相…

代码训练营Day.21 | 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先

530. 二叉搜索树的最小绝对差 1. LeetCode链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 2. 题目描述 3. 解法 中序遍历,记录前一个指针,并记录前一个指针和当前指针的绝对差值。递归。 class Solution { public:Tre…

Javascript 循环结构while do while for实例讲解

Javascript 循环结构while do while for实例讲解 目录 Javascript 循环结构while do while for实例讲解 一、while语句 二、do…while语句 三、for循环 疑难解答 我们从上一节课知道,JavaScript循环结构总有3种: (1)while语…

ARM CCA机密计算硬件架构之内存管理

实施了TrustZone安全扩展的Arm A-profile处理器呈现两个物理地址空间(PAS): 非安全物理地址空间安全物理地址空间Realm管理扩展增加了两个PAS: Realm物理地址空间Root物理地址空间下图显示了这些物理地址空间以及如何在工作系统中实施这些空间: 正如表格所示,根状态能够访…

openssl 命令详解

openssl genrsa 命令产生私钥 openssl genrsa 命令是会用来生成 RSA 私有秘钥,不会生成公钥,因为公钥提取自私钥。生成时是可以指定私钥长度和密码保护。 如果需要查看公钥或生成公钥,可以使用 openssl rsa 命令。 命令语法: ope…

Vue3全局属性app.config.globalProperties

文章目录 一、概念二、实践2.1、定义2.2、使用 三、最后 一、概念 一个用于注册能够被应用内所有组件实例访问到的全局属性的对象。点击【前往】访问官网 二、实践 2.1、定义 在main.ts文件中设置app.config.globalPropertie import {createApp} from vue import ElementPl…

会声会影2023渲染闪退怎么办

​ 会声会影2023是一款功能强大,操作简单的视频剪辑软件。在使用会声会影剪辑视频后,我们要对视频进行渲染,有时会出现渲染到一半闪退,或是帧不可读的问题,那么遇到这些情况我们该怎么办呢?下面将为大家介绍…

ssm基于冲突动态监测算法的健身房预约系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装健身房预约系统软件来发挥其高效地信息处理的作用&#xff…

攻防世界easyphp解题

攻防世界easyphp解题 <?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),-6,6)){$key1 1;}else{die(&q…

PAT 乙级 1043 输出PATest

解题思路&#xff1a;对于c来说hash函数求出各个符号的数量&#xff0c;不为0时就输出即可&#xff0c;python利用字符串count函数就可以了。 c语言代码如下: #include<stdio.h> int output_c(char c,int *count) {if(*count!0){putchar(c);(*count)--;}return 1; } int…

Jenkins基础教程

目录 第一章、快速了解Jenkins1.1&#xff09;Jenkins中一些概念介绍1.2&#xff09;Jenkins和maven用途上的区别1.3&#xff09;为什么使用Jenkins1.4&#xff09;学习过程中的疑问 第二章、安装Jenkins2.1&#xff09;安装之前的准备2.2&#xff09;Windows中Jenkins下载安装…