OpenHarmony 源码解析之分布式任务调度(一)

OpenHarmony 源码解析之分布式任务调度(一)

作者:卞绍雷 2021-11-10 16:10:18

开发

前端

分布式 为了更全面地理解与掌握分布式任务调度子系统,我先从分布式远程启动这个简单的功能开始,利用开源鸿蒙开放的源代码,进行深入学习。

[[434413]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.IDC.NET

前言

鸿蒙系统(HarmonyOS)支持在本地程序里调起远程任务,这个功能是更底层的分布式任务调度子系统支撑的,并且已经贡献到开源鸿蒙(OpenHarmony)代码里。为了更全面地理解与掌握分布式任务调度子系统,我先从分布式远程启动这个简单的功能开始,利用开源鸿蒙开放的源代码,进行深入学习。

以下行文如无特别说明,所述说的鸿蒙系统均指开源鸿蒙系统(OpenHarmony 3.0 LTS版本)。

OpenHarmony 架构图

概述

先从开源鸿蒙文档入手:

分布式任务调度模块,通过主从设备服务代理机制,在OpenHarmony操作系统上建立起分布式服务平台,支持主设备(搭载OpenHarmony的智慧屏设备)启动从设备(IP Camera、运动手表等小内存OpenHarmony设备)FA的能力。

以智慧屏节目开播提醒为例,智慧屏上在喜欢的节目菜单中,点击“开播后提醒我”按钮,等节目开播后,智慧屏会拉起运动手表上的节目开播提醒FA。通过该FA用户可以快速知道喜欢的节目已经开始,达到协同互助的作用。

FA : Feature Ability代表有界面的Ability,用于与用户进行交互。

远程启动:即跨设备启动FA,与本地启动FA相对应。

开源鸿蒙系统里的应用程序以Ability为单位,分为FA和PA, 可以简单理解为FA就是有界面的应用程序。

分布式服务平台

分布式任务调度的前提,是设备必须建立分布式服务平台,并且注册自身能力。

开源鸿蒙支持3种体量的设备:轻量、小型、标准。

在标准设备里,开源鸿蒙默认已经开启了分布式服务平台,开发者一般无需做额外工作,即可使用分布式任务调度功能。

而轻量和小型设备则需要自行在启动代码中实现分布式服务平台功能调用,具体可以参考【分布式软总线子系统】。相关代码仓及调用API可以参考:【分布式软总线】,【分布式软总线lite】。

同一个局域网

在上述代码仓的说明中,一再强调了:

需要保证发现端设备与被发现端设备在同一个局域网内

是因为目前开源鸿蒙系统使用了coap协议,并且暂时只支持coap协议。从源代码中可以看到,以后应该会扩展到BLE、USB等方式。

  1. /** 
  2.  * @brief Enumerates media, such as Bluetooth, Wi-Fi and USB, used for publishing services. 
  3.  * 
  4.  * Currently, the media can only be set to coap. 
  5.  * 
  6.  */ 
  7. typedef enum { 
  8.     /** Automatic medium selection */ 
  9.     AUTO = 0, 
  10.     /** Bluetooth */ 
  11.     BLE = 1, 
  12.     /** Wi-Fi */ 
  13.     COAP = 2, 
  14.     /** USB */ 
  15.     USB = 3, 
  16. } ExchangeMedium; 

 开源鸿蒙的coap协议默认使用的端口是5684,在局域网通过udp广播方式发布。如果调试过程中找不到设备,可以通过这个端口抓包分析。

  1. #define COAP_DEFAULT_PORT 5684 

分布式任务调度流程

手头正好有两块支持开源鸿蒙标准系统的开发板Hi3516D,因此以标准系统的分布式任务调度为例,说明开源鸿蒙系统的分布式任务调度流程。轻量系统和小型系统除了开发语言不同,基本步骤是一致的。

开源鸿蒙系统开发FA目前只支持js/eTS语言。

这个demo参考了分布式计算器,为说明方便,做了大量简化处理,并且此处忽略了错误处理。

具体api参考代码仓:DeviceManager组件。

步骤1:创建设备管理器

  1. import deviceManager from '@ohos.distributedHardware.deviceManager'
  2.  
  3. let self = this; 
  4. deviceManager.createDeviceManager("com.example.myapplication", (err, val)=>{self.deviceManager_ = val;}); 

 使用DeviceManager相关接口之前,需要通过createDeviceManager接口创建DeviceManager实例;

步骤2:获取可信设备列表

  1. var array = this.deviceManager_.getTrustedDeviceListSync(); 

步骤3:注册周边设备动态监控回调函数

  1. this.deviceManager_.on('deviceFound', (data) => { 
  2.     let extraInfo = { 
  3.         "targetPkgName"'com.example.myapplication'
  4.         "appName"'分布式例子'
  5.         "appDescription"'一个简单的分布式例子'
  6.         "business"'0' 
  7.     }; 
  8.     let authParam = { 
  9.         "authType": 1, 
  10.         "appIcon"''
  11.         "appThumbnail"''
  12.         "extraInfo": extraInfo 
  13.     }; 
  14.     self.deviceManager_.authenticateDevice(data.device, authParam, (err) => { ... }); 
  15. }); 
  16. this.deviceManager_.on('deviceStateChange', (data) => { ... }); 

步骤4:发现周边新设备,并认证

  1. SUBSCRIBE_ID = Math.floor(65536 * Math.random()); 
  2. var info = { 
  3.     subscribeId: SUBSCRIBE_ID, 
  4.     mode: 0xAA, 
  5.     medium: 2, 
  6.     freq: 2, 
  7.     isSameAccount: false
  8.     isWakeRemote: true
  9.     capability: 0 
  10. }; 
  11. this.deviceManager_.startDeviceDiscover(info); 

新设备需要认证才能互联使用。开源鸿蒙系统没有用户注册机制,因此认证需要另外开发框架支持,开源鸿蒙在标准系统提供了一个简单的HAP程序支持弹窗PIN码认证机制,可以简单使用。

当前版本只支持PIN码认证,需要提供PIN码认证的授权提示界面、PIN码显示界面、PIN码输入界面;

当前,由于系统通过native层直接进行弹窗的能力尚不具备,这里使用一个临时的FA来进行对应界面的弹窗。

该FA为:DeviceManager_UI.hap,作为系统应用进行预置。

具体行为是:

  1. 远程设备在屏幕显示一个巨大的6位数字PIN码
  2. 控制设备弹出一个PIN码输入窗口
  3. 用户在控制设备输入远程设备所显示的PIN码,通过验证即可继续远程控制
  4. PIN码输入成功后,该设备成为可信设备存储于系统,下次再次连接时不需要再次验证

步骤5:远程调用FA

以上步骤1~步骤4是标准的周围设备管理步骤,因此可以封装成函数库,方便后续使用。

在获取到可信设备数组后,可以在适当的弹窗或者选择界面,让用户选择其中一个进行连接。

  1. findDevices: function(){ 
  2.       let self = this; 
  3.       this.remoteDevices.registerDeviceListCallback(() => { 
  4.           var list = new Array(); 
  5.           var devs = self.remoteDevices.deviceList; 
  6.           console.info('myapplication: on remote device updated, count=' + devs.length); 
  7.           for (var i = 0; i < devs.length; i++) { 
  8.               console.info('myapplication: device ' + i + '/' + devs.length + 
  9.               ' deviceId=' + devs[i].deviceId + ' deviceName=' + devs[i].deviceName 
  10.               + ' deviceType=' + devs[i].deviceType); 
  11.               list[i + 1] = { 
  12.                   name: devs[i].deviceName, 
  13.                   did:  devs[i].deviceId 
  14.               }; 
  15.           } 
  16.           self.devList = list; 
  17.       }); 
  18.   }, 

启动远程FA的程序:

  1. import featureAbility from '@ohos.ability.featureability'
  2.  
  3. ...... 
  4.  
  5. featureAbility.startAbility({ 
  6.     want:{ 
  7.         bundleName: 'com.example.myapplication'
  8.         abilityName: 'com.example.myapplication.MainAbility'
  9.         deviceId: this.devList[idx].did, 
  10.         parameters: { 
  11.             isFA: 'FA' 
  12.         } 
  13.     } 
  14. }).then((data)=>{ 
  15.     console.log("myapplication: start ability finished:" + JSON.stringify(data)); 
  16. }); 

 远程设备收到请求后,就会以对应的参数启动相应的FA,并且在启动时可以获取到参数:

  1. onReady() { 
  2.     featureAbility.getWant((error, want) => { 
  3.         console.info('myapplication: featureAbility.getWant =' + JSON.stringify(want.parameters)); 
  4.         // 这里isFA就是上面远程请求的参数 
  5.         if (want.parameters.isFA && want.parameters.isFA === 'FA') { 
  6.             this.initKVManager(()=>{ 
  7.                 console.log('myapplication: kvmanager started.'
  8.             }); 
  9.         } 
  10.         else
  11.             this.findDevices(); 
  12.         } 
  13.     }); 
  14.  
  15. }, 

 具体api可以参考华为鸿蒙开发文档,请注意里面部分内容可能与开源鸿蒙系统有区别,请自行确定。

编译运行

以上步骤,均已在DevEco Studio 3.0.0.600 x64中编写成功,并且在两台Hi3516D设备间成功运行,附代码(分布式远程启动.zip)。

想在开源鸿蒙系统上安装HAP程序,必须要先进行签名,并且在DevEco Studio中进行相关设置。具体步骤参考开源鸿蒙文档。

上传安装HAP程序,需要使用开发工具hdc,具体参考文档。

小结

开源鸿蒙系统的分布式任务调度基本功能已经初步完善了,使用文档比较分散,需要到各个子系统去查阅,略有不便。

下一步,学习一下分布式软总线、分布式数据,看看开源鸿蒙系统是如何封装应用之间数据交互能力的。

另外看源代码,开源鸿蒙系统已经有分布式应用流转(迁移)运行功能,有时间可以学习一下。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.IDC.NET

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/242073.html<

(0)
管理的头像管理
上一篇2025-04-24 15:24
下一篇 2025-04-24 15:26

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注