RXBleConnection terus terputus setelah koneksi terjalin (Status 19)

Saya sedang mengembangkan aplikasi untuk memasangkan dua jenis sensor dengan aplikasi dan juga sensor ini berpasangan satu sama lain, kami mengembangkan protokol komunikasi bluetooth khusus kami. Biasanya koneksi berfungsi dengan baik, tetapi masih ada beberapa kesalahan yang sulit saya perbaiki.

Pengupasan sensor 1 saja berfungsi dengan baik, tetapi setiap kali saya memasangkan keduanya, lalu saya menutup aplikasi, memasangkannya lagi dengan sensor pertama, saya terputus dengan status 19 tepat setelah koneksi terjalin, setelah saya coba lagi satu atau dua kali koneksi akan terjalin dengan baik. Saya berpikir itu adalah masalah dengan penyegaran Gatt, tapi saya sudah mencoba satu solusi yang ditemukan di sini dan saya terus mereproduksi kesalahan ini setiap saat.

 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
    }
}

Pengecualian diaktifkan tepat setelah connection.writeCharacteristic(BraincareBluetoothProtocol.rxCharacteristicUUID, command)

Kesalahan pencatatan:

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 sumber


Jawaban (1)


status=19 adalah GATT_CONN_TERMINATE_PEER_USER. Perpustakaan ini sejak versi 1.8.1 mencantumkan alasannya dengan benar. Selalu disarankan untuk menggunakan versi terbaru yang tersedia dari perpustakaan mana pun karena mereka membawa peningkatan seiring waktu.

Tidak ada pertanyaan yang jelas di postingan tersebut. Dengan informasi yang diberikan, tidak mungkin untuk mengetahui lebih dari informasi di atas — perangkat yang Anda gunakan terputus dari aplikasi. Mengapa hal ini terjadi tergantung pada perangkat Anda dan Anda mungkin dapat menemukan jawabannya di dokumentasi.

Ingatlah bahwa versi Android yang lebih baru tidak mengizinkan prosedur pemasangan bersamaan ke lebih dari satu perangkat BLE sekaligus. Memasangkan dua perangkat harus dilakukan secara berurutan, yaitu.

  1. Periferal A mulai berpasangan
  2. Periferal A selesai dipasangkan
  3. Periferal B mulai berpasangan
  4. Periferal B selesai dipasangkan

Periferal dapat dihubungkan pada saat yang sama tetapi hanya satu prosedur pemasangan yang dapat dilakukan pada satu waktu.

person Dariusz Seweryn    schedule 03.06.2019
comment
Terima kasih atas bantuan Dariusz! Saya tidak tahu apakah ini masalah pemasangan bersamaan karena berfungsi dengan baik pada pemasangan pertama, masalah terjadi setelah saya memutuskan sambungannya, menutup aplikasi dan kemudian memasangkan lagi, jadi menurut saya ada masalah koneksi cache. Mungkin ada masalah dengan sensor kami, kami memasangkan keduanya dengan aplikasi, dan keduanya berpasangan satu sama lain, jadi satu sensor mengambil peran sebagai budak dan master pada saat yang sama, mungkin ada beberapa kekurangan pada koneksi ini - person Shermano; 03.06.2019
comment
Selagi kita di sini, bolehkah saya mengajukan satu pertanyaan lagi? Saat kedua sensor dipasangkan, kita kehilangan banyak sekali data, dan kita bisa melihat penurunan performa yang sangat besar. Saya tidak dapat menemukan masalah apa pun di sisi Android yang menangani dua koneksi pada saat yang sama, sensor A berfungsi dengan baik jika dipasangkan sendiri dengan aplikasi, tetapi saat saya memasangkan sensor B, yang juga memasangkan dirinya dengan sensor A, paket yang hilang adalah buruk sekali, ini aneh karena sensor B tidak mengirimkan data apa pun, hanya menerimanya. Anda tahu jika ada batasan Android? kami mengembangkan protokol blutooth untuk sensornya, jadi mungkin masalahnya ada di sana. - person Shermano; 03.06.2019
comment
Wajar jika Anda memiliki sumber daya (radio) dan dibagikan, bagiannya untuk setiap pihak yang terlibat akan berkurang. Komunikasi BLE selalu dua arah walaupun data aplikasi yang dikirim hanya satu arah, toh ada respon/ACK. Jika Anda memiliki tiga perangkat yang terhubung satu sama lain pada saat yang sama, hal-hal mungkin terjadi — kesalahan implementasi pada satu perangkat akan berdampak pada perangkat lainnya. - person Dariusz Seweryn; 03.06.2019
comment
Apakah yang Anda maksud: paket hilang Setidaknya untuk notifikasi, Android tidak menjatuhkannya. - person Emil; 03.06.2019
comment
Sensor mengirimkannya dengan nomor urut, sehingga ketika kedua sensor terhubung kita dapat melihat bahwa banyak titik yang tidak diproses. Saya baru saja menemukan petunjuk, saya mengujinya pada Tablet Samsung SM-T820, dan sekarang saya baru mengujinya pada Xiaomi A2 saya dan berfungsi dengan baik - person Shermano; 03.06.2019