Android BLE開發(fā)之初識GATT

前言

BLE是在Android 4.3上被引入的潭苞,并在android 5.0上加入了ble advertise的API支持贫奠。其時,IOS上的BLE已經(jīng)玩的風生水起现拒,其中IOS的ANCS服務就是基于BLE封裝的通知下發(fā)協(xié)議,而IBeacon是基于BLE廣播的單向傳輸?shù)膽谩?br> Android上的BLE開發(fā)算是個后發(fā)者望侈,但是android開放了對BLE的支持后印蔬,我們就可以又很多好玩的東西可以嘗試了,比如以前IOS的藍牙是無法與Android的藍牙進行通信的脱衙,有了BLE這就有了可能侥猬,還有讀取IOS的下發(fā)通知,自己實現(xiàn)和android手表的通信捐韩,讀取手環(huán)的數(shù)據(jù)等等有趣的東西退唠。

而中文社區(qū)中關于Android BLE的開發(fā)資料幾乎全是android官網(wǎng)上BLE開發(fā)指南的原版翻譯,但是該網(wǎng)站上的內(nèi)容是基于Android 4.3來寫的荤胁,其中的API已經(jīng)過時瞧预,最新的BLE API應該是基于Android 5.0的,所以我根據(jù)官網(wǎng)的思路基于最新的API最簡單的方式介紹Android的BLE開發(fā)仅政。
以后還會把跟BLE相關的內(nèi)容都整理下來垢油,作為一個系列。

基本概念

想要進行Ble相關的開發(fā)圆丹,我們必須具備一定的基礎知識滩愁,當然基礎知識肯定是非常簡單的。

設備角色

首先要明白的是辫封,這兩種角色的區(qū)分是硬件層面上硝枉,而且是成對出現(xiàn)的相對概念:
** 中心設備(Central device) **:功能相對強大,用來掃描和連接周邊設備的倦微,例如手機妻味、平板等
** 周邊設備(Central device) **:功能相對簡單,功耗較小欣福,被中心設備連接以提供數(shù)據(jù)的责球,例如手環(huán)、智能體溫計等

其實從最根本上來講劣欢,它應該是在對建立連接的過程不同角色的一種區(qū)分棕诵。我們知道藍牙設備要想讓別人知道自己的存在裁良,是要不間斷的對外放松廣播的凿将,而另外一方則需要掃描并回復該廣播包,這樣才能建立連接价脾,在這個過程中牧抵,負責廣播的就是peripheral,而負責掃描的是Central。

關于兩者的連接過程需要注意:

  • 中心設備可以同時連接多個周邊設備犀变。
  • 周邊設備一旦被連接上妹孙,立刻停止廣播,斷開后繼續(xù)廣播
  • 任何時候只能一個設備嘗試連接获枝,排隊連接蠢正。
GATT

BLE技術是基于GATT進行通信的,GATT是一種屬性傳輸協(xié)議省店,簡單的講可以認為是一種屬性傳輸?shù)膽脤訁f(xié)議嚣崭。
它的結構非常簡單:


GATT結構圖

你可以把他看成xml來理解:

  • 每個GATT由完成不同功能的Service組成;
  • 每個Service由不同的Characteristic組成懦傍;
  • 每個Characteristic由一個value和一個或者多個Descriptor組成雹舀;
  • Service、Characteristic相當于標簽(Service相當于他的類別粗俱,Characteristic相當于它的名字)说榆,而value才真正的包含數(shù)據(jù),Descriptor是對這個value進行的說明和描述寸认,當然我們可以從不同角度來描述和說明签财,因此可以有多個Descriptor.

這樣子理解可能不夠準確,下面我們來舉一個簡單的例子進行說明:

常見的小米手環(huán)是一個BLE設備偏塞,(假設)它包含三個Service,分別是提供設備信息的Service荠卷、提供步數(shù)的Service、檢測心率的Service;
而設備信息的service中包含的characteristic包括廠商信息烛愧、硬件信息油宜、版本信息等;而心率Service則包括心率characteristic等怜姿,而心率characteristic中的value則真正的包含心率的數(shù)據(jù)慎冤,而descriptor則是對該value的描述說明,比如value的單位啊沧卢,描述啊蚁堤,權限啊等。

GATT C/S

對GATT有了初步的了解但狭,我們知道GATT是一種典型的C/S模式披诗,既然是C/S那么我們就有必要對Server和client進行區(qū)分。

** GATT server ** vs. ** GATT client **立磁。這兩種角色存在的階段則是建立連接之后呈队,根據(jù)對話地位的不同進行區(qū)分的,很容易理解的是唱歧,保有數(shù)據(jù)的那一方我們稱之為GATT server宪摧,訪問數(shù)據(jù)的那一方我們稱之為GATT client粒竖。

這和我們之前提到的設備角色是不同層面的概念,有必要加以區(qū)分几于,我們還是用一個簡單的例子進行說明:

以手機和手表的例子來進行說明蕊苗,手機和手機建立連接之前,我們都是用手機的藍牙搜索功能去搜索手表的藍牙設備沿彭,這個過程中很明顯手表在進行BLE廣播以便其他設備知道自己的存在朽砰,它在這個過程中就是peripheral的角色,而手機負責掃描的任務喉刘,自然扮演的就是Center了锅移;兩者建立了GATT連接后,當手機需要從手表中讀取步數(shù)等傳感器數(shù)據(jù)時饱搏,兩者交互的數(shù)據(jù)是保存在手表中的非剃,因此此時手表就是GATT server的角色,自然手機就作為GATT client推沸;而當手表想要從手機讀取短信電話等信息室备绽,數(shù)據(jù)的保佑者又變成了手機,所以此時手機就是server 鬓催,而手表則是client肺素。

Service/Characteristic

上面我們已經(jīng)對他們有了感性的理解,接下來我們來一些實用的信息:

  1. Characteristic是最小的數(shù)據(jù)邏輯單元∮罴荩現(xiàn)在不難理解了吧倍靡。
  2. value、descriptor中存儲數(shù)據(jù)的解析由Server的工程師決定课舍,并無規(guī)范塌西,雙發(fā)按照約定開發(fā)。
  3. Service/Characteristic均有一個唯一的UUID標識筝尾,UUID既有16位的也有128位的捡需,我們需要了解的是16位的UUID是經(jīng)過藍牙組織認證的,是需要購買的筹淫,當然也有一些通用的16位UUID站辉。
    例如Heart Rate服務的UUID就是0X180D,代碼中表示為0X00001800-0000-1000-8000-00805f9b34fb,其他位為固定的。而128位的UUID則可以自定義损姜。
  4. GATT連接是獨占的饰剥。

應用開發(fā)

添加權限

進行藍牙APP的開發(fā),需要在manifest文件中加入如下的權限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

BLUETOOTH權限使得你的APP可以使用藍牙的對話功能摧阅,例如建連和數(shù)據(jù)的傳輸汰蓉。
BLUETOOTH_ADMIN權限允許APP啟動設備的被發(fā)現(xiàn)以及操作藍牙的settings。
其他更詳細的查看官網(wǎng)上的說明BLE開發(fā)指南

獲得藍牙

要想進行ble的開發(fā)首先要獲得設備上的藍牙適配器并保證藍牙是使能的逸尖,這樣才能進一步的進行ble的相關操作古沥。

  1. 獲得藍牙適配器
    系統(tǒng)啟動的時候藍牙相關的系統(tǒng)服務已經(jīng)開啟,這時候我們首先要獲得系統(tǒng)的藍牙服務:
BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

通過藍牙的系統(tǒng)服務得到藍牙適配器:

BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();

得到藍牙適配器之后娇跟,我們就能進行藍牙的相關操作岩齿,無論是經(jīng)典藍牙還是ble都可以,當然進行這些操作之前我們首先使能藍牙苞俘。

  1. 藍牙的使能
    這個當然是為了保證藍牙是開著的盹沈,給藍牙芯片使能。
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

這段代碼是調(diào)用了系統(tǒng)提供的開啟藍牙的對話框吃谣,點擊即可使能藍牙乞封,其實本質(zhì)也是調(diào)用BluetoothAdapter.enable()。

  1. 掃描Ble設備
//1. Android 4.3以上岗憋,Android 5.0以下
mBluetoothAdapter.startLeScan(BluetoothAdapter.LeScanCallback LeScanCallback)
//2. Android 5.0以上肃晚,掃描的結果在mScanCallback中進行處理
mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
mBluetoothLeScanner.startScan(ScanCallback mScanCallback);

注意傳入的callback參數(shù)是不同的。以下我們都按照5.0的API進行仔戈。

  1. 得到掃描結果
    在掃描結果的callback函數(shù)中將掃描到的設備的名稱和地址進行打印关串。
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            if(result != null){
                System.out.println("掃面到設備:" + result.getDevice().getName() + "  " + result.getDevice().getAddress()); 
            }
        }

因為掃描本身是個耗電操作,因此掃描到目標設備后應該立即體停止掃描

if(mTargetDeviceName.equal(result.getDevice().getName())){
        mBluetoothLeScanner.stopScan(mScanCallback);
}
  1. 對目標設備進行連接
result.getDevice().connectGatt(MainActivity.this, false, mGattCallback);

傳入的BluetoothGattCallback對象中對連接結果做處理监徘,以及通過GATT進行通信的絕大多數(shù)的操作都在這個對象中晋修,至于后續(xù)BluetoothGattCallback的講解,我們將在demo以及后續(xù)的文章中進行凰盔。

應用demo之初識gatt

Android官網(wǎng)的例子中有BLE的示例墓卦,但是那個例子有些API已經(jīng)過時,沒有使用最新的5.0的API,而且也寫得過于麻煩户敬,不便于開發(fā)新手入門落剪,因此我寫了一個簡單的demo,僅僅包含整個掃描、連接尿庐、獲取service的過程著榴,一眼便能看懂,當然這個demo的目的是增進GATT的認識屁倔。

Demo的下載地址:
** Github Jiesean : BleDemo **

運行Demo并連接小米手環(huán)1代得到的結果如下:

Services num:6
掃描到Service:00001800-0000-1000-8000-00805f9b34fb
characteristic: 00002a00-0000-1000-8000-00805f9b34fb
characteristic: 00002a01-0000-1000-8000-00805f9b34fb
characteristic: 00002a02-0000-1000-8000-00805f9b34fb
characteristic: 00002a04-0000-1000-8000-00805f9b34fb
掃描到Service:00001801-0000-1000-8000-00805f9b34fb
characteristic: 00002a05-0000-1000-8000-00805f9b34fb
掃描到Service:0000fee0-0000-1000-8000-00805f9b34fb
characteristic: 0000ff01-0000-1000-8000-00805f9b34fb
characteristic: 0000ff02-0000-1000-8000-00805f9b34fb
characteristic: 0000ff03-0000-1000-8000-00805f9b34fb
characteristic: 0000ff04-0000-1000-8000-00805f9b34fb
characteristic: 0000ff05-0000-1000-8000-00805f9b34fb
characteristic: 0000ff06-0000-1000-8000-00805f9b34fb
characteristic: 0000ff07-0000-1000-8000-00805f9b34fb
characteristic: 0000ff08-0000-1000-8000-00805f9b34fb
characteristic: 0000ff09-0000-1000-8000-00805f9b34fb
characteristic: 0000ff0a-0000-1000-8000-00805f9b34fb
characteristic: 0000ff0b-0000-1000-8000-00805f9b34fb
characteristic: 0000ff0c-0000-1000-8000-00805f9b34fb
characteristic: 0000ff0d-0000-1000-8000-00805f9b34fb
characteristic: 0000ff0e-0000-1000-8000-00805f9b34fb
characteristic: 0000ff0f-0000-1000-8000-00805f9b34fb
characteristic: 0000ff10-0000-1000-8000-00805f9b34fb
掃描到Service:0000fee1-0000-1000-8000-00805f9b34fb
characteristic: 0000fedd-0000-1000-8000-00805f9b34fb
characteristic: 0000fede-0000-1000-8000-00805f9b34fb
characteristic: 0000fedf-0000-1000-8000-00805f9b34fb
characteristic: 0000fed0-0000-1000-8000-00805f9b34fb
characteristic: 0000fed1-0000-1000-8000-00805f9b34fb
characteristic: 0000fed2-0000-1000-8000-00805f9b34fb
characteristic: 0000fed3-0000-1000-8000-00805f9b34fb
掃描到Service:0000fee7-0000-1000-8000-00805f9b34fb
characteristic: 0000fec7-0000-1000-8000-00805f9b34fb
characteristic: 0000fec8-0000-1000-8000-00805f9b34fb
characteristic: 0000fec9-0000-1000-8000-00805f9b34fb
掃描到Service:00001802-0000-1000-8000-00805f9b34fb
characteristic: 00002a06-0000-1000-8000-00805f9b34fb

我們可以看到總共得到了6個Service,分別是:

下一篇文章我們將對小米手環(huán)進行讀取和操作脑又。

<p>

** 相關閱讀: **
** BLE簡介 **
** 低功耗藍牙BLE協(xié)議棧簡介 **

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锐借,隨后出現(xiàn)的幾起案子撮抓,更是在濱河造成了極大的恐慌,老刑警劉巖衔憨,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烟具,死亡現(xiàn)場離奇詭異,居然都是意外死亡布轿,警方通過查閱死者的電腦和手機哮笆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門来颤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稠肘,你說我怎么就攤上這事福铅。” “怎么了项阴?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵滑黔,是天一觀的道長。 經(jīng)常有香客問我环揽,道長略荡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任歉胶,我火速辦了婚禮汛兜,結果婚禮上,老公的妹妹穿的比我還像新娘通今。我一直安慰自己序无,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布衡创。 她就那樣靜靜地躺著帝嗡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪璃氢。 梳的紋絲不亂的頭發(fā)上哟玷,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音一也,去河邊找鬼巢寡。 笑死,一個胖子當著我的面吹牛椰苟,可吹牛的內(nèi)容都是我干的抑月。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舆蝴,長吁一口氣:“原來是場噩夢啊……” “哼谦絮!你這毒婦竟也來了?” 一聲冷哼從身側響起洁仗,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤层皱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赠潦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叫胖,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年她奥,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓮增。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎棱。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绷跑,靈堂內(nèi)的尸體忽然破棺而出拳恋,到底是詐尸還是另有隱情,我是刑警寧澤你踩,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布诅岩,位于F島的核電站讳苦,受9級特大地震影響带膜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸳谜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一膝藕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咐扭,春花似錦芭挽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至薛闪,卻和暖如春辛馆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豁延。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工昙篙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诱咏。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓苔可,卻偏偏與公主長得像,于是被迫代替她去往敵國和親袋狞。 傳聞我的和親對象是個殘疾皇子焚辅,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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

  • 安卓4.3(API 18)為BLE的核心功能提供平臺支持和API,App可以利用它來發(fā)現(xiàn)設備苟鸯、查詢服務和讀寫特性法焰。...
    風雨byt閱讀 14,039評論 3 43
  • Key Terms And Concepts 關鍵術語和概念 Here is a summary of key B...
    Jaesoon閱讀 2,430評論 0 5
  • people mountain people sea
    Doraemon_hy閱讀 157評論 0 0
  • 作為一個妥妥的小白,初學Django倔毙,被它的關系搞得暈頭轉向的埃仪。(一)Django簡介 1 、什么是Django?...
    Yinag閱讀 532評論 0 0
  • 每天都在借別人的眼觀世界陕赃,一不小心卵蛉,時間都悄悄就走了颁股。放不下當下,脫不了眼前傻丝,世界觀那么多甘有,大道理那么多,應了這個...
    風扇吹吹吹閱讀 391評論 0 0