Android-BLE

BLE 工作原理酗宋?

BLE 根據(jù)需要提供短數(shù)據(jù)包患亿,然后關(guān)閉鏈路。 這是藍(lán)牙 LE 實現(xiàn)低能耗的原因之一距境。 相比于常規(guī)藍(lán)牙的傳統(tǒng)配對方法辉哥,BLE 設(shè)備僅在需要收發(fā)信息時進(jìn)行鏈接缭黔。
BLE 的通信方式極其嚴(yán)密。 設(shè)備顯示收發(fā)數(shù)據(jù)的服務(wù)柬讨,后者包含稱之為特征的內(nèi)容扒接,以定義可共享的數(shù)據(jù)伪货。 如需獲取更多詳情,特征可包含描述符钾怔,幫助定義數(shù)據(jù)碱呼。 例如,您可以擁有一項標(biāo)記為 "Heart Rate Monitor" 的服務(wù)宗侦,該服務(wù)包含 "heart rate measurement" 等特征愚臀。
大多數(shù)藍(lán)牙 LE API 都支持搜索本地設(shè)備和發(fā)現(xiàn)有關(guān)這些設(shè)備的服務(wù)、特征和描述符矾利。

BLE 關(guān)鍵術(shù)語和概念

下面簡單介紹啟動 BLE 項目之前應(yīng)該了解的關(guān)鍵 BLE 術(shù)語和概念姑裂。

通用屬性配置文件 (GATT)

GATT 配置文件是關(guān)于通過藍(lán)牙低能耗鏈路收發(fā)短數(shù)據(jù)片(稱為 "屬性")的通用規(guī)范。 當(dāng)前所有的 LE 應(yīng)用配置文件均以 GATT 為基礎(chǔ)男旗。 藍(lán)牙特別興趣小組 (SIG) (https://www.bluetooth.org) 對 BLE 設(shè)備的配置文件數(shù)量進(jìn)行了預(yù)定義舶斧。 這些配置文件是關(guān)于描述設(shè)備使用方法的規(guī)范。

屬性協(xié)議 (ATT)

屬性協(xié)議 (ATT) 指 GATT 的構(gòu)建基礎(chǔ)察皇。 ATT 是專門針對 BLE 設(shè)備而設(shè)計的優(yōu)化型協(xié)議茴厉。 ATT 通信發(fā)送字節(jié)盡可能少的數(shù)據(jù)泽台。 所有屬性均帶有通用唯一標(biāo)識符 (UUID),后者為標(biāo)準(zhǔn)的 128 位字符串 ID矾缓,以唯一的方式識別信息怀酷。 ATT 傳輸?shù)膶傩员桓袷交癁樘卣骱头?wù)(定義如下)。

特征(Characteristic)

特征包含一個單獨數(shù)值以及 0 或多個描述符(見下文)以描述特征的值嗜闻。

描述符 (Descriptor)

描述符指定義了的屬性蜕依,可描述特征值。 它們可能是人類可讀的描述琉雳,可注明單位或測量笔横,或定義可接受的數(shù)值范圍。

服務(wù)(Service)

服務(wù)指特征的集合咐吼。 下列鏈接提供了基于現(xiàn)有 GATT 的配置文件列表:
比如吹缔。有個藍(lán)牙ble的血壓計。他可能包括多個Servvice锯茄,每個Service有包括多個Characteristic
注意:藍(lán)牙ble只能支持Android 4.3以上的系統(tǒng) SDK>=18
https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx

Android 中的 BLE

您可以訪問下列鏈接厢塘,從 GitHub 下載完整的項目:
https://github.com/adrianstevens/Edison_to_Android_BLE/tree/master/Android/BLEConnect
但我建議您構(gòu)建自己的項目,并參考上述鏈接逐行寫入代碼肌幽。
創(chuàng)建新項目
打開 Android Studio(或選擇的 IDE)晚碾,創(chuàng)建新的空白 Android 應(yīng)用,并將其命名為 BLEConnect喂急。 請務(wù)必將最低 SDK 設(shè)置為至少 API 18格嘁。 否則,您將無法使用 BLE API廊移。

圖1

接下來打開 AndroidManifest.xml糕簿,并在 <application>標(biāo)簽上方添加下列內(nèi)容,以添加所需的權(quán)限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>

判斷是否支持狡孔,打開和關(guān)閉藍(lán)牙

為引用 Bluetooth Manager懂诗,我們首先應(yīng)查看設(shè)備是否提供 BLE,調(diào)用 **getSystemService
** 以引用 Bluetooth Manager (BluetoothManager
)
苗膝,然后調(diào)用 **getAdapter()
** 方法殃恒,以引用 **BluetoothAdapter
** 項目。 或者辱揭,您還可以直接從 Bluetooth Manager 類使用靜態(tài)幫助方法 getDefaultAdapter离唐。

//check to see if Bluetooth Low Energy is supported on this device
    if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
        Toast.makeText(this, "BLE not supported on this device", Toast.LENGTH_SHORT).show();
        finish();
    }

    statusUpdate("BLE supported on this device");

    //get a reference to the Bluetooth Manager
    final BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = mBluetoothManager.getAdapter();
    if (mBluetoothAdapter == null) {
        Toast.makeText(this, "BLE not supported on this device", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }

    //Open settings if Bluetooth isn't enabled
    if (!mBluetoothAdapter.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }

    if (mBluetoothAdapter == null) {
        Toast.makeText(this, "Bluetooth disabled", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }

    //try to find the Grove BLE V1 module
    searchForDevices();
}

搜索附近的 BLE 設(shè)備

搜索設(shè)備時,我們使用計時器搜索特定時間段问窃。 我們調(diào)用 Bluetooth manager 項目中的 **startLeScan
**亥鬓,并傳入至回調(diào)項目,以知曉是否搜索到設(shè)備泡躯。
API 持續(xù)掃描設(shè)備贮竟,因此,我們可能會在每臺設(shè)備的 **LeScanCallback
** 中接收到多個通知较剃,所以在保存之前咕别,我們應(yīng)確認(rèn)該設(shè)備入口的唯一性。 我們還要檢查模塊的設(shè)備名稱写穴,并保存引用惰拱。 就本示例而言,我們實際上不需要將設(shè)備保存在列表中啊送。

mHandler.postDelayed(newRunnable() {
                @Override
                public void run() {
                    mScanning = false;
                   mBluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }, SCAN_PERIOD); 
            mScanning = true;
           mBluetoothAdapter.startLeScan(mLeScanCallback);

privateBluetoothAdapter.LeScanCallback mLeScanCallback =
        newBluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(finalBluetoothDevice device, int rssi, byte[] scanRecord) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mLeDeviceListAdapter.addDevice(device);
                   mLeDeviceListAdapter.notifyDataSetChanged();
                }
            });
        }
};

查找通信服務(wù)

大多數(shù) BLE 設(shè)備都會顯示一個或多個服務(wù)以供通信/互動偿短。 Grove BLE 中的 TI CC2540 包含一個 ID 為 “0000ffe0-0000-1000-8000-00805f9b34fb” 的關(guān)鍵服務(wù)。 接下來馋没,我們將查找引用昔逗,并將其保存至該服務(wù)。
首先篷朵,我們需要連接設(shè)備勾怒。 為了知曉連接時間或查找到服務(wù)的時間,我們需要 **BluetoothGattCallback
** 項目声旺,并覆蓋 **onConnectionStateChanged
** 和 **onServicesDiscovered
**笔链。
請注意,使用 onConnectionStateChanged
** 方法時腮猖,如果獲悉連接成功鉴扫,我們可調(diào)用
mBluetoothGatt.discoverServices()
** 搜索服務(wù)。 識別到所需的服務(wù)后澈缺,我們可以繼續(xù)發(fā)送消息坪创。

public void onConnectionStateChange (BluetoothGatt gatt, int status, int newState){ …}
@Override
public void onServicesDiscovered (BluetoothGatt gatt, int status) { …}```

許多其他方法可以被覆蓋。 請訪問此處參閱其中的文檔:
[https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html](https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姐赡,一起剝皮案震驚了整個濱河市误堡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雏吭,老刑警劉巖锁施,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杖们,居然都是意外死亡悉抵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門摘完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姥饰,“玉大人,你說我怎么就攤上這事孝治×蟹啵” “怎么了审磁?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岂座。 經(jīng)常有香客問我态蒂,道長,這世上最難降的妖魔是什么费什? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任钾恢,我火速辦了婚禮,結(jié)果婚禮上鸳址,老公的妹妹穿的比我還像新娘瘩蚪。我一直安慰自己,他們只是感情好稿黍,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布疹瘦。 她就那樣靜靜地躺著,像睡著了一般巡球。 火紅的嫁衣襯著肌膚如雪拱礁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天辕漂,我揣著相機(jī)與錄音呢灶,去河邊找鬼。 笑死钉嘹,一個胖子當(dāng)著我的面吹牛鸯乃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跋涣,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼缨睡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陈辱?” 一聲冷哼從身側(cè)響起奖年,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沛贪,沒想到半個月后陋守,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡利赋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年水评,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媚送。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡中燥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出塘偎,到底是詐尸還是另有隱情疗涉,我是刑警寧澤拿霉,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站咱扣,受9級特大地震影響绽淘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偏窝,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望武学。 院中可真熱鬧祭往,春花似錦、人聲如沸火窒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熏矿。三九已至已骇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間票编,已是汗流浹背褪储。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留慧域,地道東北人鲤竹。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像昔榴,于是被迫代替她去往敵國和親辛藻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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

  • Key Terms And Concepts 關(guān)鍵術(shù)語和概念 Here is a summary of key B...
    Jaesoon閱讀 2,427評論 0 5
  • 一互订、方法 使用開源庫fastble 使用開源庫baseble 使用原生接口 二吱肌、聲明權(quán)限 如果您要聲明您的應(yīng)用僅適...
    小黎1993閱讀 322評論 0 0
  • 安卓4.3(API 18)為BLE的核心功能提供平臺支持和API,App可以利用它來發(fā)現(xiàn)設(shè)備仰禽、查詢服務(wù)和讀寫特性氮墨。...
    風(fēng)雨byt閱讀 14,014評論 3 43
  • 前言: 本文主要描述Android BLE的一些基礎(chǔ)知識及相關(guān)操作流程,不牽扯具體的業(yè)務(wù)實現(xiàn)吐葵,其中提供了針對廣播包...
    幻影宇寰閱讀 5,320評論 6 19
  • BLE 即 Bluetooth Low Energy勇边,藍(lán)牙低功耗技術(shù),是藍(lán)牙4.0引入的新技術(shù)≌哿現(xiàn)在越來越多的智能...
    fengmlo閱讀 8,077評論 3 10