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

news2024/11/26 11:41:57

元旦快乐,再见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.UIAbilityContext
  let want: Want = {
    // Ability所在的应用Bundle名称
    bundleName: BUNDLE_NAME,
    // 待启动Ability名称
    abilityName: 'MainAbility',
    // Ability的设备ID
    deviceId: 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.coloradmin.cn/o/1349716.html

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

相关文章

c++对c的加强

目录 提出了命名空间的概念 实用性增强 register关键字增强 变量检测增强 struct类型加强 C中所有的变量和函数都必须有类型 新增bool数据类型 提出了命名空间的概念 命名空间将全局作用域分成不同的部分 不同命名空间中的标识符可以同名而不会发生冲突 命名空间可以相互…

buildadmin实现多级关联下拉效果

文章目录 最终效果开始重新渲染组件编辑渲染完结 最终效果 开始 popupForm.vue代码 <FormItem :label"t(interior.interiorApply.interior_index_id)" type"remoteSelect"v-model"baTable.form.items!.interior_index_id" prop"interi…

Friedman检验及后续Nemenyi检验可视化

文章目录 Friedman 检验Nemeny检验 合作推广&#xff0c;分享一个人工智能学习网站。计划系统性学习的同学可以了解下&#xff0c;点击助力博主脱贫( •̀ ω •́ )✧ Friedman 检验 弗里德曼检验&#xff08;Friedman test&#xff09;是一种非参数统计检验方法&#xff0c;用…

VMware15安装Linux,CentOS-7x86_64

最近面试遇到很多Linux&#xff0c;咱就是实在糊弄不过去了&#xff0c;学一下吧 下载网站&#xff0c;官网&#xff1a;https://www.centos.org/download/ 第一步&#xff1a;点击x86_64 第二步&#xff1a;随便选个国内源&#xff0c;我选的清华 第三步&#xff1a;等待下…

【LeetCode每日一题】1599. 经营摩天轮的最大利润(模拟)—2024新年快乐!

2024-1-1 文章目录 [1599. 经营摩天轮的最大利润](https://leetcode.cn/problems/maximum-profit-of-operating-a-centennial-wheel/)思路&#xff1a; 1599. 经营摩天轮的最大利润 思路&#xff1a; 1.对摩天轮的运转情况进行模拟&#xff0c; 2.遍历数组&#xff0c;分别计…

SpringBoot灵活集成多数据源(定制版)

如来说世界&#xff0c;非世界&#xff0c;是名世界 如来说目录&#xff0c;非目录&#xff0c;是名目录 前言前期准备代码实现演示扩展 前言 本篇博客基于SpringBoot整合MyBatis-plus&#xff0c;如果有不懂这个的&#xff0c; 可以查看我的这篇博客&#xff1a;快速CRUD的秘诀…

云计算复习提纲

第一章 大数据的概念&#xff1a;海量数据的规模巨大到无法通过目前主流的计算机系统在合理时间内获取、存储、管理、处理并提炼以帮助使用者决策 大数据的特点&#xff1a;①数据量大&#xff0c;存储的数据量巨大&#xff0c;PB级别是常态&#xff1b;②多样&#xff0c;数…

SpringBoot自动配置原理和自定义启动器

1、自动配置的原理 项目在加载上下文时&#xff0c;会根据SpringBootApplication注解运行。该注解中有一个CompoentScan注解&#xff0c;会扫描和加载当前启动类所在的目录&#xff0c;以及所有的子目录&#xff1b;还有一个是EnableAutoConfiguration注解&#xff0c;这个注解…

nginx 多端口部署多站点

目录 1.进行nginx.conf 2.复制粘贴 3.修改端口及站点根目录 4. 网站上传 1.进行nginx.conf 在 nginx 主要配置文件 nginx.conf 中&#xff0c;server 是负责一个网站配置的&#xff0c;我们想要多个端口访问的话&#xff0c;可以复制多个 server 先进入到 nginx.conf 中 …

鸿蒙 DevEco Studio 3.1 入门指南

本文主要记录开发者入门&#xff0c;从软件安装到项目运行&#xff0c;以及后续的学习 1&#xff0c;配置开发环境 1.1 下载安装包 官网下载链接 点击立即下载找到对应版版本 下载完成&#xff0c;按照提示默认安装即可 1.2 下载SDK及工具链 运行已安装的DevEco Studio&…

Rust学习笔记005:结构体 struct

在 Rust 中&#xff0c;struct 是一种用于创建自定义数据类型的关键字&#xff0c;它允许你定义和组织数据的结构。struct 可以包含多个不同类型的字段&#xff08;fields&#xff09;&#xff0c;每个字段都有一个名称和一个类型。 定义结构体 下面是一个简单的例子&#xff…

【我与CSDN的128天】相识相知相守

目录: 相识相知相守 相识 为什么选择写博客? 写博客的目的,我觉得是因为想要记录。记录学习的过程,整理学过的知识,方便今后的复习。 更重要的是热爱分享,分享给别人知识也是一种快乐。 在某一瞬间教会某一个你不认识的人,难道不是一个很酷的事情吗? 为什么选择CSDN? 作…

系列四、Eureka自我保护

一、Eureka自我保护 1.1、故障现象 保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式&#xff0c;Eureka Server将会尝试保护其服务注册表中的信息&#xff0c;不再删除服务注册表中的数据&#xff0c;也就是不会注销任何微服务。如…

PACC:数据中心网络的主动 CNP 生成方案

PACC&#xff1a;数据中心网络的主动 CNP 生成方案 文章目录 PACC&#xff1a;数据中心网络的主动 CNP 生成方案PACC算法CNP数据结构PACC参数仿真结果参考文献 PACC算法 CNP数据结构 PACC参数 仿真结果 PACC Hadoop Load0.2 的情况&#xff1a; PACC Hadoop Load0.4 的情况&a…

2023海内外零知识证明学习资料汇总(一)(故事中的零知识证明篇)

工欲善其事,必先利其器 Web3开发中&#xff0c;各种工具、教程、社区、语言框架.。。。 种类繁多&#xff0c;是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役&#xff1f; 参见另一篇博文&#x1f449; 2024最全面且有知识深度的web3开发工具、web3学习项目…

Head First Design Patterns - 装饰者模式

什么是装饰者模式 装饰者模式动态地将额外责任附加到对象上。对于拓展功能&#xff0c;装饰者提供子类化的弹性替代方案。 --《Head First Design Patterns》中的定义 为什么会有装饰者模式 根据上述定义&#xff0c;简单来说&#xff0c;装饰者模式就是对原有的类&#xff0c…

将产品手册与数字营销结合已经是一种大趋势了!

在数字化时代&#xff0c;产品手册已经不再是单一的纸质文档&#xff0c;而是成为了与数字营销策略紧密相连的重要工具。通过巧妙地将产品手册融入数字营销战略中&#xff0c;企业不仅可以更有效地推广产品&#xff0c;还能提高用户转化率&#xff0c;从而增加销售额。 | 一、产…

计算机科学速成课【学习笔记】(1)——计算机早期历史

本集课程B站链接&#xff1a; 【计算机科学速成课】[40集全/精校] - Crash Course Computer Science_哔哩哔哩_bilibili【计算机科学速成课】[40集全/精校] - Crash Course Computer Science共计40条视频&#xff0c;包括&#xff1a;1. 计算机早期历史-Early Computing、2. 电…

Vue 插槽:让你的组件更具扩展性(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Topics(动态路由)

Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列中。只不过Topic类型Exchange可以让队列在绑定路由时可以使用通配符。 *&#xff1a;匹配不多不少刚好一个单词。 #&#xff1a;匹配一个或多个词。 举例&#xff1a; audit.#可以匹配…