作者:ligang 華為分布式硬件技術(shù)專家,sunbinxin 華為應用框架技術(shù)專家
HarmonyOS是一款全新的分布式操作系統(tǒng),為開發(fā)者提供了元能力框架、事件通知、分布式硬件等分布式技術(shù),使能開發(fā)出面向全場景的分布式應用。隨著HarmonyOS應用生態(tài)的不斷壯大,開發(fā)者使用原有的分布式技術(shù)在實現(xiàn)某些創(chuàng)新場景時顯得力不從心,因為開發(fā)難度較大,直接影響了開發(fā)效率。
“創(chuàng)新推動發(fā)展”,我們需要對分布式技術(shù)不斷探索與創(chuàng)新,才能讓開發(fā)者更好地適應應用生態(tài)的發(fā)展。本期我們將通過兩個多端協(xié)同的創(chuàng)新技術(shù),結(jié)合創(chuàng)新案例為大家展示技術(shù)革新給開發(fā)者帶來的高效開發(fā)體驗。
一、技術(shù)創(chuàng)新
多端協(xié)同是分布式應用中最為常見的技術(shù)方案,通過同時或交替運行多端設備上的FA/PA實現(xiàn)完整的業(yè)務功能。下面我們將為大家介紹多端協(xié)同中跨設備通信與外部設備硬件資源訪問兩個技術(shù)創(chuàng)新。
1.跨設備通信
跨設備通信是多設備進行交互的基礎(chǔ)。如圖1所示,在以往的跨設備通信實現(xiàn)過程中,ServiceAbility作為消息中轉(zhuǎn)的媒介,提供后臺運行任務的能力以及統(tǒng)一的數(shù)據(jù)訪問抽象,實現(xiàn)同應用不同設備的兩個PageAbility的交互。開發(fā)者不僅要完成業(yè)務邏輯層設備的業(yè)務邏輯開發(fā),還要完成通信層的包括跨設備連接管理、數(shù)據(jù)轉(zhuǎn)發(fā)、生命周期綁定和感知等復雜功能的實現(xiàn),開發(fā)起來費時費力。
為了幫助開發(fā)者更加方便高效地實現(xiàn)跨設備通信,我們改變了原來的實現(xiàn)方式,提供了最新的startAssistAbility接口,直接拉起建立協(xié)同的對端設備的PageAbility。如圖2所示,通過使用startAssistAbility接口,讓通信層的跨設備連接管理、數(shù)據(jù)轉(zhuǎn)發(fā)、生命周期綁定和感知由系統(tǒng)實現(xiàn),開發(fā)者只需要關(guān)注上層業(yè)務邏輯,實現(xiàn)簡單高效地開發(fā)。
2.外設硬件訪問
外設硬件訪問是多設備進行協(xié)同的關(guān)鍵,如圖1所示,在原來的外部設備硬件資源訪問過程中,通過HarmonyOS提供的分布式設備虛擬化能力將兩臺設備的硬件資源進行融合,形成一個虛擬終端,實現(xiàn)了兩臺設備間硬件資源的訪問。但是,隨著全場景智慧生活的不斷深入,一對一的設備硬件資源訪問方式已不能滿足現(xiàn)今某些場景的業(yè)務需求。
為了打破“一對一”的壁壘,我們提出了硬件資源池化技術(shù)。如圖3所示,通過增強原來的分布式設備虛擬化能力,將多臺設備的各種硬件資源,如屏幕、相機、擴音器、鍵盤、傳感器及存儲器等予以抽象并轉(zhuǎn)換為“超級終端”內(nèi)的統(tǒng)一資源池,并支持硬件資源的按需分配和重新組合,真正實現(xiàn)了超級終端全局硬件資源的調(diào)用。
二、創(chuàng)新案例
以上兩個分布式技術(shù)創(chuàng)新能為開發(fā)者帶來什么不一樣的開發(fā)體驗呢?下面,我們將通過兩個案例為你解答。
1.組件協(xié)同案例
如下視頻所示,手機和平板利用各自的優(yōu)勢協(xié)作完成同一個雜志設計任務的不同部分。如何高效地實現(xiàn)這個分布式場景中手機和平板的界面協(xié)同呢?
我們采用了最新的startAssistAbility接口。首先,我們把兩個設備的連接抽象為AssistChannel對象,通過監(jiān)聽該對象的事件實現(xiàn)連接成功/斷開/失敗。然后,協(xié)同發(fā)起端通過startAssistAbility接口,指定對應的want和channel啟動參數(shù),發(fā)起連接。最后,協(xié)同響應端響應channel的連接事件,連接成功后會回調(diào)一個Agent對象,該對象提供了收發(fā)消息及監(jiān)聽對端生命周期的接口,用于實現(xiàn)消息的接收與發(fā)送以及感知對端的生命周期變化。
下面是具體的實現(xiàn)步驟與示例代碼。
(1)協(xié)同發(fā)起端調(diào)用startAssistAbility接口發(fā)出連接請求。示例代碼如下:
const channel = new AssistChannel()
channel.on('assistConnect', (agent) => {
// 監(jiān)聽連接成功后回調(diào)
})
channel.on('assistDisconnect', (agent) => {
// 監(jiān)聽連接斷開后回調(diào)
})
channel.on('assistFail', (agent) => {
// 監(jiān)聽連接失敗后回調(diào)
})
// assistWant中指定了待啟動的Ability的名稱和設備的NetworkId
context.startAssistAbility(assistWant,?channel)
(2)協(xié)同響應端響應協(xié)同發(fā)起端channel的協(xié)同事件。示例代碼如下:
constchannel =newAssistChannel()
channel.on('assistConnect',(agent) =>{
// 監(jiān)聽連接成功后回調(diào)
})
channel.on('assistDisconnect',(agent) =>{
// 監(jiān)聽連接斷開后回調(diào)
})
channel.on('assistFail',(agent) =>{
// 監(jiān)聽連接失敗后回調(diào)
})
context.setAssistChannel(channel)
(3)通過Agent接口收發(fā)消息。不論是協(xié)同發(fā)起端,還是協(xié)同響應端,都可以通過該接口,設置消息接收器和發(fā)送消息到對端。示例代碼如下:
// 注冊消息接收器
agent.on(‘message’, (event)=>{
//處理接收到的事件
})
//可以發(fā)送InnerEvent給對端agent.postMessage(event);
(4)通過Agent接口感知對端生命周期。協(xié)同響應端的生命周期是綁定到協(xié)同發(fā)起端的,當協(xié)同發(fā)起端退出后,協(xié)同響應端也會跟著退出。示例代碼如下:
//注冊生命周期監(jiān)聽,監(jiān)聽對端生命周期變化
agent.on(‘stateChange’, (event) => {
if(event=== LifecycleEvent.ON_INACTIVE) {
// 處理消息
? }
// TODO 其他生命周期處理
})
2.多機位相機案例
如下視頻所示,通過多機位模式呈現(xiàn)了周圍環(huán)境內(nèi)不同機位的視角。如何實現(xiàn)這個分布式場景中訪問周邊設備Camera硬件的功能呢?
我們使用了硬件資源池化技術(shù),首先,我們通過getCapabilities接口獲取硬件資源池內(nèi)的外設Camera硬件列表,該列表中包含了外設Camera ID,該ID可調(diào)用OpenCamera接口獲取Camera幀信息。然后通過distributeHardwareMgr接口監(jiān)聽外設硬件的插拔事件。最后通過enableCapability接口使能該Camera硬件。下面是具體的實現(xiàn)步驟與示例代碼。
(1)用戶點擊外設按鈕時,查詢可用分布式相機信息。示例代碼如下:
// 創(chuàng)建disHardwareMgr實例
vardisHardwareMgr;
distributedHardware.createDHManager(app.getInfo().appID,(err, data) =>{
if(err) {
console.info(TAG +"createDHManager err:"+JSON.stringify(err));
return;?
}?
disHardwareMgr = data;
});
letfilter = {
deviceId:"",?
deviceType: CAMERA
};
// 查詢已有的可用外設信息
letarray = disHardwareMgr.getDHCapabilities(filter);
console.info("getCapabilities result:"+JSON.stringify(array));
// 監(jiān)聽超級終端內(nèi)可用外設的接入和移除事件
disHardwareMgr.registerListener((data) =>{
console.info("registerHardwareListener on:"+JSON.stringify(data));
this.capEnable = data.cap;
});
(2)用戶點擊連接設備時,使能外設Camera硬件,此時本機出現(xiàn)外設機位攝像頭的畫面。示例代碼如下:
// 找到指定外設后,使能外設的硬件驅(qū)動,將外部設備硬件添加為本地硬件使用
varcameraId;
letdeviceId =this.capEnable.deviceId;
letdhId =this.capEnable.dhId;
letuseType =0;
disHardwareMgr.enable(deviceId, dhId, useType,(data) =>{?
cameraId = data;
});
// 從相機服務獲取分布式相機,打開相機預覽
CameraManager.openCamera(cameraId);
CameraManager.startPreview(cameraId);
以上就是本期全部內(nèi)容,本文所介紹只是HamronyOS分布式創(chuàng)新技術(shù)的冰山一角,期待廣大開發(fā)者積極加入我們,共同見證全場景智慧生態(tài)的無限可能。
END