簡(jiǎn)述安卓傳統(tǒng)藍(lán)牙和低耗藍(lán)牙
概述:
通過(guò)藍(lán)牙傳輸數(shù)據(jù)與Socket類似嘱函。在網(wǎng)絡(luò)中使用Socket和ServerSocket控制客戶端和服務(wù)端的數(shù)據(jù)讀寫趁餐。而藍(lán)牙通訊也由客戶端和服務(wù)端Socket來(lái)完成伦吠。藍(lán)牙客戶端Socket是BluetoothSocket堤舒,藍(lán)牙服務(wù)端Socket是BluetoothServerSocket融师。這兩個(gè)類都在android.bluetooth包中帆疟。
無(wú)論是BluetoothSocket爆土,還是BluetoothServerSocket椭懊,都需要一個(gè)UUID(全局唯一標(biāo)識(shí)符,Universally Unique Identifier).格式如下:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
UUID的格式被分成5段,其中中間3段的字符數(shù)相同,都是4氧猬,第1段是8個(gè)字符背犯,最后一段是12個(gè)字符。所以UUID實(shí)際上是一個(gè)8-4-4-4-12的字符串盅抚。
UUID相當(dāng)于Socket的端口漠魏,而藍(lán)牙地址相當(dāng)于Socket的IP。
兩個(gè)藍(lán)牙設(shè)備進(jìn)行連接時(shí)需要使用同一個(gè)UUID妄均。但很多讀者可能發(fā)現(xiàn)柱锹,有很多型號(hào)的手機(jī)(可能是非Android系統(tǒng)的手機(jī))之間使用了不同的程序也可以使用藍(lán)牙進(jìn)行通訊。從表面上看丰包,它們之間幾乎不可能使用同一個(gè)UUID禁熏。
實(shí)際上,UUID和TCP的端口一樣邑彪,也有一些默認(rèn)的值瞧毙。例如,將藍(lán)牙模擬成串口的服務(wù)就使用了一個(gè)標(biāo)準(zhǔn)的UUID:
00001101-0000-1000-8000-00805F9B34FB寄症。除此之外宙彪,還有很多標(biāo)準(zhǔn)的UUID,如下面就是兩個(gè)標(biāo)準(zhǔn)的UUID瘸爽。
信息同步服務(wù):00001104-0000-1000-8000-00805F9B34FB
文件傳輸服務(wù):00001106-0000-1000-8000-00805F9B34FB
——傳統(tǒng)藍(lán)牙核心API——
BluetoothAdapter:BluetoothAdapter代表了移動(dòng)設(shè)備的本地的藍(lán)牙適配器, 通過(guò)該藍(lán)牙適配器可以對(duì)藍(lán)牙進(jìn)行基本操作, 例如 : 傳統(tǒng)藍(lán)牙啟動(dòng)設(shè)備發(fā)現(xiàn)(startDiscovery), 獲取已配對(duì)設(shè)備(getBoundedDevices), 通過(guò)mac藍(lán)牙地址獲取藍(lán)牙設(shè)備(getRemoteDevice), 從其它設(shè)備創(chuàng)建一個(gè)監(jiān)聽(tīng)連接(listenUsingRfcommWithServiceRecord);
BluetoothDevice:代表一個(gè)遠(yuǎn)程藍(lán)牙設(shè)備您访。讓你創(chuàng)建一個(gè)帶有各自設(shè)備的BluetoothDevice或者查詢其皆如名稱铅忿、地址剪决、類和連接狀態(tài)等信息。
BluetoothSocket: 已連接或連接到藍(lán)牙套接字(socket)檀训,類似TCP里面的Socket
BluetoothServerSocket:使用BluetoothServerSocket可以創(chuàng)建一個(gè)監(jiān)聽(tīng)服務(wù)端口, 使用accept()方法阻塞, 當(dāng)該方法監(jiān)測(cè)到連接的時(shí)候, 就會(huì)返回一個(gè)BluetoothSocket對(duì)象來(lái)管理這個(gè)連接, 例如獲取輸入輸出流等;柑潦,類似TCP里面的ServerSocket
——低耗藍(lán)牙——
BluetoothAdapter:同傳統(tǒng)藍(lán)牙
BluetoothDevice:同傳統(tǒng)藍(lán)牙
BluetoothGatt: BluetoothGatt作為中央來(lái)使用和處理數(shù)據(jù),ble開(kāi)發(fā)讀寫數(shù)據(jù)都需要用到它(非常重要)
1. 發(fā)現(xiàn)設(shè)備
經(jīng)典藍(lán)牙設(shè)備發(fā)現(xiàn)其它經(jīng)典藍(lán)牙設(shè)備的方式是調(diào)用BluetoothAdapter的startDiscovery()方法峻凫,這個(gè)方法只能夠發(fā)現(xiàn)經(jīng)典藍(lán)牙設(shè)備渗鬼。
低功耗藍(lán)牙中則有一個(gè)主設(shè)備(Central)和從設(shè)備(Peripheral,也叫外圍設(shè)備)的概念荧琼。主設(shè)備作為發(fā)現(xiàn)方譬胎,調(diào)用發(fā)現(xiàn)設(shè)備的方法,通過(guò)BluetoothAdapter的startLeScan()方法實(shí)現(xiàn)命锄。從設(shè)備則作為被發(fā)現(xiàn)方堰乔,發(fā)出廣播,以供發(fā)現(xiàn)脐恩。同樣镐侯,這個(gè)startLeScan()方法也僅能夠發(fā)現(xiàn)低功耗藍(lán)牙從設(shè)備。
不過(guò)驶冒,在Android系統(tǒng)藍(lán)牙搜索界面苟翻,兩種藍(lán)牙設(shè)備都是可以被發(fā)現(xiàn)的韵卤。只有當(dāng)兩種藍(lán)牙設(shè)備被某設(shè)備(包括當(dāng)前的設(shè)備)配對(duì)/綁定后,才不會(huì)再被掃描到崇猫。
2. 配對(duì)/綁定
不管是經(jīng)典藍(lán)牙還是低功耗藍(lán)牙沈条,綁定方法都是通用的,可以調(diào)用相同的綁定方法BluetoothAdapter.getRemoteDevice(address)诅炉。address就是ble設(shè)備的mac地址,獲取到一個(gè)BluetoothDevice對(duì)象拍鲤。
3. 建立連接
在建立連接的方式上,兩者就千差萬(wàn)別了汞扎。
——藍(lán)牙小知識(shí)——
在藍(lán)牙設(shè)備中季稳,存在著物理地址,我們也叫作藍(lán)牙的MAC地址澈魄,這個(gè)地址是唯一的景鼠,就像咱們網(wǎng)絡(luò)上的IP地址。同時(shí)還存在著一個(gè)叫做UUID的東西痹扇,可以把它理解為是IP地址中的端口號(hào)铛漓。正如知道了IP地址和端口號(hào),就知道了怎么鏈接到目標(biāo)網(wǎng)絡(luò)服務(wù)器位置鲫构,知道了藍(lán)牙設(shè)備的MAC地址和UUID也就能夠確定到具體是哪一臺(tái)藍(lán)牙設(shè)備了浓恶,這兩者合起來(lái)就是藍(lán)牙的唯一身份標(biāo)識(shí)。
經(jīng)典藍(lán)牙建立連接的方式實(shí)際上就是Socket的連接的建立结笨。只不過(guò)這里不是直接用Socket包晰,而是BluetoothSocket。獲取BluetoothSocket的方式也很簡(jiǎn)單炕吸,利用搜索找到的BluetoothDevice伐憾,調(diào)用其方法createRfcommSocketToServiceRecord(UUID)得到一個(gè)BluetoothSocket對(duì)象,最后使用獲取到的BluetoothSocket調(diào)用其方法connect()就建立了經(jīng)典藍(lán)牙設(shè)備之間的連接通道赫模。
低功耗藍(lán)牙則用了一種看起來(lái)比較怪異的方式建立連接树肃。
——關(guān)于BLE的一些基本概念——
Generic Attribute Profile (GATT)——全稱叫做通用屬性配置文件,GATT按照層級(jí)定義了三個(gè)概念瀑罗,服務(wù)(Service)胸嘴、特征(Characteristic)和描述(Descriptor)。一個(gè) Service 包含若干個(gè) Characteristic斩祭,一個(gè) Characteristic 包含若干個(gè) Descriptor劣像。
Characteristic——可以理解為一個(gè)類,包含了一個(gè) value 和零至多個(gè)對(duì)該 value 的描述 (BLE設(shè)備之間的通信就在在這個(gè)里面完成的)
Descriptor——對(duì) Characteristic 的描述停忿,例如范圍和計(jì)量單位等驾讲。 Service——Characteristic的集合。
這里舉個(gè)例子,例如現(xiàn)在需要使用一個(gè)智能手機(jī)作為主設(shè)備去連接一個(gè)作為從設(shè)備的智能手環(huán)吮铭,那么时迫,此時(shí)這個(gè)作為主設(shè)備的智能手機(jī)連接過(guò)程中實(shí)際是一個(gè)客戶端(Client),而作為從設(shè)備的智能手環(huán)在此過(guò)程中則是服務(wù)端(Server)谓晌。這里的主設(shè)備和從設(shè)備掠拳,客戶端和服務(wù)端一定要區(qū)分清楚。
想要和一臺(tái)BLE從設(shè)備建立連接纸肉,一般是某個(gè)智能設(shè)備溺欧,例如智能手環(huán)、智能燈泡之類的柏肪。如果使用智能手機(jī)作為測(cè)試平臺(tái)姐刁,其硬件條件是,藍(lán)牙得至少是低功耗藍(lán)牙版本烦味,然后安卓系統(tǒng)的話聂使,至少得是Android4.3以上系統(tǒng)才行,因?yàn)镚oogle在Android4.3以上才做了BLE主設(shè)備的支持谬俄,如果想將智能手機(jī)作為BLE從設(shè)備柏靶,則必須在Android 5.0以上才行。
具體建立GATT連接的順序則是溃论,首先通過(guò)BluetoothAdapter的getRemoteDevice(address)方法獲取大相應(yīng)BLE從設(shè)備的BluetoothDevice屎蜓,其中的address為目標(biāo)藍(lán)牙設(shè)備MAC地址。然后通過(guò)此BluetoothDevice的connectGatt(this,false, mGattCallback)方法獲取設(shè)備連接钥勋。此時(shí)的連接炬转,只能夠進(jìn)行監(jiān)聽(tīng),也就是獲取到當(dāng)前BLE從設(shè)備廣播出來(lái)的數(shù)據(jù)笔诵。
4. 數(shù)據(jù)通信
經(jīng)典藍(lán)牙中返吻,當(dāng)建立連接后,就可以直接使用BluetoothSocket的getOutputStream()方法獲取輸出流寫入需要發(fā)送的數(shù)據(jù)乎婿。讀取發(fā)送回來(lái)的數(shù)據(jù),則是調(diào)用BluetoothSocket的getInputStream()方法獲取輸入流讀取街佑。這點(diǎn)和Java中的Socket通信幾乎是一模一樣谢翎。
而在低功耗藍(lán)牙中,想要實(shí)現(xiàn)主設(shè)備對(duì)從設(shè)備的數(shù)據(jù)發(fā)送沐旨,則需要直接讀取獲取到的從設(shè)備的Characteristic森逮,而Characteristic又是Service下面的一層,所以操作順序是:
(1)通過(guò)BLE從設(shè)備相應(yīng)的Service_UUID獲取對(duì)應(yīng)的BluetoothGattService磁携,獲取方法是:使用BluetoothDevice的connectGatt(this,false,mGattCallback)方法返回的BluetoothGatt對(duì)象褒侧,調(diào)用BluetoothGatt的方法getService(Service_UUID)獲取相應(yīng)的BluetoothGattService;
(2)調(diào)用BluetoothGattService和對(duì)應(yīng)的Characteristic的寫入U(xiǎn)UID獲取相應(yīng)的BluetoothGattCharacteristic,獲取方法是:調(diào)用BluetoothGattService的getCharacteristic(Characteristic_UUID)方法獲得闷供;
(3)設(shè)置需要發(fā)送的命令值烟央,調(diào)用BluetoothGattCharacteristic的方法setValue(value)進(jìn)行設(shè)置,其中value一般為byte[]歪脏;
(4)最后疑俭,使用BluetoothGatt的寫入方法writeCharacteristic(BluetoothGattCharacteristic)完成命令發(fā)送。
可以看到婿失,想要實(shí)現(xiàn)BLE的數(shù)據(jù)通信钞艇,步驟相當(dāng)繁瑣,這里只是做一個(gè)簡(jiǎn)單的概念理解豪硅,如果想要獲取到BLE從設(shè)備的返回值县遣,還需要設(shè)置Notification,然后調(diào)用BluetoothGatt的readCharacteristic(characteristic)方法進(jìn)行數(shù)據(jù)的讀取别洪,這里不做詳細(xì)說(shuō)明了魔招,放在以后詳細(xì)說(shuō)明BLE通信的時(shí)候再做解釋。
最后奉上Google的官方藍(lán)牙演示DEMO源碼嵌溢,來(lái)自Android官方網(wǎng)站