簡介
Bluetooth Low Energy (BLE),也經(jīng)常被稱為Bluetooth Smart,它是傳統(tǒng)藍牙的子集,在Bluetooth 4.0 core specification中被引入。雖然BLE和傳統(tǒng)藍牙有很多重疊的地方,但是它是有自己獨特的歷史血統(tǒng)的,BLE被Bluetooth SIG即藍牙標準納入之前,一直是諾基亞發(fā)展的一個叫做Wibree的室內(nèi)項目。
對工程師們來說雖然有很多種的無線協(xié)議可供選擇,但是BLE是實現(xiàn)和現(xiàn)代移動平臺通信的最簡單的方式,尤其是對于蘋果設(shè)備而言,BLE可以說是唯一的可以避免為了成功的提交蘋果商店的硬件設(shè)計選擇。
以下的簡介將使你有一個快速對BLE的總體的了解,尤其是數(shù)據(jù)如何組織,以及設(shè)備如何通過廣播來告之其存在,讓你可以連接他們并進行數(shù)據(jù)的傳輸。
BLE平臺支持
以下列出的設(shè)備和平臺均支持藍牙 4.0和BLE:
- iOS5+ (iOS7+ preferred)
- Android 4.3+ (numerous bug fixes in 4.4+)
- Apple OS X 10.6+
- Windows 8 (XP, Vista and 7 only support Bluetooth 2.1)
- GNU/Linux Vanilla BlueZ 4.93+
GAP
GAP是Generic Access Profile的縮寫,它控制著藍牙的連接和廣播過程。GAP協(xié)議使得設(shè)備可以被其他設(shè)備識別,并決定兩個設(shè)備如何交互。
設(shè)備角色
GAP為設(shè)備定義了各種各樣的角色,但兩個最關(guān)鍵的概念是中心設(shè)備(Central devices)和周邊設(shè)備(Peripheral* devices)。
周邊設(shè)備是指那些體積較小,功耗較小,資源有限的設(shè)備,它可以連接更加強大的中心設(shè)備,例如各種手環(huán),手表,心跳檢測器等;中心設(shè)備通常指的是手機或者平板等擁有更強大的計算和存儲的設(shè)備。
下圖可以詳細的說明了整個廣播的過程,以及廣播負載和掃描回復(fù)負載是如何工作的。
周邊設(shè)備會設(shè)置一個特定的廣播的時間間隔(Advertising Interval),每個時間段的開始,它會發(fā)送其廣播數(shù)據(jù)包,時間間隔越長節(jié)省電量,但是不能及時被掃描到。這是很明顯的道理。
周邊設(shè)備的廣播包括兩種,一種是Advertising data,一種是scan response data,廣播數(shù)據(jù)就是上面所說的,是必選,每一廣播間隔開始都會不間斷發(fā)送,通過它來告訴中心設(shè)備自己的存在;掃描回復(fù)則是可選的,它包含了設(shè)備的基本信息,比如設(shè)備的名字和地址等,只有當中心設(shè)備對他感興趣,發(fā)送掃描回復(fù)請求時,周邊設(shè)備才會發(fā)送掃描回復(fù)數(shù)據(jù)包作為反饋。

廣播網(wǎng)絡(luò)拓撲
盡管大多數(shù)情況下,周邊設(shè)備廣播自己都是為了建立連接后使用GATT services、characteristics完成更多的雙向的數(shù)據(jù)交換,但也有些情況是不需要連接的,只需要周邊設(shè)備將數(shù)據(jù)廣播出去即可。
這種情況主要存在于需要周邊設(shè)備同時給多個中心設(shè)備發(fā)送數(shù)據(jù),而一旦建立連接,數(shù)據(jù)的收發(fā)就只對在建立連接的兩臺設(shè)備間可見。
周邊設(shè)備可以發(fā)送一段包含少量自定義數(shù)據(jù)的31字節(jié)的廣播或者掃描回復(fù)包給在監(jiān)聽范圍的所有設(shè)備,這就是典型的BLE廣播的過程。
通俗點的講就是BLE的廣播有兩種作用,一種是告訴中心設(shè)備自己的存在然后等待連接;另一種就是單純的對外廣播信息,蘋果的iBeacon就是后者的定性應(yīng)用,它在廣播包Manufacturer Specific Data中插入了一段自定義的數(shù)據(jù),用來完成特定的功能。

周邊設(shè)備和中心設(shè)備一旦建立連接,周邊設(shè)備的廣播過程就停止了,也不能再發(fā)送廣播包了,接下來就要通過GATT services和characteristic進行通信。
GATT
GATT全稱Generic Attribute Profile,中文名叫通用屬性協(xié)議,它定義了services和characteristic兩種東西來完成低功耗藍牙設(shè)備之間的數(shù)據(jù)傳輸。它是建立在通用數(shù)據(jù)協(xié)議Attribute Protocol (ATT),之上的,ATT把services和characteristic以及相關(guān)的數(shù)據(jù)保存在一張簡單的查找表中,該表使用16-bit的id作為索引。
一旦兩個設(shè)備建立了連接,GATT就開始發(fā)揮作用,同時意味著GAP協(xié)議管理的廣播過程結(jié)束了。但是必須要知道的是,建立GATT連接必要經(jīng)過GAP協(xié)議。
最重要的事情,GATT連接是獨占的,也就意味著一個BLE周邊設(shè)備同時只能與一個中心設(shè)備連接。一旦周邊設(shè)備與中心設(shè)備連接成功,直至連接斷開,它不再對外廣播自己的存在,其他的設(shè)備就無法發(fā)現(xiàn)該周邊設(shè)備的存在了。
周邊設(shè)備和中心設(shè)備要完成雙方的通信只能通過建立GATT連接的方式。
網(wǎng)絡(luò)連接拓撲
下圖展示了BLE設(shè)備如何工作的。一個周邊設(shè)備只能同時連接一臺中心設(shè)備,但是中心設(shè)備可以連接多臺周邊設(shè)備。
如果兩個周邊設(shè)備需要進行數(shù)據(jù)的交換的話,就必須經(jīng)由中心設(shè)備的中轉(zhuǎn)。
一旦周邊設(shè)備和中心設(shè)備建立了連接,通信就是雙向的了,對比前面的GAP廣播的網(wǎng)絡(luò)拓撲,通信是單向的,只能由周邊設(shè)備往中心設(shè)備廣播數(shù)據(jù)。

GATT事務(wù)
GATT是基于典型的C/S模式,其中周邊設(shè)備通常扮演GATT Server,它保有services、characteristic以及查找表,也就是數(shù)據(jù)的存儲是在GATT Server中;而例如手機平板等中心設(shè)備通常是GATT Client,他們向GATT Server發(fā)送請求。一切都是主設(shè)備GATT Client發(fā)起,然后接受來自從設(shè)備GATT Server的相應(yīng)。
當連接建立之后,周邊設(shè)備會給中心設(shè)備建議一個連接間隔(Connection Interval),然后中心設(shè)備每個時間間隔都會重連查看是否有新數(shù)據(jù)可以獲取。但是這個連接間隔只是一個建議,因為中心設(shè)備可能忙于與其它周邊設(shè)備通信或者系統(tǒng)資源不可得而并不能完全遵循。
下圖展示了周邊設(shè)備和中心設(shè)備的數(shù)據(jù)交換的流程,可以看出每一次事務(wù)都是由中心設(shè)備發(fā)起的,而周邊設(shè)備只負責應(yīng)答。

- Services and Characteristics
BLE GATT通信是基于嵌套的Profiles, Services andCharacteristics結(jié)構(gòu)之上的,下圖是其框架:

- Profiles
Profile并不是真實存在的一種結(jié)構(gòu),而是多個完成某一特定功能services的集合,或者說是對這個特定結(jié)合的功能的描述,或者名稱。以Heart Rate Profile為例,它包括Heart Rate Service 和 Device Information Service,他們都是為了完成測量心率這個功能而存在的service。
更詳細的可以查看Profiles Overview。
- Services
每個service擁有一個唯一標識UUID,可以是官方認證的16bit的id,也可以是128位的自定義id。service是GATT數(shù)據(jù)的邏輯分類,它包含一個或者多個characteristic。
官方通過了一些標準 Service,完整列表在這里。以 Heart Rate Service為例,可以看到它的官方通過 16 bit UUID 是 0x180D
,包含 3 個 Characteristic:Heart Rate Measurement, Body Sensor Location 和 Heart Rate Control Point,實現(xiàn)該service第一個Heart Rate Measurement是必選的,其他兩個是可選的。
- Characteristics
Characteristic也擁有一個16-bit 或者128-bit的UUID,它是GATT通信中的最小的邏輯數(shù)據(jù)單元,它封裝了一個單一的數(shù)據(jù)點,當然這個數(shù)據(jù)點可能包含一組相關(guān)的數(shù)據(jù),比如加速度傳感器的x/y/z三個坐標軸的數(shù)據(jù)。
實際上,和 BLE 外設(shè)打交道,主要是通過 Characteristic。你可以從 Characteristic 讀取數(shù)據(jù),也可以往 Characteristic 寫數(shù)據(jù)。這樣就實現(xiàn)了雙向的通信。你可以使用Characteristic實現(xiàn)一個類似串口(UART)的 Sevice,這個 Service 中包含兩個 Characteristic,一個被配置只讀的通道(RX),另一個配置為只寫的通道(TX)。