概述
自安卓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改變"); } };
- 利用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();
- 開啟廣播
這里需要准備三個東西,AdvertiseSettings,AdvertiseData和AdvertiseCallback。
- AdvertiseSettings
廣播的配置實例,通過AdvertiseSettings.Builder獲得。
AdvertiseSettings.Builder具有四個設置參數的方法。
分別是
- AdvertiseSettings
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