先看一下:藍牙協(xié)議棧的分層結(jié)構(gòu)
首先,從大的邏輯上,藍牙協(xié)議??梢苑譃槿龑?,分別是APP應(yīng)用層,Host邏輯鏈路層和Controller硬件交互層。
APP應(yīng)用層其實是我們能夠看到的各種具體的藍牙設(shè)備,比如實現(xiàn)的藍牙耳機,藍牙鼠標,藍牙鍵盤等等。
在應(yīng)用層中,我們的鼠標移動數(shù)據(jù),或者鍵盤的敲擊按鍵數(shù)據(jù),要想通過藍牙傳輸,就需要調(diào)用下一層的API來進行調(diào)用,實現(xiàn)數(shù)據(jù)的傳輸。
那么,Host層就為APP層提供了上述的傳輸API,當然Host層本身還提供了很多通用的藍牙訪問文件層,自適應(yīng)的一些層,鏈接的安全管理層,屬性協(xié)議層以及訪問配置文件和屬性配置文件層。
再下一層就是Controller,它主要負責與硬件層的交互,其中包括了物理層,鏈路層和主機控制接口層。
我們來分別看一下各個模塊的具體內(nèi)容,我們從下層向上壘一下。
PHY
這一層主要是指的物理層的信道,藍牙BLE使用無線通信,其頻率規(guī)定為免費的2.4Ghz,具備2Mbps帶寬,自適應(yīng)跳頻GFSK的無線電系統(tǒng)。
LL
LL層是鏈路層,它負責控制設(shè)備的RF狀態(tài),一共有五個狀態(tài):Standby,Advertising,Scanning,Initiating,Connected。
LL層可以發(fā)送廣播包和數(shù)據(jù)包,他會通過定時機制,在主機和從機的連接期間內(nèi)進行數(shù)據(jù)發(fā)送和接收。
LL層負責自適應(yīng)調(diào)頻算法,對于廣播包,他會選擇在37,38,39三個廣播信道上循環(huán)發(fā)送。
對于數(shù)據(jù)包,會使用自適應(yīng)跳頻算法,在0~36這37個數(shù)據(jù)信道中挑選可用的信道。
調(diào)頻算法在之前的文章中。
HCI
HCI 層負責主機和控制器之間的通信,是 Host 和 Controller 通信之間的接口。定義了特定的格式來控制藍牙芯片來做相應(yīng)的動作(比如:inquiry,connect,disconnect)。
HCI 層為上層級提供了一個統(tǒng)一訪問 HCI 控制器的接口,其接口為一系列的指令和事件,接口適用于 BR/EDR/LE/AMP 控制器。
HCI 層位于藍牙高層協(xié)議和低層協(xié)議之間,其目的是實現(xiàn)主機設(shè)備與藍牙模塊之間的互操作,即 HCI 是藍牙主機與主機控制器間軟硬件接口。
HCI 為藍牙硬件中基帶控制器和鏈接管理器提供了命令接口,從而實現(xiàn)對硬件狀態(tài)注冊器和控制寄存器的訪問,提供了對藍牙基帶的統(tǒng)一訪問模式。
目前,HCI 的傳輸層主要有:USB,RS-232,UART 等,早些年很多外掛的藍牙外設(shè)芯片,他們的界面就是基于HCI這一層。
L2CAP
向上層提供數(shù)據(jù)封裝服務(wù),允許端到端的數(shù)據(jù)通信。
在LL協(xié)議中,實現(xiàn)了邏輯連接(logic link)建立,硬件地址尋址,CRC校驗等功能。
而在L2CAP層中,通過對LL層建立的邏輯連接進行控制和適配,來實現(xiàn)不同應(yīng)用。
實現(xiàn)數(shù)據(jù)傳輸中對分包、組包、流控、重傳等功能需求。
L2CAP主要功能:
1.協(xié)議信道復用(protocol/channel multiplexing)
2.分段與重組(segmentation and reassembly SAR)
3.每個信道流控(per-channel flow control)
4.差錯控制(error control)
L2CAP為上層,提供了一個可靠的數(shù)據(jù)收發(fā)接口。
SMP
這一層主要定義配對功能和秘鑰的分發(fā)機制。
GAP
負責訪問模式和進程,包括設(shè)備發(fā)現(xiàn)、建立連接、終止連接、初始化安全特征和設(shè)備配置。
GAP(Generic Access Profile, 通用訪問規(guī)范),該profile保證不同的Bluetooth產(chǎn)品可以互相的發(fā)現(xiàn)對方并建立連接。同時描述了設(shè)備如何成為廣播者和觀察者,并且實現(xiàn)無需連接的數(shù)據(jù)傳輸。
GAP層還定義了不同類型的地址來實現(xiàn)隱私性和可解析性。
GAP將設(shè)備分為四種角色:外圍設(shè)備(Peripheral),中央設(shè)備(Central),播報設(shè)備(Broadcast),觀察設(shè)備(Observer)。
· 外圍設(shè)備(Peripheral):廣播發(fā)送者,是可連接的設(shè)備,連接后成為從設(shè)備
· 中央設(shè)備(Central):掃描廣播啟動連接,連接后成為主設(shè)備
· 播報設(shè)備(Broadcaster):廣播發(fā)送者,不是可連接的設(shè)備
· 觀察設(shè)備(Observer):掃描廣播啟動連接,連接后成為主設(shè)備
那么為什么GAP要分為4種角色?
因為藍牙標準制定的考慮,BLE主打低功耗,所以在BLE體系中,為了更大可能的優(yōu)化設(shè)備,節(jié)省功耗,所有層都采用了非對稱的設(shè)計(主從不同構(gòu)),對于物理層的無線電裝置,可以是以下3種形式:
- 芯片只有發(fā)射機:只能發(fā)射無線信號,不能接收無線信號,硬件成本低。芯片只有接收機:只能接收無線信號,不能發(fā)射無線信號,硬件成本低。芯片同時具有接收機和發(fā)射機:既可以接收無線信號,也可發(fā)射無線信號,硬件成本較高。
這樣,當某個應(yīng)用只需要在設(shè)備之間單向傳輸數(shù)據(jù)時,其中一個設(shè)備可以作為廣播者,采用只有發(fā)射機的芯片,另外一個設(shè)備可以作為觀察者,并且用了盡量少的硬件資源,所以功耗會更低,理論造價也會更低。
當然,我們也可以用同時具有接收機和發(fā)射機的設(shè)備實現(xiàn)這些功能,實際產(chǎn)品中,用這種方式的更多,但是因為只需實現(xiàn)單項傳輸,廣播者多了用不到的接收機,觀察者多了用不上的發(fā)射機,這會增加電流的消耗和硬件成本。
所以,藍牙標準的制定考慮的足夠多,從功耗、成本、以及各種應(yīng)用場景都做了全面的考慮。
GAP層為藍牙確定了主從關(guān)系,以及連接過程中遵循的各種參數(shù),比如鏈接間隔,廣播間隔,廣播數(shù)據(jù),掃描間隔等等等,他確保了兩個設(shè)備之間的建立鏈接過程。
ATT
ATT層是一個非常重要的層,定義了各種屬性、屬性的操作方法,但是這些屬性有什么作用,能給用戶提供什么服務(wù),它并不知道,他只是允許設(shè)備向其他設(shè)備公開某些數(shù)據(jù)或?qū)傩?,也就是客戶和服?wù)端模型。
Client 和 Server 之間是通過 ATT PDU來通信的,ATT PDU主要包括4類:讀,寫,notify 和 indicate。
我們舉一個生活中的例子來了解ATT的作用:
GATT
GATT層主要用于定義如何使用ATT的服務(wù)框架,它是一個通用屬性,BLE連接后的通信協(xié)議是建立在GAT協(xié)議之上的。它定義了兩個BLE設(shè)備之間,通過Service和Characteristic進行通信。
GATT結(jié)構(gòu)由嵌套的Profile、Service、Characteristics組成。
每個Profile就是預先定義好的Service集合。例如官方的心率Heart Rate Profile就是結(jié)合了Heart Rate Service和Device Information Service。
https://btprodspecificationrefs.blob.core.windows.net/gatt-specification-supplement/GATT_Specification_Supplement.pdf
Service就是一個獨立的邏輯項,它包含一個或多個Characteristic,每個Service都由唯一的UUID標識,UUID有16位的有128位的,16位的UUID是官方通過認證的,需要花錢購買,128位的可以隨便自己定義。
Characteristic是GATT中最小的邏輯數(shù)據(jù)單元,當然它可能包含一組關(guān)聯(lián)的數(shù)據(jù),例如加速度計的 X/Y/Z 三軸值。
在官方心率的例子,可以看到它包含了 3 個 Characteristic:Heart Rate Measurement、Body Sensor Location 和 Heart Rate Control Point,并且定義了只有第一個是必須的,其他是可選實現(xiàn)的。
每個Characteristic對應(yīng)的value就是對應(yīng)格式的實際心率數(shù)據(jù)。中心可以通過讀取service、再進一步讀取characteristic來獲得具體的心率數(shù)值。
每個 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一標識。所有數(shù)據(jù)交互必須通過明確的UUID確定到service和characteristic。
實際上,和 BLE 外設(shè)打交道,主要是通過 Characteristic。
你可以從 Characteristic 讀取數(shù)據(jù),也可以往 Characteristic 寫數(shù)據(jù),這樣就實現(xiàn)了雙向的通信。
所以你可以自己實現(xiàn)一個類似串口(UART)的 Sevice,這個 Service 中包含兩個 Characteristic,一個被配置只讀的通道(RX),另一個配置為只寫的通道(TX),這就是我們常用的透傳模塊。