Я новичок в разработке BLE для Android и в разработке BLE в целом, и я заметил, что большую часть времени Android может занять 3-7 секунд, прежде чем вызов onConnectionStateChange сработает после моего вызова connectGatt. Это нормально? Мне любопытно, потому что я раньше работал с Bluetooth 2.0, и там все было намного быстрее. Кроме того, я сделал несколько тестовых кодов на iPhone, и установление первоначального соединения там также было намного быстрее. Ниже я опубликую пример кода вместе с несколькими сообщениями монитора Android, указывающими, где происходит замедление.
class BluetoothConnection{
void connectToDevice(BluetoothDevice device) {
if (mBluetoothGatt == null) {
Log.d(TAG, "-----Trying to connect to GATT server.");
mBluetoothGatt = device.connectGatt(mContext, false, mGattCallback);
}
}
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.d(TAG, "-----Connected to GATT server.");
Log.d(TAG, "-----Attempting to start service discovery:" +
mBluetoothGatt.discoverServices());
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.d(TAG, "-----Disconnected from GATT server.");
}
}
@Override
// New services discovered
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
Log.w(TAG, "-----Successfully discovered the services");
BluetoothGattService gattService = mBluetoothGatt.getService(UUID.fromString("0000ffe0-0000-1000-8000-00805f9b34fb"));
Log.d(TAG, "-- Service = " + gattService.getUuid());
characteristicsTxRx = gattService.getCharacteristic(UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb"));
Log.d(TAG, "-- Characteristic = " + characteristicsTxRx.getUuid());
mBluetoothGatt.setCharacteristicNotification(characteristicsTxRx, true);
Intent intent = new Intent(CONNECTION_ESTABLISHED);
mContext.sendBroadcast(intent);
}
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);
final byte[] data = characteristic.getValue();
if (data != null && data.length > 0) {
Intent intent = new Intent(DATA_AVAILABLE);
String incomingMessage = new String(data);
intent.putExtra(DATA, incomingMessage);
mContext.sendBroadcast(intent);
}
}
};
}
А вот пара строчек из моего лога, как видите здесь потребовалось почти 5 секунд, чтобы получить подтверждение того, что мы подключены к ГАТТ.
09-07 10:07:05.211 29907-29907/com.bubblewall.saik.bubblewall D/bubbleWallMessage: -----Trying to connect to GATT server.
09-07 10:07:09.898 29907-29920/com.bubblewall.saik.bubblewall D/bubbleWallMessage: -----Connected to GATT server.
09-07 10:07:09.901 29907-29920/com.bubblewall.saik.bubblewall D/bubbleWallMessage: -----Attempting to start service discovery:true
09-07 10:07:10.347 29907-29920/com.bubblewall.saik.bubblewall W/bubbleWallMessage: -----Successfully discovered the services