Подключение Android BLE к сервису GATT занимает больше времени, чем ожидалось

Я новичок в разработке 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

person Saik    schedule 07.09.2017    source источник
comment
Какой рекламный интервал периферийного устройства?   -  person Emil    schedule 09.09.2017
comment
Я новичок в BT, и я надеюсь, что мой ответ имеет смысл. После нажатия AT-команды AT+ADVI? , я получаю значение 0 (соответствующее 100 мс), и после дальнейших исследований я узнаю, что это значение по умолчанию для модулей HMSoft, которые я использую в настоящее время. Поможет ли изменение этого номера мне быстрее подключаться?   -  person Saik    schedule 10.09.2017
comment
Конечно. Интервал объявления напрямую связан со временем установления соединения.   -  person Emil    schedule 10.09.2017
comment
Глядя на техпаспорт, я вижу, что мой модуль может иметь интервал рекламы от 100 мс до 7000 мс. Как я уже упоминал, у меня 100 мс. Есть ли определенный диапазон, который даст наилучший результат, или мне просто нужно попробовать значения и посмотреть, что работает лучше всего?   -  person Saik    schedule 11.09.2017


Ответы (1)


Для всех, кому может быть интересно решение, которое сработало для меня. Мне не удалось найти документацию по Android, в которой предлагались бы какие-либо конкретные рекламные интервалы, но в документации по IO предлагалось использовать интервал в 152,5 мс. После того, как я установил этот интервал, мое приложение начало обнаруживать и подключаться к Bluetooth намного быстрее. Спасибо, Эмиль, за то, что указали мне правильное направление.

Вот страница документации IOs, о которой я упоминал выше. https://developer.apple.com/library/content/qa/qa1931/_index.html

person Saik    schedule 11.09.2017