前段時間,公司項目用到了手機APP和藍牙設(shè)備的通訊開發(fā),這里也正好對低功耗藍牙(藍牙4.0及以后標準)的開發(fā),做一個總結(jié)。
藍牙技術(shù)聯(lián)盟在2010年6月30號公布了藍牙4.0標準,4.0標準在藍牙3.0+HS標準的基礎(chǔ)上增加了對低功耗藍牙(BLE)的支持。相比原有的普通藍牙和高速藍牙,BLE最大的特點就是低功耗,低延時,快速的搜索和連接速度,但數(shù)據(jù)傳輸速度相比傳統(tǒng)藍牙低。接下去將從BLE的概念以及代碼兩個方面介紹Android下的BLE。
先來說說基本概念:
1.BLE相關(guān)概念
1.1 GATT、Service、Characteristic、Descriptor
BLE開發(fā),經(jīng)常會與四個概念發(fā)生關(guān)系:GATT、Service、Characteristic、Descriptor
GATT:是藍牙4.0特有的Profile通用規(guī)范,BLE應(yīng)用的Profile均基于GATT。Gatt定義了一個服務(wù)框架規(guī)范,該框架包括對藍牙服務(wù)(Service)和服務(wù)特性(Characteristic)的定義和規(guī)范,和其中讀寫、通知的特性等。可以將GATT理解成BLE框架,我們在GATT上面實現(xiàn)BLE功能。
Service:是完成一個特定功能的數(shù)據(jù)和行為集合。在Gatt中,一個Service可能包含Service引用以及強制或者可選的Characteristic。
Characteristic:也叫特征值,一個Characteristic的定義包含了Characteristic本身,數(shù)值以及描述(Descriptor)的聲明。Characteristic是完成BLE具體功能的基本單位。
Descriptor:Descriptor定義了Characteristic中數(shù)據(jù)的具體含義。
總的來說,一個藍牙4.0的終端可以包含多個Service,一個Service可以包含多個Characteristic,一個Characteristic包含一個Value和多個Descriptor,一個Descriptor包含一個Value
1.2 中央(Central)與周邊(Periphery)
在BLE協(xié)議中,有兩個角色,周邊(Periphery)和中央(Central):
周邊是數(shù)據(jù)提供者,中央是數(shù)據(jù)使用/處理者;在iOS SDK里面,可以把一個iOS設(shè)備作為一個周邊,也可以作為一個中央;但是在Android SDK里面,Android手機只能作為中央來使用和處理數(shù)據(jù);那數(shù)據(jù)從哪兒來?從BLE設(shè)備來,現(xiàn)在的很多可穿戴設(shè)備都是用BLE來提供數(shù)據(jù)的。
一個中央可以同時連接多個周邊,但是一個周邊某一時刻只能連接一個中央。
那么問題來了,如何定義周邊和中央?
關(guān)于周邊和中央,涉及到四個類:
BluetoothGattServer:作為周邊來提供數(shù)據(jù)
BluetoothGattServerCallback:返回周邊的狀態(tài)
BluetoothGatt:作為中央來使用和處理數(shù)據(jù)
BluetoothGattCallback:返回中央的狀態(tài)和周邊提供的數(shù)據(jù)。、
關(guān)系如圖下:
2. 開發(fā)Ble
了解了那些基礎(chǔ)概念后,我們就正式開始開發(fā)ble。
Ble的Android開發(fā),主要是以下的幾個步驟:
1、添加權(quán)限
2、掃描Ble設(shè)備
3、連接Ble設(shè)備
4、數(shù)據(jù)通訊
那么現(xiàn)在,開始一步步來完成。
2.1 添加權(quán)限:
在AndroidManifest.xml中添加Ble需要的權(quán)限,其實就兩個:
<!-- 應(yīng)用使用藍牙的權(quán)限 --><uses-permission android:name="android.permission.BLUETOOTH" /><!-- 掃描藍牙設(shè)備或者操作藍牙設(shè)置 --><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
2.2 檢查是否設(shè)備是否支持藍牙,并打開藍牙
檢查設(shè)備是否支持藍牙
/** * 檢查該設(shè)備是否支持藍牙 */ public void isBle(Context context) { //手機硬件支持藍牙 if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { ViewUtils.getInstance().showToast("該設(shè)備不支持BLE,即將離開改頁面"); } }
打開手機藍牙開關(guān)
private BluetoothAdapter mBluetoothAdapter;//藍牙適配器 //打開藍牙權(quán)限 if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, What.Bluetooth.bluetoothEnable); }
2.3 掃描設(shè)備
開始掃描和停止掃描,只需要調(diào)用對應(yīng)的startLeScan()和stopLeScan()即可,但是需要將LeScanCallBack作為參數(shù):
// 超時時間 private static final long SCAN_PERIOD = 10000; ... private void scanLeDevice(final boolean enable) { if (enable) { // 達到超時時間,停止掃描 mHandler.postDelayed(new Runnable() { @Override public void run() { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } }, SCAN_PERIOD); //開始掃描 mBluetoothAdapter.startLeScan(mLeScanCallback); } else { //停止掃描 mBluetoothAdapter.stopLeScan(mLeScanCallback); } ... }
聯(lián)系人:黃金
手 機:153 0755 0221
郵 箱:jane@dzc.hk
公 司:深圳市山星盛電子科技有限公司-稱重產(chǎn)品官方展示網(wǎng)站
地 址:廣東省深圳市寶安鳳塘大道25號(山星盛電子秤)