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廊移。
接下來打開 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)