安卓低功耗藍牙——手機作爲外圍設備

概述

自安卓5.0後,谷歌加入了對安卓手機作爲低功耗藍牙外圍設備,即服務端的支持。使得手機可以通過低功耗藍牙進行相互通信。

開發步驟

實現這一功能其實只需要分爲設置廣播和設置服務器兩個部分完成即可

設置服務器

這一步驟主要操作的是BluetoothGattServer。
這裏寫圖片描述
1. 定義一個BluetoothGattServerCallback的回調如下

private BluetoothGattServerCallback bluetoothGattServerCallback = new BluetoothGattServerCallback() {
        @Override
        public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
            Log.v("onConnectionStateChange","連接狀態改變");
        }

        @Override
        public void onServiceAdded(int status, BluetoothGattService service) {
            Log.v("onServiceAdded","成功添加服務");
        }

        @Override
        public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattCharacteristic characteristic) {
            Log.v("CharacteristicReadReq","遠程設備請求讀取數據");
            bluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, new byte[]{1,2,3,4,5,6,7,8,9,0});
        }

        @Override
        public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId, BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
            Log.v("CharacteristicWriteReq","遠程設備請求寫入數據");
            bluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, new byte[]{0,9,8,7,6,5,4,3,2,1});

        @Override
        public void onDescriptorReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattDescriptor descriptor) {
            Log.v("DescriptorReadReq","遠程設備請求寫入描述器");
            bluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, new byte[]{10,11,12,13,14,15,16,17,18,19});
        }

        @Override
        public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
            Log.v("DescriptorReadReq","遠程設備請求寫入描述器");
            bluetoothGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, new byte[]{19,18,17,16,15,14,13,12,11,10});
        }

        @Override
        public void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) {
            Log.v("onExecuteWrite","執行掛起寫入操作");
        }

        @Override
        public void onNotificationSent(BluetoothDevice device, int status) {
            Log.v("onNotificationSent","通知發送");
        }

        @Override
        public void onMtuChanged(BluetoothDevice device, int mtu) {
            Log.v("onMtuChanged","mtu改變");
        }
    };
  1. 利用BluetoothManager的openGattServer(Context,BluetoothServerCallback)方法獲得BluetoothGattServer實例。
BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothGattServer = mBluetoothManager.openGattServer(this, bluetoothGattServerCallback);

3.爲設備添加相應的service,characteristic和descriptor(非必須,但通常都會用到)。這裏僅舉一個例子。

BluetoothGattCharacteristic characteristic= new BluetoothGattCharacteristic(CHARACTERISTIC_UUID,por,per);
        BluetoothGattService service= new BluetoothGattService(SERVICE_UUID,pri);
        service.addCharacteristic(characteristic);
        bluetoothGattServer.addService(service);

其中,por,per,pri分別爲:

private int por = BluetoothGattCharacteristic.PROPERTY_NOTIFY | BluetoothGattCharacteristic.PROPERTY_INDICATE | BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_WRITE;
    private int per = BluetoothGattCharacteristic.PERMISSION_READ | BluetoothGattCharacteristic.PERMISSION_WRITE;
    private int pri = BluetoothGattService.SERVICE_TYPE_PRIMARY;

可根據自己的需要進行調整。
這樣就完成了對BluetoothGattServer的簡單設置。

設置廣播

這裏主要操作BluetoothLeAdvertiser。
這裏寫圖片描述
1. 利用BluetoothManager獲取BluetoothAdapter,然後再通過BluetoothAdapter的getBluetoothLeAdvertiser()方法獲取BluetoothLeAdvertiser的實例。

BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = mBluetoothManager.getAdapter();
        mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
  1. 開啓廣播
    這裏寫圖片描述
    這裏需要準備三個東西,AdvertiseSettings,AdvertiseData和AdvertiseCallback。
    • AdvertiseSettings
      廣播的配置實例,通過AdvertiseSettings.Builder獲得。
      這裏寫圖片描述
      AdvertiseSettings.Builder具有四個設置參數的方法。
      分別是
setAdvertiseMode(int advertiseMode)設置廣播的模式,低功耗,平衡和低延遲三種模式;
setConnectable(boolean connectable)設置是否可以連接。
setTimeout(int timeoutMillis)設置廣播的最長時間
setTxPowerLevel(int txPowerLevel)設置廣播的信號強度

可根據需要自行設定,若不設定則按照默認的參數設定。
這裏只提供一個小例子。

AdvertiseSettings settings = new AdvertiseSettings.Builder()
                .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
                .setTimeout(0)
                .setConnectable(true)
                .build();
  • AdvertiseData
    廣播內容的實例,通過AdvertiseData.Builder獲得
    這裏寫圖片描述
    內含幾個成員函數。
addManufacturerData(int manufacturerId, byte[] manufacturerSpecificData)添加廠商信息,貌似不怎麼用到。
addServiceUuid(ParcelUuid serviceUuid),addServiceData(ParcelUuid serviceDataUuid, byte[] serviceData)添加服務進廣播,即對外廣播本設備擁有的服務。
setIncludeDeviceName(boolean includeDeviceName)是否廣播設備名稱。
setIncludeTxPowerLevel(boolean includeTxPowerLevel)是否廣播信號強度

這裏提供一個簡單的例子。

AdvertiseData advertiseData = new AdvertiseData.Builder()
                .setIncludeDeviceName(true)
                .setIncludeTxPowerLevel(true)
                .addServiceUuid(new ParcelUuid(SERVICE_UUID))
                .build();
  • AdvertiseCallback
    廣播成功或者失敗的回調,比較簡單。
private AdvertiseCallback mAdvertiseCallback = new AdvertiseCallback() {
        @Override
        public void onStartSuccess(AdvertiseSettings settingsInEffect) {
            Log.v("start","廣播成功");
        }

        @Override
        public void onStartFailure(int errorCode) {
            Log.v("廣播失敗",String.valueOf(errorCode));
        }
    };

最後通過BluetoothLeAdvertise的startAdvertising(AdvertiseSettings settings, AdvertiseData advertiseData, AdvertiseCallback callback)開啓廣播即可
3. 關閉廣播
通過BluetoothLeAdvertise的stopAdvertising(AdvertiseCallback callback)關閉。

參考鏈接:https://developer.android.google.cn/reference/android/bluetooth/le/BluetoothLeAdvertiser.html
代碼資源:http://download.csdn.net/detail/will4906/9777135

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章