HDC2021技術分論壇:組件通信、硬件池化,這些創新技術你get了嗎?
作者: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分佈式創新技術的冰山一角,期待廣大開發者積極加入我們,共同見證全場景智慧生態的無限可能。
掃碼添加開發者小助手微信
獲取更多HarmonyOS開發資源和開發者活動資訊