android藍芽研發之從裝置
android 藍芽研發之從裝置
1,定義許可權
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.LOCAL_MAC_ADDRESS" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
2,檢查和請求許可權
在啟動頁檢查和請求許可權,開啟藍芽。啟動後臺服務Service傳送廣播。
3,藍芽廣播定義
3.1廣播配置
廣播資料為62位,廠商資訊長度不能超過20,可以向服務中攜帶資料即addServiceData(),長度不能超過20,廣播總長度不得超過62。
AdvertiseSettings settings = new AdvertiseSettings.Builder ()
.setConnectable(true) .setTimeout(0) .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
.setTxPowerLevel(ADVERTISE_TX_POWER_HIGH) .build();
setConnectable設定該藍芽是否可連線;setTimeout(0)設定該藍芽連線超時無限制,最大可設定180000 ms;setAdvertiseMode(int) 設定廣播頻率,可設高中低三種模式,即1000ms、250ms、100ms; setTxPowerLevel 設定功耗,高功耗在一米內訊號值56。
3.2 設定廣播資料
AdvertiseData advertiseData = new AdvertiseData.Builder()
.setIncludeDeviceName(false) //廣播不包含藍芽名稱
.setIncludeTxPowerLevel(false)//廣播不包含電源資訊
.addServiceUuid(new ParcelUuid(UUID_SERVER))//廣播中新增ServiceUUID
.addManufacturerData(0,new byte[]{1,2,3,4}) //設定廠商資訊
.build();
3.3 廣播響應資料定義
AdvertiseData scanResponseData = new AdvertiseData.Builder()
.setIncludeDeviceName(true) //如果不廣播名字搜尋不到
.addManufacturerData(0,new byte[]{1,2,3,4})//廠商資訊
.setIncludeTxPowerLevel(false).build();//不廣播電源
3.4 設定廣播回撥AdvertiseCallback
實現AdvertiseCallback的onStartSuccess和onStartFailure方法。發出廣播後回撥該方法是否廣播成功。
3.5開始廣播
BluetoothLeAdvertiser bla= mBluetoothAdapter.getBluetoothLeAdvertiser();
bla.startAdvertising(settings, advertiseData, scanResponseData, callback);
4 新增定製的服務ServiceUUID
在3.4廣播成功後,需要新增定製的ServiceUUID,利於移動端掃描和資料通訊。
private void initServices(Context context) {
bluetoothGattServer=mBluetoothManager.openGattServer(context, bgsCallback); BluetoothGattService service = new BluetoothGattService(UUID_SERVER, BluetoothGattService.SERVICE_TYPE_PRIMARY);
//add a read characteristic.
BluetoothGattCharacteristic charR = new BluetoothGattCharacteristic(UUID_CHARREAD,
BluetoothGattCharacteristic.PROPERTY_READ, BluetoothGattCharacteristic.PERMISSION_READ);
BluetoothGattCharacteristic charRW= new BluetoothGattCharacteristic(UUID_CHARWRITE,
BluetoothGattCharacteristic.PROPERTY_READ
| BluetoothGattCharacteristic.PROPERTY_WRITE
| BluetoothGattCharacteristic.PROPERTY_NOTIFY
, BluetoothGattCharacteristic.PERMISSION_WRITE | BluetoothGattCharacteristic.PERMISSION_READ);
service.addCharacteristic(charR);
service.addCharacteristic(charRW);
bluetoothGattServer.addService(service);
}
private static UUID UUID_SERVER = UUID.fromString("000018f4-0000-1000-8000-00805f9b34fb"); //服務
private static UUID UUID_CHARREAD = UUID.fromString("00002a15-0000-1000-8000-00805f9b34fb"); //特徵 讀
private static UUID UUID_CHARWRITE = UUID.fromString("00002a16-0000-1000-8000-00805f9b34fb"); //特徵 讀\寫\通知
定製服務,向服務中新增兩個特徵2a15和2a16,定義2a15的許可權為讀,定義2a15的許可權為讀、寫、通知。
5 定製廣播的監聽
即4中新增Service時的BluetoothGattServerCallback,bgsCallback,按需求實現方法。
onConnectionStateChange()連線狀態改變時回撥
onServiceAdded() 定製的服務新增結果回撥
onCharacteristicReadRequest() 主裝置請求讀時回撥
onCharacteristicWriteRequest() 主裝置請求寫時回撥
onNotificationSent() 從裝置通知傳送時回撥
onMtuChanged() 廠商資訊變更時回撥
在demo中,主裝置請求寫入開門指令時,onCharacteristicWriteRequest將執行,根據請求的id、裝置、寫入的資料進行開門業務處理,將開門結果響應給主裝置。因通訊過程耗時,所以demo中響應主裝置後延遲3秒執行與該裝置斷開連線。