關於經典藍牙和低功耗藍牙的區別

剛開發藍牙的小夥伴在開發的時候,或許會看到經典藍牙和低功耗藍牙這兩種,不知道它們之間的區別與聯繫,今天給大家介紹一下經典藍牙和低功耗藍牙(BLE)的區別。
文章轉載自:
http://www.loverobots.cn/the-analysis-is-simple-compared-with-the-classic-bluetooth-and-bluetooth-low-energy-in-android.html

Android中的藍牙開發

要說到藍牙,小夥伴們聽到的可能有藍牙1.0、藍牙2.0、藍牙3.0、藍牙4.0之類的以數字結尾的藍牙版本號,而實際上,在最新的標準中,已經不再使用數字版本號作爲藍牙版本的區分了,取而代之的是經典藍牙與低功耗藍牙(BLE)這兩種區別。

這裏提到的低功耗藍牙也會有很多人會誤解爲就是藍牙4.0,但是完整的藍牙4.0規範中實際上包括有經典藍牙和低功耗藍牙這兩個部分,小夥伴們看看如下這張分類表就能夠明白這其中的關係了。

Android中經典藍牙與低功耗藍牙的簡單對比分析

如表中所述,咱們現在的藍牙實際上分爲了三類:單模、雙模和經典。那麼,最官方的藍牙版本稱呼就是,單模藍牙、雙模藍牙和經典藍牙。

在這其中,最前沿的當屬單模藍牙了,也就是低功耗藍牙。這個藍牙標準和經典藍牙區別極大,在最初甚至考慮過加入WIFI陣營,但是因爲藍牙陣營這邊條件較爲優厚(比如授權費用極低)才併入了藍牙標準。

那麼,低功耗藍牙和經典藍牙的區別究竟在哪裏呢?

要是僅僅從兩者的通信方式上來說,可以說除了名字叫藍牙外,完全可以當做兩個東西。這也就爲很多搞過經典藍牙以爲就可以很輕鬆的接着搞低功耗藍牙的人埋下了一個大坑。

不過,兩者在總體上的流程卻也是相似的(好吧,無線通信貌似也都是這麼個流程),那就是:

  • 發現設備->配對/綁定設備->建立連接->數據通信

經典藍牙和低功耗藍牙除了配對/綁定這個環節是一樣的之外,其它三個環節都是不同的。

1. 發現設備

經典藍牙設備發現其它經典藍牙設備的方式是調用BluetoothAdapter的startDiscovery()方法,這個方法只能夠發現經典藍牙設備。

低功耗藍牙中則有一個主設備(Central)和從設備(Peripheral,也叫外圍設備)的概念。主設備作爲發現方,調用發現設備的方法,通過BluetoothAdapter的startLeScan()方法實現。從設備則作爲被發現方,發出廣播,以供發現。同樣,這個startLeScan()方法也僅能夠發現低功耗藍牙從設備。

不過,在Android系統藍牙搜索界面,兩種藍牙設備都是可以被發現的。只有當兩種藍牙設備被某設備(包括當前的設備)配對/綁定後,纔不會再被掃描到。

2. 配對/綁定

有很多小夥伴都不太理解配對和綁定究竟有什麼區別,或者它們根本就是同一個東西。好吧,嚴格說配對和綁定是有區別的,也就是不是指的同一件事情。但是這兩者的區別比較模糊,也不好解釋。目前JACK的機器人的理解是,配對是建立兩者的對應關係,而綁定則把這層關係保存固定下來並進行了強化,暫時這麼理解着吧。

不管是經典藍牙還是低功耗藍牙,綁定方法都是通用的,可以調用相同的綁定方法。

3. 建立連接

在建立連接的方式上,兩者就千差萬別了。

——藍牙小知識——

在藍牙設備中,存在着物理地址,我們也叫作藍牙的MAC地址,這個地址是唯一的,就像咱們網絡上的IP地址。同時還存在着一個叫做UUID的東西,可以把它理解爲是IP地址中的端口號。正如知道了IP地址和端口號,就知道了怎麼鏈接到目標網絡服務器位置,知道了藍牙設備的MAC地址和UUID也就能夠確定到具體是哪一臺藍牙設備了,這兩者合起來就是藍牙的唯一身份標識。

經典藍牙建立連接的方式實際上就是Socket的連接的建立。只不過這裏不是直接用Socket,而是BluetoothSocket。獲取BluetoothSocket的方式也很簡單,利用搜索找到的BluetoothDevice,調用其方法createRfcommSocketToServiceRecord(UUID)。最後,使用獲取到的BluetoothDevice調用其方法connect()就建立了經典藍牙設備之間的連接通道。

低功耗藍牙則用了一種看起來比較怪異的方式建立連接(JACK的機器人被這種建立連接的方式折騰了好久)。

——關於BLE的一些基本概念——

Generic Attribute Profile (GATT)

通過BLE連接,讀寫屬性類小數據的Profile通用規範。現在所有的BLE應用Profile都是基於GATT的。

Attribute Protocol (ATT)

GATT是基於ATT Protocol的。ATT針對BLE設備做了專門的優化,具體就是在傳輸過程中使用盡量少的數據。每個屬性都有一個唯一的UUID,屬性將以characteristics and services的形式傳輸。

Characteristic

Characteristic可以理解爲一個數據類型,它包括一個value和0至多個對次value的描述(Descriptor)。

Descriptor

對Characteristic的描述,例如範圍、計量單位等。

Service

Characteristic的集合。例如一個service叫做“Heart Rate Monitor”,它可能包含多個Characteristics,其中可能包含一個叫做“heart rate measurement”的Characteristic。

這裏舉個例子,例如現在需要使用一個智能手機作爲主設備去連接一個作爲從設備的智能手環,那麼,此時這個作爲主設備的智能手機連接過程中實際是一個客戶端(Client),而作爲從設備的智能手環在此過程中則是服務端(Server)。這裏的主設備和從設備,客戶端和服務端一定要區分清楚。

想要和一臺BLE從設備建立連接,一般是某個智能設備,例如智能手環、智能燈泡之類的。如果使用智能手機作爲測試平臺,其硬件條件是,藍牙得至少是低功耗藍牙版本,然後安卓系統的話,至少得是Android 4.3以上系統才行,因爲Google在Android 4.3以上才做了BLE主設備的支持,如果想將智能手機作爲BLE從設備,則必須在Android 5.0以上才行。

具體建立GATT連接的順序則是,首先通過BluetoothAdapter的getRemoteDevice(address)方法獲取大相應BLE從設備的BluetoothDevice,其中的address爲目標藍牙設備MAC地址。然後通過此BluetoothDevice的connectGatt(this, false, mGattCallback)方法獲取設備連接。

此時的連接,只能夠進行監聽,也就是獲取到當前BLE從設備廣播出來的數據。

4. 數據通信

經典藍牙中,當建立連接後,就可以直接使用BluetoothSocket的getOutputStream()方法獲取輸出流寫入需要發送的數據。讀取發送回來的數據,則是調用BluetoothSocket的getInputStream()方法獲取輸入流讀取。這點和Java中的Socket通信幾乎是一模一樣。

而在低功耗藍牙中,想要實現主設備對從設備的數據發送,則需要直接讀取獲取到的從設備的Characteristic,而Characteristic又是Service下面的一層,所以操作順序是:

(1)通過BLE從設備相應的Service_UUID獲取對應的BluetoothGattService,獲取方法是:使用BluetoothDevice的connectGatt(this, false, mGattCallback)方法返回的BluetoothGatt對象,調用BluetoothGatt的方法getService(Service_UUID)獲取相應的BluetoothGattService;

(2)調用BluetoothGattService和對應的Characteristic的寫入UUID獲取相應的BluetoothGattCharacteristic,獲取方法是:調用BluetoothGattService的getCharacteristic(Characteristic_UUID)方法獲得;

(3)設置需要發送的命令值,調用BluetoothGattCharacteristic的方法setValue(value)進行設置,其中value一般爲byte[];

(4)最後,使用BluetoothGatt的寫入方法writeCharacteristic(TxChar)完成命令發送。

可以看到,想要實現BLE的數據通信,步驟相當繁瑣,這裏只是做一個簡單的概念理解,如果想要獲取到BLE從設備的返回值,還需要設置Notification,然後調用BluetoothGatt的readCharacteristic(characteristic)方法進行數據的讀取,這裏不做詳細說明了,放在以後詳細說明BLE通信的時候再做解釋。

最後奉上Google的官方藍牙演示DEMO源碼,來自Android官方網站,小夥伴們可以參考源碼再看看JACK的機器人的說明對比,這樣相信會更加利於理解。


Demo地址:
https://pan.baidu.com/share/init?shareid=4082102683&uk=3255186366
百度網盤提取碼:1qyp


此源碼壓縮包中包括三個工程,都需要使用Android Studio打開進行編譯安裝,具體說明如下:
(1)BluetoothAdvertisements.zip是Android智能設備作爲從設備的DEMO,需要在Android 5.0以上真機運行。
(2)BluetoothLeGatt.zip是Android智能設備作爲主設備的DEMO,需要在Android 4.3以上真機運行。
(3)BluetoothChat.zip是一個藍牙聊天室,兩臺具備藍牙的Android智能設備即可安裝運行,可以實現經典藍牙通信方式的數據發送與顯示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章