RXBleConnection продолжает сбрасываться после установления соединения (Статус 19) - PullRequest
0 голосов
/ 21 мая 2019

Я разрабатываю приложение для сопряжения с двумя типами датчиков с приложением, а также эти датчики соединяются друг с другом, мы разработали наш собственный протокол связи 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
    }
}

Исключение запускается сразу после connection.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)

1 Ответ

0 голосов
/ 03 июня 2019

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...