背景:
我有一个带有两种模式的BLE外设:“应用程序”和“引导程序”。在两种模式下,该设备都使用相同的MAC地址进行广告。
要从一种模式切换到另一种模式,BLE外设必须重新启动。这样做时,它必须断开任何活动的BLE连接。
BLE外设仅会在Bootloader模式下停留约5秒钟。如果在该窗口内没有人连接它,则会切换到Application模式。
问题:
Android重新连接到BLE设备需要很长时间,足以让我错过5秒钟的窗口。原始代码有几个层级到BluetoothGATT和BluetoothAdapter层,但调用序列归结为:
BluetoothGattCharacteristic c = mCharacteristics.get(POWER_STATE_UUID);
c.setValue(SHUTDOWN_VALUE);
mBluetoothGatt.writeCharacteristic(c);
// Signalled by BluetoothGattCallback.onCharacteristicWrite
bleWriteCondition.await();
mBluetoothGatt.disconnect();
// Wait for the underlying layer to confirm we're disconnected
while( mConnectionState != BluetoothProfile.STATE_DISCONNECTED ) {
// Signalled by BluetoothGattCallback.onConnectionStateChange
bleStateCondition.await();
}
mBluetoothGatt.connect();
while (mConnectionState != BluetoothProfile.STATE_CONNECTED) {
// Signalled by BluetoothGattCallback.onConnectionStateChange
bleStateCondition.await();
if (bleStateCondition.stat != 0) {
break;
}
}
我是不是完全走错了路?我尝试在BluetoothGatt实例上调用close(),然后使用BluetoothDevice.connectGatt生成一个新实例,但我得到相同的极慢行为。
我在三星Galaxy S4上进行测试,API级别为21。