Почему BluetoothGattCallback продолжает отключаться через несколько секунд?

#android #bluetooth #bluetooth-gatt

#Android #bluetooth #bluetooth-gatt

Вопрос:

Я пытаюсь подключиться к MiBand 2 и сохраняю соединение, но через несколько секунд происходит сбой и повторное подключение.

Я сканирую доступные устройства и отображаю их. Когда я нажимаю на устройство, к которому я хочу подключиться, оно подключается, но через несколько секунд оно отключается.

На устройстве подключения я делаю это:

 private void connectDevice(BluetoothDevice itemAtPosition) {
            itemAtPosition.createBond();
            Log.i("BOND","Created with device");
        bluetoothGatt = itemAtPosition.connectGatt(getApplicationContext(), true, miBandGattCallBack);

    }
  

И в GattCallBack происходит следующее.

 miBandGattCallBack = new BluetoothGattCallback() {
            @Override
            public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
                switch (newState) {
                    case BluetoothGatt.STATE_DISCONNECTED:
                        Log.d("Info", "Device disconnected");

                        break;
                    case BluetoothGatt.STATE_CONNECTED: {
                        Log.i("Infooo", "Connected with device");
                        Log.i("Infooo", "Discovering services");
                        gatt.discoverServices();
                    }
                    break;
                }
            }

            @Override
            public void onServicesDiscovered(BluetoothGatt gatt, int status) {

                if (!sharedPreferences.getBoolean("isAuthenticated", false)) {
                    authoriseMiBand();
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putBoolean("isAuthenticated", true);
                    editor.apply();
                } else
                    Log.i("Device", "Already authenticated");
            }

            @Override
            public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {

            }

            @Override
            public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
                super.onCharacteristicWrite(gatt, characteristic, status);
            }

            @Override
            public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {

            }

            @Override
            public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
                Log.d("Descriptor", descriptor.getUuid().toString()   " Read");
            }

            @Override
            public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
                Log.d("Descriptor", descriptor.getUuid().toString()   " Written");
            }
        };

    }
  

Я хочу поддерживать соединение как можно дольше, часами, я имею в виду подключение смарт-браслета к телефону через Bluetooth, пока у вас есть батарея, он остается подключенным.

Ответ №1:

Похоже, в том, что вы делаете, нет ничего плохого, на самом деле, если вы хотите сохранить соединение как можно дольше, забыв об обработке повторных подключений, лучшей стратегией является использование autoConnect параметра to true в методе connectGatt . Установка этого параметра заставит Android автоматически подключиться к вашему MiBand 2, как только он станет доступен. Если он отключится, Android подключится к нему под капотом для вас. То, что, вероятно, там происходит, зависит не от вас, и это, скорее всего, связано либо с прошивкой устройства Bluetooth, либо со стеком Bluetooth мобильного устройства. Например, сама прошивка может вызвать отключение только для экономии заряда батареи через несколько секунд, если подключенное главное устройство не выполняет никаких действий.

Другими словами, если чипсет Bluetooth вашего мобильного телефона достаточно хорош, а также периферийного устройства, а прошивка последнего поддерживает соединение неопределенно, вы не получите никакого отключения в своем приложении.

[СОВЕТ]: Если вы хотите достичь этой цели, я предлагаю использовать отдельный сервис Android для обработки всех функций Bluetooth. В официальной документации у вас есть базовый пример для этого.

Комментарии:

1. Спасибо, но я не понимаю, должно ли мое устройство вести себя как сервер Gatt? И каждый раз, когда я хочу получить какую-то информацию от Mi Band, я должен сделать еще один звонок? Извините, но я не понял из базового примера серверную часть Gatt

2. Нет, в Bluetooth ваше приложение будет выступать в качестве ведущего (клиента), а Mi Band — в качестве периферийного устройства (сервера). После вызова этого connectGatt метода вам просто нужно проверить нужную информацию. Конечно, проверьте, что соединение установлено заранее, если автоматическое подключение к нему еще не подключено. Мое предложение службы Android просто даст вам больше преимуществ, чтобы не иметь дело со всеми классами Bluetooth и самим жизненным циклом Android в рамках действия.

3. Большое вам спасибо, я попробую это

4. Горос, мне нужна дополнительная помощь, мне не удалось выполнить услугу? Я написал вам в Linkedin

5. не могли бы вы помочь мне с более подробной информацией, пожалуйста? Мне действительно нужна дополнительная помощь