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