【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.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,无法运行,可以在预览器中查看效果

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

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

相关文章

如何调用FastGPT的API

fastGPT提供兼容OpenAI格式的接口,但是还是有一些地方需要注意 新建一个应用,可以正常测试通过后。【外部使用】【API访问】【新建一个KEY】 我们在调用FastGPT API的时候,需要传递一个chatId的参数,这个是标识同一个会话的参数…

SpringBoot+SSM项目实战 苍穹外卖(08) 用户下单支付订单 内网穿透cpolar软件 绕开微信支付实现

继续上一节的内容,本节导入地址簿功能代码,并实现用户下单和订单支付功能。 这里写目录标题 导入地址簿功能代码接口分析代码实现 用户下单接口分析代码实现 订单支付内网穿透——cpolar软件代码导入绕开微信支付实现 导入地址簿功能代码 地址簿&#x…

注册 Mongodb 官网个人账号

上文 Mongodb基础介绍与应用场景我们简单说了一下 Mongodb 的场景 那么 我们先在他的官网创建一个个人账号 我们先访问官网 https://www.mongodb.com/zh-cn 这里 我们需要注册一下 这里 我们按要求填写信息 然后 点击下面创建账户 然后 点击下面创建账户 然后 他会要求我们邮…

OSCHINA Gitee 联合呈现,《2023 中国开源开发者报告》正式发布,总结分非常帮,可以免费看的报告!

《2023 中国开源开发者报告》 详细地址: https://talk.gitee.com/report/china-open-source-2023-annual-report.pdf 不需要收费下载!! 其中大模型的部分总结的非常棒 gietee 也支持 AI 模型托管了 如何在 Gitee 上托管 AI 模型 https://…

嵌入式视频播放器(mplayer)

1.文件准备: MPlayer-1.0rc2.tar.bz2 libmad-0.15.1b.tar.gz 直接Git到本地 git clone https://gitee.com/zxz_FINE/mplayer_tarball.git 2.文件夹准备: src存放解压后的源码文件,target_Mplayer存放编译安装的目标文件 mkdir src targe…

Ethercat“APWR配置从站地址”报文分析(0x0010:0x0011)

基于IgH主站接了3个从站,分析报文。 APWR:Auto Increment Physical Write。 一条Ethercat报文中可以包含多个子报文,每个子报文的地址由ADPADO组成,ADP即16 bit High Addr,ADO即16 bit Low Addr。APWR模式下&#xff…

git rebase(变基)应用场景

文章目录 git rebase(变基)应用场景1.git rebase -i HEAD~3 git rebase(变基)应用场景 使得提交记录变得简洁 现在我们模拟我们有多次提交记录,本地仓库有三条提交 整合成一条提交记录 1.git rebase -i HEAD~3 提交记录合并 HEAD~3合并三条记录 执行之后 然后把…

Graceful Response 构建 Spring Boot 下优雅的响应处理

一、Graceful Response Graceful Response 是一个 Spring Boot 技术栈下的优雅响应处理器,提供一站式统一返回值封装、全局异常处理、自定义异常错误码等功能,使用Graceful Response进行web接口开发不仅可以节省大量的时间,还可以提高代码质…

MySQL 高级SQL语句与存储过程

MySQL 高级(进阶) SQL 语句 实验环境以下两表: use kgc; create table location (Region char(20),Store_Name char(20)); insert into location values(East,Boston); insert into location values(East,New York); insert into location values(West,Los Angele…

ORACLE Primavera P6, Unifier v23.12 系统分享

引言 根据上周的计划,我近日简单制作了一个基于ORACLE Primavera P6 EPPM 以及Unifier 最新版23.12的虚拟机演示环境,里面包括了p6 和 unifier的全套系统服务 此虚拟系统环境仅用于演示、培训和测试目的。如要在生产环境中使用此虚拟机,请您…

Git开发工具基本使用

文章目录 前言Git仓库基本概念基本环境安装清除原先配置生成秘钥配置Host添加公钥Github添加Gitee添加测试 本地仓库基本概览查看提交日志(log)版本回退添加文件至忽略列表分支分支冲突 远程仓库推送到远程仓库从远程仓库中抓取和拉取 在Idea中使用Git总结 前言 这里只是对Git…

仓储9代巷道灯接口文档-V2.0

标签注册 仓储9代巷道灯注册 磁体靠近条码所在区域附近,触发巷道灯注册到系统 注册成功:闪红灯变绿灯常亮,之后熄灭 查询巷道灯信息接口 接口地址:192.168.1.200/wms/associate/queryIndicates 请求类型:applicat…

【DevOps】搭建 项目管理软件 禅道

文章目录 1、简介2、环境要求3、搭建部署环境3.1. 安装Apache服务3.2. 安装PHP环境(以php7.0为例 )3.3. 安装MySQL服务 4、搭建禅道4.1、下载解压4.2、 配置4.2.1、 启动4.2.2、自启动4.2.3、确认是否开机启动 5、成功安装 1、简介 禅道是国产开源项目管…

堆排序(C语言版)

一.堆排序 堆排序即利用堆的思想来进行排序,总共分为两个步骤: 1. 建堆 升序:建大堆 降序:建小堆 2. 利用堆删除思想来进行排序 1.1.利用上下调整法实现堆排序 第一步:建堆 好了,每次建堆都要问自己…

Jmeter的安装与快速使用(做并发测试)

1、了解 JMeter是一款开源的性能测试工具,它主要用于模拟多种负载条件下的应用程序或服务器的性能和功能。JMeter可以发送不同类型的请求,如HTTP、HTTPS、FTP、SOAP、REST等,并且可以模拟多种负载类型,例如并发用户、线程组、定时…

【Linux常用指令】用户管理

文章目录 Linux系统目录结构Linux用户和用户组用户管理概述用户账号和用户组用户概念用户组概念 Linux用户和组的关系 Linux用户管理添加用户 useradd选项修改用户 usermod用户账号口令管理passwd删除用户 userdel Linux用户组管理添加新组groupadd修改群组groupmod删除群组gro…

传统企业转型需要怎么做?

传统企业面临着巨大的压力和挑战。在这个变革的时代,转型成为了传统企业持续发展的必由之路。本文将探讨传统企业如何成功转型,从困境中找到新的机遇,实现蜕变。 一、明晰转型目标 在转型的初期,传统企业需要明确自己的转型目标。…

RabbitMQ(七)ACK 消息确认机制

目录 一、简介1.1 背景1.2 定义1.3 如何查看确认/未确认的消息数? 二、消息确认机制的分类2.1 消息发送确认1)ConfirmCallback方法2)ReturnCallback方法3)代码实现方式一:统一配置a.配置类a.生产者c.消费者d.测试结果 …

如何保护企业数据安全

数据安全是通过采用一系列 IT 安全策略和程序来保护数字信息免遭泄露、盗窃和破坏的做法,这些策略和程序可以包括系统安全、设备管理、访问控制、审计、主动威胁搜寻、事件响应等。 组织存储和处理大量数据,例如财务记录、知识产权和客户的个人数据&…

免费邮件系统hMailServer本地部署并实现远程发送邮件

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…