android4.3 藍牙BLE編程

1、藍牙4.0簡介html

藍牙4.0標準包含兩個藍牙標準,準確的說,是一個雙模的標準,它包含傳統藍牙部分(也有稱之爲經典藍牙Classic Bluetooth)和低功耗藍牙部分(Bluetooth Low Energy)。這兩個部分適用於不一樣的應用或者應用條件。傳統藍牙是在以前的1.0.1.2,2.0+EDR,2.1+EDR,3.0+EDR等基礎上發展和完善起來的,低功耗藍牙是Nokia的Wibree標準上發展起來的。 android

 傳統藍牙能夠用與數據量比較大的傳輸,如語音,音樂,較高數據量傳輸等,低功耗藍牙這樣應用於實時性要求比較高,可是數據速率比較低的產品,如遙控類的,如鼠標,鍵盤,遙控鼠標(Air Mouse),傳感設備的數據發送,如心跳帶,血壓計,溫度傳感器等。傳統藍牙有3個功率級別,Class1,Class2,Class3,分別支持100m,10m,1m的傳輸距離,而低功耗藍牙無功率級別,通常發送功率在7dBm,通常在空曠距離,達到20m應該。因此藍牙4.0是集成了傳統藍牙和低功耗藍牙兩個標準的,並不僅是低功耗藍牙。
數組

 藍牙4.0是藍牙3.0+HS規範的補充,專門面向對成本和功耗都有較高要求的無線方案,較3.0版本更省電、低成本和跨廠商互操做性、3毫秒低延遲、超長有效鏈接距離、AES-128加密等;藍牙4.0可普遍用於衛生保健、體育健身、家庭娛樂、安全保障等諸多領域。一般用在藍牙耳機、藍牙音箱、計步器、心律監視器、智能儀表、傳感器物聯網等設備上,大大擴展藍牙技術的應用範圍。該技術擁有極低的運行和待機功耗,使用一粒鈕釦電池甚至可連續工做數年之久。安全

2、藍牙BLE簡介架構

BLE是藍牙低能耗的簡稱(Bluetooh Low Energy)。藍牙低能耗(BLE)技術是低成本、短距離、可互操做的魯棒性無線技術,工做在免許可的2.4GHz ISM射頻頻段。它從一開始就設計爲超低功耗(ULP)無線技術。它利用許多智能手段最大限度地下降功耗。ide

藍牙低能耗架構共有兩種芯片構成:單模芯片和雙模芯片。藍牙單模芯片能夠和其它單模芯片及雙模芯片通訊,此時後者須要使用自身架構中的藍牙低能耗技術部分進行收發數據。雙模芯片也能與標準藍牙技術及使用傳統藍牙架構的其它雙模芯片通訊。雙模芯片能夠在目前使用標準藍牙芯片的任何場合使用。這樣安裝有雙模芯片的手機、PC、我的導航設備(PND)或其它應用就能夠和市場上已經在用的全部傳統標準藍牙設備以及全部將來的藍牙低能耗設備通訊。單模芯片能夠用單節鈕釦電池(如3V、220mAh的CR2032)工做很長時間(幾個月甚至幾年)。post

3、android中藍牙開發ui

(1)權限及featurethis

 

      和經典藍牙同樣,應用使用藍牙,須要聲明BLUETOOTH權限,若是須要掃描設備或者操做藍牙設置,則還須要BLUETOOTH_ADMIN權限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

 

 

     除了藍牙權限外,若是須要BLE feature則還須要聲明uses-feature:

 

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

 

 

     按時required爲true時,則應用只能在支持BLE的Android設備上安裝運行;required爲false時,Android設備都可正常安裝運行,須要在代碼運行時判斷設備是否支持BLE feature:

 

(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
    finish();
}

(2)啓動藍牙加密

      在使用藍牙BLE以前,須要確認Android設備是否支持BLE feature(required爲false時),另外要須要確認藍牙是否打開。 若是發現不支持BLE,則不能使用BLE相關的功能。若是支持BLE,可是藍牙沒打開,則須要打開藍牙。打開藍牙的步驟:
     一、獲取BluetoothAdapter
        BluetoothAdapter是Android系統中全部藍牙操做都須要的,它對應本地Android設備的藍牙模塊,在整個系統中BluetoothAdapter是單例的。當你獲取到它的示例以後,就能進行相關的藍牙操做了。獲取BluetoothAdapter代碼示例以下:
// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
注: 這裏經過getSystemService獲取BluetoothManager,再經過BluetoothManager獲取BluetoothAdapter。BluetoothManager在Android4.3以上支持(API level 18)。
     二、判斷是否支持藍牙,並打開藍牙
      獲取到BluetoothAdapter以後,還須要判斷是否支持藍牙,以及藍牙是否打開。若是沒打開,須要讓用戶打開藍牙:
private BluetoothAdapter mBluetoothAdapter;
...
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

 (3)搜索BLE設備

      經過調用BluetoothAdapter的 startLeScan()搜索BLE設備。調用此方法時須要傳入  BluetoothAdapter.LeScanCallback參數。所以你須要實現  BluetoothAdapter. LeScanCallback 接口,BLE設備的搜索結果將經過這個callback返回。搜索的示例代碼以下:
/**
 * Activity for scanning and displaying available BLE devices.
 */
public class DeviceScanActivity extends ListActivity {

    private BluetoothAdapter mBluetoothAdapter;
    private boolean mScanning;
    private Handler mHandler;

    // Stops scanning after 10 seconds.
    private static final long SCAN_PERIOD = 10000;
    ...
    private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }, SCAN_PERIOD);

            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
        ...
    }
    // Device scan callback.
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() {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
};
}
注:(1)因爲搜索須要儘可能減小功耗,所以在實際使用時須要注意:
             一、當找到對應的設備後,當即中止掃描;
              二、不要循環搜索設備,爲每次搜索設置適合的時間限制。避免設備不在可用範圍的時候持續不停掃描,消耗電量。
     (2)若是你只須要搜索指定UUID的外設,你能夠調用  startLeScan(UUID[], BluetoothAdapter.LeScanCallback)方法。其中UUID數組指定你的應用程序所支持的GATT Services的UUID;
     (3)
相關文章
相關標籤/搜索