跟著小白一起學(xué)鴻蒙--簡析藍(lán)牙協(xié)議棧(十三)
??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??
在《#跟著小白一起學(xué)鴻蒙# [八] 藍(lán)牙應(yīng)用》我們熟悉了如何在開源鴻蒙開發(fā)藍(lán)牙應(yīng)用。在《#跟著小白一起學(xué)鴻蒙# [十一] WiFi&藍(lán)牙子系統(tǒng)》,我們了解了各種系統(tǒng)內(nèi)的藍(lán)牙和WiFi框架,接下來我們就深入分析下開源鴻蒙的藍(lán)牙結(jié)構(gòu)和各層作用及工作內(nèi)容。
概述
在開源鴻蒙的源碼里和系統(tǒng)功能相關(guān)的部分大多都放在foundation這個(gè)文件夾里,而通訊相關(guān)的部分則是在communication這個(gè)文件夾內(nèi)。我們本篇要分析的藍(lán)牙功能就是在foundation/communication/bluetooth路徑下,具體目錄結(jié)構(gòu)如下:
架構(gòu)簡析
- 根據(jù)目錄結(jié)構(gòu)和內(nèi)部文件及編譯框架總結(jié)架構(gòu)如下:
- 接口層:對(duì)外提供js接口,采用d.ts定義,藍(lán)牙文件夾內(nèi)位置interfaces/kits/js具體存放路徑在interface/sdk-js/api/@ohos.bluetooth.d.ts;對(duì)內(nèi)提供c接口,可以供softbus,netmanager,audioframework三個(gè)子系統(tǒng)調(diào)用,藍(lán)牙文件夾內(nèi)位置interfaces/inner_api/include。
- 框架層:分兩個(gè)子層,NAPI框架實(shí)現(xiàn)層,藍(lán)牙文件夾內(nèi)位置foundation/communication/bluetooth/frameworks/js/napi,實(shí)現(xiàn)所有js層代碼接口適配并調(diào)用innerapi的實(shí)現(xiàn);藍(lán)牙接口實(shí)現(xiàn)層,使用IPC架構(gòu)同藍(lán)牙服務(wù)層通信,將從NAPI收到的命令,或者別的子系統(tǒng)收到的命令經(jīng)由IPC架構(gòu)發(fā)送給服務(wù)層,并注冊(cè)服務(wù)層observer,收聽由服務(wù)層上報(bào)的事件。
- 服務(wù)層:分三個(gè)子層,系統(tǒng)能力層,藍(lán)牙文件夾內(nèi)位置foundation/communication/bluetooth/services/bluetooth/server,實(shí)現(xiàn)藍(lán)牙系統(tǒng)能力服務(wù),接收從框架層經(jīng)由IPC發(fā)送下來的命令,并收聽藍(lán)牙service傳上來的消息并回傳給藍(lán)牙框架層;藍(lán)牙服務(wù)層,藍(lán)牙文件夾內(nèi)位置foundation/communication/bluetooth/services/bluetooth/service,實(shí)現(xiàn)不同藍(lán)牙能力的adapter(包括classic_adapter和ble_adapter),通過調(diào)用藍(lán)牙協(xié)議棧實(shí)現(xiàn)藍(lán)牙業(yè)務(wù)的邏輯能力;藍(lán)牙協(xié)議棧,藍(lán)牙文件夾內(nèi)位置foundation/communication/bluetooth/services/bluetooth/stack,實(shí)現(xiàn)藍(lán)牙協(xié)議包解析,打包以及藍(lán)牙協(xié)議流程的處理,實(shí)現(xiàn)藍(lán)牙host,藍(lán)牙profile以及藍(lán)牙鏈路和hci接口,最后通過使用藍(lán)牙硬件驅(qū)動(dòng)收發(fā)藍(lán)牙原始數(shù)據(jù);
- 硬件驅(qū)動(dòng):預(yù)編譯包,通過dlopen提供hci的底層接口,注冊(cè)回調(diào)以及發(fā)送數(shù)據(jù)。
功能簡析
NAPI藍(lán)牙框架藍(lán)牙系統(tǒng)能力藍(lán)牙功能適配藍(lán)牙協(xié)議棧藍(lán)牙驅(qū)動(dòng)同進(jìn)程,函數(shù)調(diào)用跨進(jìn)程,IPC調(diào)用通過samgr獲取服務(wù)Proxy對(duì)象利用adapter和server調(diào)用功能c接口調(diào)用dlopen加載驅(qū)動(dòng)注冊(cè),回調(diào)observer回調(diào)observer回調(diào)observer proxy + stub注冊(cè),回調(diào)NAPI藍(lán)牙框架藍(lán)牙系統(tǒng)能力藍(lán)牙功能適配藍(lán)牙協(xié)議棧藍(lán)牙驅(qū)動(dòng)。
- NAPI功能
- HAP應(yīng)用層通過@ohos.bluetooth.d.ts引用調(diào)用藍(lán)牙接口,藍(lán)牙接口包括bluetooth接口,BLE接口,profile接口。bluetooth接口包括經(jīng)典藍(lán)牙接口,BLE接口接口,和profile接口;目前支持的profile有A2dpSourceProfile,HandsFreeAudioGatewayProfile,HidHostProfile和PanProfile。
- NAPI框架接口均通過DECLARE_NAPI_FUNCTION,js的回調(diào)也通過此接口經(jīng)由傳入回調(diào)函數(shù)指針實(shí)現(xiàn)。
- NAPI層通過調(diào)用藍(lán)牙框架層的BluetoothHost實(shí)現(xiàn)功能,通過將g_bluetoothHostObserver注冊(cè)到框架層內(nèi)部實(shí)現(xiàn)來獲得消息回調(diào);同時(shí)NAPI層提供g_Observer存儲(chǔ)js層的回調(diào)函數(shù),在收到框架層的回調(diào)后在g_Observer里查找對(duì)應(yīng)的回調(diào)函數(shù)來實(shí)現(xiàn)應(yīng)用通知;此對(duì)象因?yàn)槭莔ap結(jié)構(gòu)體,所以一個(gè)應(yīng)用只能注冊(cè)一個(gè)并在應(yīng)用內(nèi)部自己處理。
- 藍(lán)牙框架功能
- 藍(lán)牙框架提供cadapter接口和藍(lán)牙框架具體實(shí)現(xiàn)(藍(lán)牙NAPI層調(diào)用的BluetoothHost即在具體實(shí)現(xiàn)層)。
- cadapter實(shí)現(xiàn)c接口,通過BluetoothHost實(shí)現(xiàn)功能,其他外部模塊均通過cadapter提供的c接口調(diào)用藍(lán)牙能力。
- 藍(lán)牙框架內(nèi)部實(shí)現(xiàn)層提供接口一一對(duì)應(yīng)cadapter和NAPI接口。BluettoothHost內(nèi)部通過SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager()接口得到samgr,然后通過BLUETOOTH_HOST_SYS_ABILITY_ID標(biāo)識(shí)獲取藍(lán)牙服務(wù)對(duì)象,然后通過藍(lán)牙服務(wù)對(duì)象通過IPC接口調(diào)用藍(lán)牙服務(wù)功能。
- 藍(lán)牙框架內(nèi)部提供RegisterObserver方式,允許其他層應(yīng)用(比如軟總線層通過調(diào)用cadapter接口GapRegisterCallbacks收聽藍(lán)牙的回調(diào)事件)收聽藍(lán)牙回調(diào)事件。
- 藍(lán)牙框架因?yàn)槭莿?dòng)態(tài)庫實(shí)現(xiàn),所以如果有多處依賴則會(huì)生成多份實(shí)例,如NAPI和軟總線都依賴藍(lán)牙框架庫,所以在系統(tǒng)里會(huì)有兩份實(shí)例同時(shí)若產(chǎn)生藍(lán)牙通知也會(huì)有兩個(gè)進(jìn)程同時(shí)收到消息。
- 藍(lán)牙系統(tǒng)能力
- 藍(lán)牙系統(tǒng)能力通過繼承SystemAbility,BluetoothHostStub兩個(gè)類實(shí)現(xiàn)藍(lán)牙服務(wù)能力并實(shí)現(xiàn)IPC進(jìn)行通信;IPC通信部分的代碼在藍(lán)牙文件夾foundation/communication/bluetooth/services/bluetooth/ipc內(nèi),提供proxy和stub實(shí)現(xiàn),即btipc_static.a靜態(tài)庫。
- 藍(lán)牙系統(tǒng)能力可視作藍(lán)牙服務(wù)進(jìn)程,提供包括藍(lán)牙狀態(tài)機(jī),藍(lán)牙adapter(classic,ble),藍(lán)牙profile服務(wù)實(shí)例。
- 藍(lán)牙系統(tǒng)配置在foundation/communication/bluetooth/services/bluetooth/etc/init目錄內(nèi),此部分內(nèi)容會(huì)在制作鏡像包時(shí)打包到系統(tǒng)文件內(nèi)去;在藍(lán)牙服務(wù)啟動(dòng)的時(shí)候會(huì)讀取藍(lán)牙配置(AdapterConfig::GetInstance()->Load(),ProfileConfig::GetInstance()->Load())并確定藍(lán)牙的snooplog(協(xié)議棧輸出文件)。
- 藍(lán)牙系統(tǒng)能力內(nèi)部使用Dispatcher模型執(zhí)行任務(wù)事務(wù),在Dispatcher對(duì)象內(nèi)部它通過線程加任務(wù)隊(duì)列的方式處理多條任務(wù)命令,目前實(shí)現(xiàn)方法為但線程依次處理隊(duì)列內(nèi)的事務(wù)。
- 藍(lán)牙系統(tǒng)能力層通過permission_utils提供應(yīng)用權(quán)限保護(hù)能力,服務(wù)調(diào)用功能時(shí)首先調(diào)用PermissionUtils::VerifyXXXBluetoothPermission(XXX包括,Use,Discover,Manage,Location),然后調(diào)用AuthCenter對(duì)應(yīng)功能,最后調(diào)用PermissionHelper對(duì)應(yīng)接口確認(rèn)權(quán)限;在AuthCenter里內(nèi)部定義了g_permissionAlwaysGrant全局變量,可以方便調(diào)試時(shí)擁有所有權(quán)限。
- 藍(lán)牙協(xié)議棧
- 藍(lán)牙協(xié)議棧通過c接口對(duì)藍(lán)牙服務(wù)層提供接口。
- 藍(lán)牙協(xié)議棧內(nèi)部他提供任務(wù)隊(duì)列方式處理藍(lán)牙命令(GapRunTaskBlockProcess, GapRunTaskUnBlockProcess),分別對(duì)于藍(lán)牙協(xié)議棧同步接口和異步接口。
- 藍(lán)牙協(xié)議棧內(nèi)部也有層級(jí),對(duì)上的是gap,中間是btm,對(duì)下的是hci,中間部分和其他藍(lán)牙協(xié)議站定義的內(nèi)容一致,如:att,avctp,avdtp,l2cap,rfcomm,sdp,smp。
- HCI層它通過g_hdiLib加載藍(lán)牙驅(qū)動(dòng)庫libbluetooth_hdi_adapter.so,并通過加載藍(lán)牙驅(qū)動(dòng)接口(HdiInit,HdiSendHciPacket,HdiClose)實(shí)現(xiàn)藍(lán)牙數(shù)據(jù)發(fā)送,藍(lán)牙數(shù)據(jù)接收(g_hdiCallacks)。
總結(jié)
- 藍(lán)牙服務(wù)的結(jié)構(gòu)也是所有開源鴻蒙的結(jié)構(gòu)能力,大致流程均為:NAPI框架,系統(tǒng)服務(wù)框架,IPC框架,Observer框架,原生driver框架(其實(shí)可以采用HDF框架);
- 目前開源鴻蒙用的藍(lán)牙協(xié)議站不是android,bluez,btstack這三種主流藍(lán)牙協(xié)議棧,根據(jù)注釋可得其參考《BLUETOOTH SPECIFICATION Version 5.0》實(shí)現(xiàn);目前官方最新的協(xié)議棧是v5.3,參考鏈接如下:https://www.bluetooth.com/specifications/specs/core-specification-5-3/。
文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載:
https://ost.51cto.com/resource/2381。