1. 程式人生 > >android藍芽研發之從裝置

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秒執行與該裝置斷開連線。