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

Я пытаюсь подключиться к 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, пока у вас есть батарея, он остается подключенным.


person Mary    schedule 12.04.2019    source источник


Ответы (1)


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

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

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

person GoRoS    schedule 12.04.2019
comment
Спасибо, но я не понимаю, должно ли мое устройство вести себя как сервер Gatt? И каждый раз, когда мне нужна информация от Mi Band, должен ли я делать еще один звонок? Извините, но я не понял из базового примера часть Gatt Server - person Mary; 12.04.2019
comment
Нет, в Bluetooth ваше приложение будет действовать как мастер (клиент), а Mi Band — как периферийное устройство (сервер). После вызова этого метода connectGatt вам просто нужно проверить нужную информацию. Конечно, предварительно проверьте, установлено ли соединение, если автоконнект еще не подключился к нему. Мое предложение службы Android просто даст вам больше преимуществ, чтобы не иметь дело со всеми классами Bluetooth и самим жизненным циклом Android в рамках Activity. - person GoRoS; 12.04.2019
comment
Большое спасибо, я попробую это - person Mary; 12.04.2019
comment
Горос, мне нужна дополнительная помощь, у меня не получилось выполнить услугу? Я написал вам на Linkedin - person Mary; 16.04.2019
comment
не могли бы вы помочь мне с более подробной информацией, пожалуйста? Мне действительно нужна дополнительная помощь - person Mary; 17.04.2019
comment
@ Мэри, ты нашел, в чем проблема? - person Keselme; 07.07.2020