Как я могу прослушивать уведомления и отправлять операции записи с помощью RxBle Android, используя то же соединение? - PullRequest
0 голосов
/ 09 июля 2020

Проблема:

Я слушаю уведомление с использованием следующего кода:

bleDevice.establishConnection(false)
                .flatMap { rxBleConnection -> rxBleConnection.setupNotification(charUUID) }
                .doOnNext { }
                .flatMap { notificationObservable -> notificationObservable } // <-- Notification has been set up, now observe value changes.
                .subscribe(
                        { bytes ->
                            run {
                                // Log.i("Notification!", bytes!!.contentToString())
                                // println(bytes.toHex())
                                sp?.play(pool?.get(mRandom.nextInt(pool!!.size))!!, 1F, 1F, 0, 0, 1F)
                            }
                        },
                        { throwable -> Log.i(TAG, throwable.toString())}
                )

Это уведомление работает. Я могу видеть значение изменения уведомления, когда датчик моего устройства активирован.

Теперь я хочу нажать кнопку и отправить операцию записи, используя следующий код:

bleDevice.establishConnection(false)
                .flatMapSingle({ rxBleConnection -> rxBleConnection.writeCharacteristic(charUUID, bytesToWrite) })
                .subscribe(
                        { characteristicValue ->
                            run {
                                Log.d(TAG, "Write Command Succeeded")
                            }
                        },
                        { throwable ->
                            run {
                                Log.d(TAG, "Write Command Failed")
                                Log.d(TAG, throwable.toString())
                            }
                        }
                )

Когда я нажимаю кнопку, я получаю сообщение об ошибке в выводе журнала ниже. Он говорит, что я уже подключен. Как я могу отправить операцию записи, не пытаясь снова подключиться?

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

Вывод журнала

D/ColorsFragment: Write Command Failed
    com.polidea.rxandroidble2.exceptions.BleAlreadyConnectedException: Already connected to device with MAC address 34:81:F4:C6:09:0F

1 Ответ

1 голос
/ 16 июля 2020

Вы должны использовать одно и то же соединение для всех операций чтения / записи. Самый простой способ - использовать RxReplayingShare:

val connection = rxBleDevice.establishConnection(false).compose(ReplayingShare.instance())

connection.subscribe({}, {}) // initiate connection

connection.flatMap({ /* do your first read/write */ }).take(1).subscribe()
connection.flatMap({ /* do your second read/write */ }).take(1).subscribe()

Этот подход подходит не для всех случаев, поэтому я бы рекомендовал вам взглянуть на страница документации посвящена этому вопросу.

...