RXBleConnection продолжает сбрасываться после установления соединения (статус 19)

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

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

 fun connectToDevice(device: BraincareDevice, pairColor: Int) {
    BleLogHelper.writeLog("Connecting to ${device.name}")
    isConnecting = true
    val deviceType = if (device is Sensor) DeviceType.SENSOR else DeviceType.DONGLE
    if (deviceType == DeviceType.SENSOR) {
        sensorConnectionSubscription?.dispose()
    } else {
        dongleConnectionSubscription?.dispose()
    }


    val connectionSubscription = device.device.establishConnection(false)
            .flatMapSingle { connection ->

                if (device is Sensor) {
                    sensorConnection = connection
                    connectedSensor = device
                } else if (device is Dongle) {
                    dongleConnection = connection
                    connectedDongle = device
                }

                connection.queue(CustomRefresh())
                        ?.observeOn(Schedulers.io())
                        ?.doOnComplete{
                            BleLogHelper.writeLog("GATT REFRESHED")
                        }
                        ?.subscribe ({
                            BleLogHelper.writeLog("GATT REFRESHED")
                        },{
                            BleLogHelper.writeLog("FAIL REFRESHING GATT")
                        })

                BleLogHelper.writeLog("Send Request Connection Command $deviceType")
                val command = BraincareBluetoothCommandProtocol.createRequestConnectionCommandFrame(deviceType)
                connection.writeCharacteristic(BraincareBluetoothProtocol.rxCharacteristicUUID, command)
            }
            .delay(300, TimeUnit.MILLISECONDS)
            .subscribe({
                BleLogHelper.writeLog("Connection Established ${device.type}")
                val iscon= this.isConnecting
                startBlinkingDeviceLed(deviceType, pairColor)
                connectionFlowListeners.forEach { it.onConnectionEstablished(device) }
            }, {
                BleLogHelper.writeError("Connection Lost ${device.type}", it)
                BleLogHelper.writeError("Retrying...", it)
                val iscon= this.isConnecting
                if (isMonitoring || isConnecting || deviceType == DeviceType.DONGLE){
                    connectionStateListeners.forEach {
                        if (deviceType == DeviceType.SENSOR) {
                            sensorNotificationSubscription?.dispose()
                            sensorRssiSubscription?.dispose()
                            blinkingDeviceLedsSubscription?.dispose()
                            disconnectFromDevice(DeviceType.SENSOR)
                        } else {
                            dongleRssiSubscription?.dispose()
                            disconnectFromDevice(DeviceType.DONGLE)
                        }
                        isConnecting = false
                        it.onConnectionLost(device)
                    }
                }else{
                    reconnectToDevice(device, pairColor)
                }
            })

    if (deviceType == DeviceType.SENSOR) {
        sensorConnectionSubscription = connectionSubscription
    } else {
        dongleConnectionSubscription = connectionSubscription
    }
}

Исключение возникает сразу после подключения.writeCharacteristic(BraincareBluetoothProtocol.rxCharacteristicUUID, команда)

Ошибка журнала:

2019-05-21 10:54:11.816 11797-11889/io.b4c.brain4care.debug E/BLEBC: 21/05/2019 10:54:11.810 - Connection Lost SENSOR
com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from D4:57:4F:53:44:E7 with status 19 (UNKNOWN)
    at com.polidea.rxandroidble2.internal.connection.RxBleGattCallback$2.onConnectionStateChange(RxBleGattCallback.java:77)
    at android.bluetooth.BluetoothGatt$1$4.run(BluetoothGatt.java:268)
    at android.bluetooth.BluetoothGatt.runOrQueueCallback(BluetoothGatt.java:789)
    at android.bluetooth.BluetoothGatt.-wrap0(Unknown Source:0)
    at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:264)
    at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70)
    at android.os.Binder.execTransact(Binder.java:682)

person Shermano    schedule 21.05.2019    source источник


Ответы (1)


status=19 это GATT_CONN_TERMINATE_PEER_USER. Эта библиотека, начиная с версии 1.8.1, правильно указывает причину. Всегда рекомендуется использовать новейшую доступную версию практически любой библиотеки, поскольку со временем они вносят улучшения.

В посте нет четкого вопроса. С предоставленной информацией невозможно сказать больше, чем указано выше — используемое вами периферийное устройство отключается от приложения. Почему это происходит, зависит от вашего периферийного устройства, и вы можете найти ответ в документации.

Имейте в виду, что более новые версии Android не допускают одновременных процедур сопряжения с более чем одним устройством BLE одновременно. Сопряжение двух устройств должно выполняться последовательно, т.е.

  1. Периферийное устройство A начинает сопряжение
  2. Периферийное устройство A завершает сопряжение
  3. Периферийное устройство B начинает сопряжение
  4. Периферийное устройство B завершает сопряжение

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

person Dariusz Seweryn    schedule 03.06.2019
comment
Спасибо за помощь Дариушу! Я не знаю, является ли это проблемой одновременного сопряжения, потому что они отлично работают при первом сопряжении, проблема возникает после того, как я отключаю их, закрывая приложение, а затем снова соединяю, поэтому я подумал, что возникла проблема с подключением кеширования. Возможно, это какая-то проблема с нашими датчиками, мы соединяем оба с приложением, а они - друг с другом, поэтому один датчик одновременно выполняет роль ведомого и ведущего, возможно, в этом соединении есть какой-то недостаток. - person Shermano; 03.06.2019
comment
Раз уж мы здесь, могу я задать еще один вопрос? Когда оба датчика соединены, мы теряем тонны данных, мы видим огромную потерю производительности. Я не смог найти никаких проблем на стороне Android, обрабатывающей два соединения одновременно, датчик A отлично работает в паре с приложением, но когда я соединяю датчик B, который также подключается к датчику A, потерянный пакет ужасно, это странно, потому что датчик B не отправляет никаких данных, а только получает их. Вы знаете, есть ли какое-то ограничение Android? мы разработали протокол Bluetooth для датчиков, так что, возможно, проблема в нем. - person Shermano; 03.06.2019
comment
Вполне естественно, что если у вас есть ресурс (радио), и он используется совместно, доля каждой вовлеченной стороны уменьшается. Связь BLE всегда двусторонняя, даже если данные приложения отправляются только в одну сторону, в конце концов, есть ответы/ACK. Если у вас есть три устройства, подключенные друг к другу одновременно, могут возникнуть проблемы — ошибка реализации в одном из них повлияет на все остальные. - person Dariusz Seweryn; 03.06.2019
comment
Что вы имеете в виду под потерей пакетов? По крайней мере, для уведомлений Android их не сбрасывает. - person Emil; 03.06.2019
comment
Датчик отправляет это с порядковым номером, при этом, когда оба датчика подключены, мы видим, что многие точки не обрабатываются. Я только что нашел ключ, я тестировал его на планшете Samsung SM-T820, и теперь я только что проверил на своем Xiaomi A2 и отлично работает - person Shermano; 03.06.2019