作者:ligang 华为分布式硬件技术专家,sunbinxin 华为利用框架技术专家
HarmonyOS 是一款全新的分布式操作系统,为开发者提供了元能力框架、事件告诉、分布式硬件等分布式技术,使能开发出面向全场景的分布式应用。随着 HarmonyOS 利用生态的一直壮大,开发者应用原有的分布式技术在实现某些翻新场景时显得力不从心,因为开发难度较大,间接影响了开发效率。
“翻新推动倒退”,咱们须要对分布式技术一直摸索与翻新,能力让开发者更好地适应利用生态的倒退。本期咱们将通过两个多端协同的翻新技术,联合翻新案例为大家展现技术革新给开发者带来的高效开发体验。
一、技术创新
多端协同是分布式应用中最为常见的技术计划,通过同时或交替运行多端设施上的 FA/PA 实现残缺的业务性能。上面咱们将为大家介绍多端协同中跨设施通信与外部设备硬件资源拜访两个技术创新。
1. 跨设施通信
跨设施通信是多设施进行交互的根底。如图 1 所示,在以往的跨设施通信实现过程中,ServiceAbility 作为音讯直达的媒介,提供后盾运行工作的能力以及对立的数据拜访形象,实现同利用不同设施的两个 PageAbility 的交互。开发者不仅要实现业务逻辑层设施的业务逻辑开发,还要实现通信层的包含跨设施连贯治理、数据转发、生命周期绑定和感知等简单性能的实现,开发起来费时费力。
图 1 ServiceAbility 实现形式
为了帮忙开发者更加不便高效地实现跨设施通信,咱们扭转了原来的实现形式,提供了最新的 startAssistAbility 接口,间接拉起建设协同的对端设施的 PageAbility。如图 2 所示,通过应用 startAssistAbility 接口,让通信层的跨设施连贯治理、数据转发、生命周期绑定和感知由零碎实现,开发者只须要关注下层业务逻辑,实现简略高效地开发。
图 2 startAssistAbility 实现形式
2. 外设硬件拜访
外设硬件拜访是多设施进行协同的要害,如图 1 所示,在原来的外部设备硬件资源拜访过程中,通过 HarmonyOS 提供的分布式设施虚拟化能力将两台设施的硬件资源进行交融,造成一个虚构终端,实现了两台设施间硬件资源的拜访。然而,随着全场景智慧生存的不断深入,一对一的设施硬件资源拜访形式已不能满足现今某些场景的业务需要。
图 3 一对一设施硬件资源拜访
为了突破“一对一”的壁垒,咱们提出了硬件资源池化技术。如图 3 所示,通过加强原来的分布式设施虚拟化能力,将多台设施的各种硬件资源,如屏幕、相机、扩音器、键盘、传感器及存储器等予以形象并转换为“超级终端”内的对立资源池,并反对硬件资源的按需分配和重新组合,真正实现了超级终端全局硬件资源的调用。
图 4 硬件资源池化
二、翻新案例
以上两个分布式技术创新能为开发者带来什么不一样的开发体验呢?上面,咱们将通过两个案例为你解答。
1. 组件协同案例
如下视频所示,手机和平板利用各自的劣势合作实现同一个杂志设计工作的不同局部。如何高效地实现这个分布式场景中手机和平板的界面协同呢?
咱们采纳了最新的 startAssistAbility 接口。首先,咱们把两个设施的连贯形象为 AssistChannel 对象,通过监听该对象的事件实现连贯胜利 / 断开 / 失败。而后,协同发动端通过 startAssistAbility 接口,指定对应的 want 和 channel 启动参数,发动连贯。最初,协同响应端响应 channel 的连贯事件,连贯胜利后会回调一个 Agent 对象,该对象提供了收发音讯及监听对端生命周期的接口,用于实现音讯的接管与发送以及感知对端的生命周期变动。
上面是具体的实现步骤与示例代码。
(1)协同发动端调用 startAssistAbility 接口收回连贯申请。示例代码如下:
const channel = new AssistChannel()
channel.on('assistConnect', (agent) => {// 监听连贯胜利后回调})
channel.on('assistDisconnect', (agent) => {// 监听连贯断开后回调})
channel.on('assistFail', (agent) => {// 监听连贯失败后回调})
// assistWant 中指定了待启动的 Ability 的名称和设施的 NetworkId
context.startAssistAbility(assistWant, channel)
(2)协同响应端响应协同发动端 channel 的协同事件。示例代码如下:
const channel = new AssistChannel()
channel.on('assistConnect', (agent) => {// 监听连贯胜利后回调})
channel.on('assistDisconnect', (agent) => {// 监听连贯断开后回调})
channel.on('assistFail', (agent) => {// 监听连贯失败后回调})
context.setAssistChannel(channel)
(3)通过 Agent 接口收发音讯。不论是协同发动端,还是协同响应端,都能够通过该接口,设置音讯接收器和发送音讯到对端。示例代码如下:
// 注册音讯接收器
agent.on(‘message’, (event)=>{// 解决接管到的事件})
// 能够发送 InnerEvent 给对端
agent.postMessage(event);
(4)通过 Agent 接口感知对端生命周期。协同响应端的生命周期是绑定到协同发动端的,当协同发动端退出后,协同响应端也会跟着退出。示例代码如下:
// 注册生命周期监听,监听对端生命周期变动
agent.on(‘stateChange’, (event) => {if (event === LifecycleEvent.ON_INACTIVE) {// 解决音讯}
// TODO 其余生命周期解决
})
2. 多机位相机案例
如下视频所示,通过多机位模式出现了周围环境内不同机位的视角。如何实现这个分布式场景中拜访周边设备 Camera 硬件的性能呢
咱们应用了硬件资源池化技术,首先,咱们通过 getCapabilities 接口获取硬件资源池内的外设 Camera 硬件列表,该列表中蕴含了外设 Camera ID,该 ID 可调用 OpenCamera 接口获取 Camera 帧信息。而后通过 distributeHardwareMgr 接口监听外设硬件的插拔事件。最初通过 enableCapability 接口使能该 Camera 硬件。上面是具体的实现步骤与示例代码。
(1)用户点击外设按钮时,查问可用分布式相机信息。示例代码如下:
// 创立 disHardwareMgr 实例
var disHardwareMgr;
distributedHardware.createDHManager(app.getInfo().appID, (err, data) => {
if (err) {
console.info(TAG + "createDHManager err:" + JSON.stringify(err));
return;
}
disHardwareMgr = data;
});
let filter = {
deviceId: “”,
deviceType: CAMERA
};
// 查问已有的可用外设信息
let array = disHardwareMgr.getDHCapabilities(filter);
console.info(“getCapabilities result:” + JSON.stringify(array));
// 监听超级终端内可用外设的接入和移除事件
disHardwareMgr.registerListener((data) => {
console.info(“registerHardwareListener on:” + JSON.stringify(data));
this.capEnable = data.cap;
});
复制
(2)用户点击连贯设施时,使能外设 Camera 硬件,此时本机呈现外设机位摄像头的画面。示例代码如下:
// 找到指定外设后,使能外设的硬件驱动,将外部设备硬件增加为本地硬件应用
var cameraId;
let deviceId = this.capEnable.deviceId;
let dhId = this.capEnable.dhId;
let useType = 0;
disHardwareMgr.enable(deviceId, dhId, useType, (data) => {
cameraId = data;
});
// 从相机服务获取分布式相机,关上相机预览
CameraManager.openCamera(cameraId);
CameraManager.startPreview(cameraId);
复制
以上就是本期全部内容,本文所介绍只是 HamronyOS 分布式翻新技术的冰山一角,期待宽广开发者踊跃退出咱们,独特见证全场景智慧生态的有限可能。