標籤:手機app code 藍芽4.0 方法 使用 boolean 開始 admin mha
段時間,公司項目用到了手機APP和藍牙裝置的通訊開發,這裡也正好對低功耗藍芽(藍芽4.0及以後標準)的開發,做一個總結。
藍芽技術聯盟在2010年6月30號公布了藍芽4.0標準,4.0標準在藍芽3.0+HS標準的基礎上增加了對低功耗藍芽(BLE)的支援。相比原有的普通藍芽和高速藍芽,BLE最大的特點就是低功耗,低延時,快速的搜尋和連線速度,但資料轉送速度相比傳統藍芽低。接下去將從BLE的概念以及代碼兩個方面介紹Android下的BLE。
先來說說基本概念:
1.BLE相關概念
1.1 GATT、Service、Characteristic、Descriptor
BLE開發,經常會與四個概念發生關係:GATT、Service、Characteristic、Descriptor
總的來說,一個藍芽4.0的終端可以包含多個Service,一個Service可以包含多個Characteristic,一個Characteristic包含一個Value和多個Descriptor,一個Descriptor包含一個Value
1.2 中央(Central)與周邊(Periphery)
在BLE協議中,有兩個角色,周邊(Periphery)和中央(Central):
周邊是資料提供者,中央是資料使用/處理者;在iOS SDK裡面,可以把一個iOS裝置作為一個周邊,也可以作為一個中央;但是在Android SDK裡面,Android手機只能作為中央來使用和處理資料;那資料從哪兒來?從BLE裝置來,現在的很多穿戴式裝置都是用BLE來提供資料的。
一個中央可以同時串連多個周邊,但是一個周邊某一時刻只能串連一個中央。
那麼問題來了,如何定義周邊和中央?
關於周邊和中央,涉及到四個類:
- BluetoothGattServer:作為周邊來提供資料
- BluetoothGattServerCallback:返回周邊的狀態
- BluetoothGatt:作為中央來使用和處理資料
- BluetoothGattCallback:返回中央的狀態和周邊提供的資料。、
關係下:
2. 開發Ble
瞭解了那些基礎概念後,我們就正式開始開發ble。
Ble的Android開發,主要是以下的幾個步驟:
1、添加許可權
2、掃描Ble裝置
3、串連Ble裝置
4、資料通訊
那麼現在,開始一步步來完成。
2.1 添加許可權:
在AndroidManifest.xml中添加Ble需要的許可權,其實就兩個:
<!-- 應用使用藍芽的許可權 --><uses-permission android:name="android.permission.BLUETOOTH" /><!-- 掃描藍牙裝置或者操作藍芽設定 --><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
2.2 檢查是否裝置是否支援藍芽,並開啟藍芽
檢查裝置是否支援藍芽
/** * 檢查該裝置是否支援藍芽 */ public void isBle(Context context) { //手機硬體支援藍芽 if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { ViewUtils.getInstance().showToast("該裝置不支援BLE,即將離開改頁面"); } }
開啟手機藍芽開關
private BluetoothAdapter mBluetoothAdapter;//藍芽適配器 //開啟藍芽許可權 if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, What.Bluetooth.bluetoothEnable); }
2.3 掃描裝置
開始掃描和停止掃描,只需要調用對應的startLeScan()和stopLeScan()即可,但是需要將LeScanCallBack作為參數:
// 逾時時間 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); } ... }
LeScanCallBack的實現:
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { runOnUiThread(new Runnable() { @Override public void run() { // TODO: 2017/9/18 } }); }};
上面的代碼中:
- SCAN_PERIOD:掃描時間長度,毫秒數,需要注意的是,藍牙裝置掃描很耗電,這個時間不易設定太長,在掃描成功後就要停止裝置掃描。
- BluetoothDevice:藍牙裝置的相關類,通過他,可以擷取藍牙裝置的很多資訊
如果只想掃描指定類型的外圍裝置,你可以調用startLeScan(UUID[], BluetoothAdapter.LeScanCallback),提供一個指定了你app支援的GATT服務的UUID數組對象。
2.3 串連GATT服務端
與BLE裝置通訊的前提就是串連GATT服務端,GATT概念之前已經講過了,調用connectGatt()就可以了,不過需要三個參數:這個方法需要三個參數,一個Context對象,autoConnect(一個指示是否自動連接到BLE裝置--當它一旦可用的時候--的布爾值),和一個 BluetoothGattCallback的引用:
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
這個方法會返回一個BluetoothGatt,用它可以對GATT進行操作。
具體怎麼操作呢?下篇部落格再說。
這是我的個人公眾號:感興趣的可以關注一下,裡面分享一些搞機視頻,程式員嘛!學會騷,很重要:
Android低功耗藍芽(藍芽4.0)——BLE開發(上)