作者: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開發資源和開發者活動資訊
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/415330.html
標籤:其他
