2018-02-20

簡(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)站

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眯牧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赖草,更是在濱河造成了極大的恐慌学少,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秧骑,死亡現(xiàn)場(chǎng)離奇詭異版确,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)乎折,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門绒疗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人骂澄,你說(shuō)我怎么就攤上這事吓蘑。” “怎么了坟冲?”我有些...
    開(kāi)封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵磨镶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我健提,道長(zhǎng)琳猫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任私痹,我火速辦了婚禮脐嫂,結(jié)果婚禮上统刮,老公的妹妹穿的比我還像新娘。我一直安慰自己账千,他們只是感情好侥蒙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蕊爵,像睡著了一般辉哥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攒射,一...
    開(kāi)封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天醋旦,我揣著相機(jī)與錄音,去河邊找鬼会放。 笑死饲齐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咧最。 我是一名探鬼主播捂人,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矢沿!你這毒婦竟也來(lái)了滥搭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捣鲸,失蹤者是張志新(化名)和其女友劉穎瑟匆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體栽惶,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愁溜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了外厂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冕象。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汁蝶,靈堂內(nèi)的尸體忽然破棺而出渐扮,到底是詐尸還是另有隱情,我是刑警寧澤穿仪,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布席爽,位于F島的核電站,受9級(jí)特大地震影響啊片,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玖像,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一紫谷、第九天 我趴在偏房一處隱蔽的房頂上張望齐饮。 院中可真熱鬧,春花似錦笤昨、人聲如沸祖驱。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捺僻。三九已至,卻和暖如春崇裁,著一層夾襖步出監(jiān)牢的瞬間匕坯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工拔稳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葛峻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓巴比,卻偏偏與公主長(zhǎng)得像术奖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轻绞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容