分散式系統硬體資源池原理和接入實踐

HarmonyOS開發者社群發表於2023-12-06

一、硬體資源池理念產生背景

隨著智慧裝置的發展和普及,越來越多的智慧裝置已經深入人們的生活,比如手機,PC,平板,各類穿戴裝置等。當前單個裝置的外設資源已經非常豐富,硬體能力也很強大。像我們的手機、PC、平板都有相機,音訊,螢幕,鍵鼠等各種外設資源;但是這些硬體外設是屬於各個裝置自身的,如果涉及到跨裝置的協同操作就會比較繁瑣。


比如使用者正在 PC 上編輯文件,需要從平板複製一段文字,或者使用手機拍攝照片,然後插入文件作為素材,需要使用者在各個裝置上分別操作,然後傳送文字或者圖片到 PC,然後再回到 PC 進行編輯,非常繁瑣。如果應用開發者從應用層實現裝置間硬體能力共享,對於應用開發者工作量和難度非常大,而且各個應用之間需要重複開發,能力難以複用和繼承。


分散式系統硬體資源池原理和接入實踐

圖 1 單裝置硬體孤立難以共享

為此,鴻蒙系統提出了硬體資源池的理念,打破了各個裝置硬體的孤立狀態,能夠做到裝置間硬體外設全域性共享。我們把各個裝置的硬體外設抽象為外設資訊單元,外設資訊在各個可信裝置之間自動同步,如此,實現了外設資訊的全域性可見;結合分散式硬體 虛擬化技術 ,實現任意裝置之間的硬體外設能力跨裝置呼叫;分散式硬體資源池作為系統能力下沉系統底層,北向開發者不感知資源池的存在;跨裝置硬體和本地硬體使用同一套 API,開發者呼叫跨裝置硬體體驗和本地硬體一致,如此明顯的便利了開發者呼叫跨裝置硬體,開發者無需關注硬體底層細節,專注於業務創新。

分散式系統硬體資源池原理和接入實踐

圖 2 硬體資源池打破硬體邊界,全域性共享

二、鴻蒙系統硬體資源池支援場景

鴻蒙系統採用硬體資源池的理念,能夠結合多個裝置的優勢硬體為使用者提供更優的體驗,同時支援了消費者和開發者的多種創新體驗。

2.1 消費者場景

在消費者層面,華為分散式硬體支援智慧辦公,智慧出行等多種創新場景。例如智慧辦公場景中,使用一套 PC 鍵鼠即可和周邊平板等裝置跨裝置操作,使用到鍵鼠外設的跨裝置操控能力;多屏協同場景中,手機螢幕顯示到平板,手機視訊通話可以使用平板的麥克風和攝像頭,使用者在平板上即可同時操作手機平板兩臺裝置,避免裝置間來回切換,操作方便,這個場景使用到了麥克風,揚聲器,攝像頭和螢幕等硬體的跨裝置分散式能力。

在智慧出行場景中,使用者在手機上聽音樂或者視訊通話,進入座艙後,手機上的音樂和通話可以自動接續到車機,使用車機的音訊外設播音和拾音,使用車機的攝像頭進行視訊通話,更加符合使用者在座艙中的使用習慣;手機導航接續到車機後,車機的 GPS 訊號 可以共享給手機,結合手機 GPS 訊號提供更高精度的定位資料;可以看到,在智慧出行場景中,可以透過分散式硬體資源池結合手機和車機的優勢硬體,為使用者提供更好的服務體驗。

分散式系統硬體資源池原理和接入實踐

圖 3 鴻蒙硬體資源池支援各類消費者場景

2.2 開發者場景

對於開發者來說,由於分散式硬體資源池將跨裝置硬體呼叫的複雜度都封裝在了系統底層,跨裝置硬體複用本地硬體的 API,開發者學習和適配難度可以做到最低。

以分散式相機為例,相機介面可以同時查詢到本地相機和跨裝置相機外設,本地相機和跨裝置相機透過 ConnectionType.CAMERA_CONNECTION_REMOTE 屬性相區分,開發者透過該屬性過濾出分散式相機後,其他操作和本地相機完全一致。無需為使用跨裝置硬體學習一套獨立的 API,很大程度上的簡化了開發者開發難度。

分散式系統硬體資源池原理和接入實踐

圖 4 分散式硬體開發者使用示例

三、硬體資源池原理

以相機和音訊為例,假設裝置 A 和裝置 B 都有各自的相機和音訊外設,驅動層有對應的本地相機和本地音訊驅動。

分散式系統硬體資源池原理和接入實踐

圖 5 分散式硬體資源池原理示意

分散式硬體從各自裝置本地採集相機和音訊驅動資訊,存入 分散式資料庫 。如果 AB 兩個裝置建立了可信關係並且透過軟匯流排組網上線成功,分散式資料庫會在 AB 兩個裝置之間自動同步各自的本地外設資料資訊,這樣,裝置 A 分散式硬體可以拿到裝置 B 的相機和音訊外設規格資料,同樣,裝置 B 也可以拿到裝置 A 的相機和音訊外設規格資料。


以裝置 A 的流程為例,分散式硬體收到對端裝置 B 的硬體規格資料後,在驅動層註冊對應的虛擬相機和虛擬音訊驅動,虛擬驅動相當於對端裝置物理硬體在本地的代理;虛擬驅動實現和本地硬體驅動相同的 HDI 介面,區別在於,本地硬體驅動操作本地物理硬體,虛擬硬體驅動控制和資料傳輸透過軟匯流排作用於對端分散式硬體。


由於和本地硬體實現同樣的 HDI 介面,裝置 B 相機和音訊對應的虛擬硬體可以被相機服務和音訊服務發現並管理,包括外設的查詢,相機的預覽拍照錄影,音訊的播放,聲音的錄製等功能。


對稱的,在裝置 B 上會執行同樣的過程,為裝置 A 相機和音訊外設註冊對應虛擬驅動,從而實現裝置 B 上對裝置 A 硬體外設的查詢和使用。


如此就實現了外設資訊在裝置間互通共享,資訊感知自動註冊虛擬硬體,註冊後即可用,成為一個無中心對稱的分散式硬體外設管理系統。同時,分散式硬體框架定義了外設熱插拔,虛擬硬體保活等機制,保證業務可靠性。在執行時,各個硬體外設的業務執行於獨立程式中,在程式層面保證不同硬體的虛擬化業務互相隔離,提高了業務可靠性。


詳細實現可以參考分佈硬體管理框架原始碼:

四、硬體資源池接入實踐

4.1 介面定義

透過前文分析,可以看到分散式硬體與南向硬體的互動涉及"硬體資訊採集"和"驅動註冊"兩類業務,與此對應,分散式硬體針對南向硬體接入定義了兩類介面。一類是硬體規格採集介面,一類是驅動註冊與準備介面。

分散式系統硬體資源池原理和接入實踐

圖 6 分散式硬體資源池接入介面

(1)硬體規格採集介面

硬體規格採集介面定義了規格資訊的採集以及外設熱插拔事件監聽等功能。

介面連結:

(2)驅動註冊與準備介面

由於我們是跨裝置硬體呼叫,涉及雙端裝置的硬體,我們定義使用周邊其他裝置硬體外設的一端為 Source 端,共享本地硬體給其他裝置呼叫的一端為 Sink 端。

驅動註冊與準備介面包括 Source 和 Sink 兩端。

Source 端包括初始化,釋放以及虛擬驅動註冊/去註冊等功能;Sink 端主要是初始化和釋放介面,用於響應 Source 端的控制指令,比如播放聲音或者採集影片畫面。在裝置組網上線後,分散式硬體框架呼叫各個硬體型別的南向介面實現,分別初始化各類硬體的 Source 和 Sink 端業務程式,為後續的硬體跨裝置呼叫做好準備。

Source 端介面連結:

Sink 端介面連結:

4.2 硬體接入例項

由於分散式硬體良好的南向接入解耦設計,如果有新硬體外設接入,只需要如下三步即可,以分散式相機配置為例。

Step1:定義硬體外設型別 列舉值 CAMERA。



enum 

class 
DHType : 
uint32_t {
    UNKNOWN = 
0x0,            
// unknown device
    CAMERA = 
0x01,            
// Camera
    AUDIO = 
0x02,             
// Mic
    SCREEN = 
0x08,           
// Display
    GPS = 
0x10,               
// GPS
    INPUT = 
0x20,             
// Key board
    MAX_DH = 
0x80000000
};



檔案連結: https://gitee.com/openharmony/distributedhardware_distributed_hardware_fwk/blob/master/common/utils/include/device_type.h


Step2:實現分散式硬體框架定義的南向接入介面,分別實現為三個 so。


1、實現分散式硬體框架定義的硬體規格採集介面 IHardwareHandler,並編譯獲得介面實現 libdistributed_camera_handler.z.so。

參考程式碼:


2、實現 Source 側接入介面 IDistributedHardwareSource,並編譯獲得介面實現 libdistributed_camera_source_sdk.z.so。

參考程式碼:


3、實現 Sink 側接入介面 IDistributedHardwareSink,並編譯獲得介面實現 libdistributed_camera_sink_sdk.z.so。

參考程式碼:


Step3:在分散式硬體子部件配置檔案中,新增新硬體外設相關配置,包括外設型別,南向介面實現的 so 名稱,版本號,以及 Source 和 Sink 端服務分配的服務 Id。

●  該配置由產品定義確定,不同的產品可能使用不同的分散式能力。以 RK3568 開發板為例,配置如下:


{
    
"name""distributed_camera",
    
"type""CAMERA",
    
"comp_handler_loc""libdistributed_camera_handler.z.so",
    
"comp_handler_version""1.0",
    
"comp_source_loc""libdistributed_camera_source_sdk.z.so",
    
"comp_source_version""1.0",
    
"comp_source_sa_id"4803,
    
"comp_sink_loc""libdistributed_camera_sink_sdk.z.so",
    
"comp_sink_version""1.0",
    
"comp_sink_sa_id"4804
}




配置連結: https://gitee.com/openharmony/device_board_hihope/blob/master/rk3568/distributedhardware/distributed_hardware_components_cfg.json

三個介面的 so 實現後,編譯打包到系統庫路徑下,同時配置到分散式硬體部件配置檔案中,裝置組網上線後,可以看到分散式相機的 dcamera 程式已經成功啟動,表明相機外設已經納入資源池管理,成為分散式相機。


從下述截圖也可以看到分散式硬體其他相關程式,dhardware 就是分散式硬體資源池管理框架程式,顧名思義,dcamera 是分散式相機程式,dinput 是分散式鍵鼠輸入程式,dscreen 是分散式螢幕程式。

分散式系統硬體資源池原理和接入實踐

圖 7 分散式硬體相關程式

五、社群已開源分散式硬體程式碼倉

當前在 OpenHarmony 開源社群,已經開源了硬體資源池管理框架,分散式相機,分散式音訊,分散式螢幕,分散式輸入的程式碼倉,開放了相機,音訊,螢幕和鍵鼠輸入外設的跨裝置控制原始碼,關於硬體資源池的詳細實現,可以參考我們的開原始碼倉。


1、  分散式硬體框架(distributedhardware_distributed_hardware_fwk)

2、分散式相機(distributedhardware_distributed_camera)


3、分散式音訊(distributedhardware_distributed_audio)


4、分散式螢幕(distributedhardware_distributed_screen)


5、分散式輸入(distributedhardware_distributed_input)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009402/viewspace-2998910/,如需轉載,請註明出處,否則將追究法律責任。

相關文章