Мне нужно подключиться к устройству BLE, прочитать некоторые характеристики, настроить индикацию по двум характеристикам и дождаться индикации.
Я использую библиотеку android RxBle
Я хотел бы setupIndication с использованием RxBle
connectionDisposable.set(
establishConnection(false)
.flatMapSingle { cxn ->
connection = cxn
println("XXX DiscoverServices")
cxn.discoverServices()
}.flatMapSingle { services ->
service = services
println("XXX RequestMtu")
connection!!.requestMtu(247)
.flatMap { request ->
connectionMtu = request
Single.just(connection)
}
}.flatMap {
println("XXX Indication")
readInitialValues(connection!!)
.startWith(setupIndications(connection!!))
}.subscribe({ dataPair ->
println("Reading char values")
parseCharacteristicData(dataPair)
}, {
connectionSubject.onNext(ConnectionState.ERROR)
})
)
, где метод setupIndication выглядит следующим образом
private fun setupIndications(cxn: RxBleConnection): Observable<Pair<UUID, ByteArray>> {
val characteristics = arrayListOf(
//UUID.fromString(Constants.UUID_CHARACTERISTIC_CCP)
UUID.fromString(Constants.UUID_CHARACTERISTIC_COMMAND_DATA),
UUID.fromString(Constants.UUID_CHARACTERISTIC_BATTERY)
)
return Observable.fromIterable(characteristics)
.flatMapSingle { uuid ->
service!!.getCharacteristic(uuid)
}.flatMap {
if (it.uuid.toString() == Constants.UUID_CHARACTERISTIC_BATTERY) {
cxn.setupNotification(it)
.flatMap { observable -> observable }
.map { data -> Pair(it.uuid, data) }
} else {
cxn.setupIndication(it)
.flatMap { observable -> observable }
.map { data -> Pair(it.uuid, data) }
}
}
}
Настройка уведомлений работает нормально, но при вызове метода устройство setupIndication будет отключено, и в журнале
произойдет ошибка
Tag: RxBle#ConnectionOperationQueue, Level: 3, Message: FINISHED
MtuRequestOperation(93930390) in 103 ms
XXX Tag: RxBle#ConnectionOperationQueue, Level: 3, Message: Connection operations queue to
be terminated (MAC='XX:XX:XX:XX:XX:XX')
com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from
MAC='XX:XX:XX:XX:XX:XX' with status -1 (UNKNOWN)
at com.polidea.rxandroidble2.internal.serialization.ConnectionOperationQueueImpl.onConnectionUnsubs
cribed(ConnectionOperationQueueImpl.java:162)
at
com.polidea.rxandroidble2.internal.connection.ConnectorImpl$1$1.run(ConnectorImpl.java:65)
at io.reactivex.internal.operators.observable.ObservableDoFinally$DoFinallyObserver.runFinally(Obse
rvableDoFinally.java:142)
at io.reactivex.internal.operators.observable.ObservableDoFinally$DoFinallyObserver.dispose(ObservableDoFinally.java:98)
at io.reactivex.internal.disposables.DisposableHelper.dispose(DisposableHelper.java:124)
at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.dispose(ObservableSubscribeOn.java:73)
at io.reactivex.internal.operators.observable.ObservableUnsubscribeOn$UnsubscribeObserver$DisposeTask.run(ObservableUnsubscribeOn.java:95)
at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:784)
XXX Tag: RxBle#ClientOperationQueue, Level: 3, Message: QUEUED
DisconnectOperation(17945456)
XXX Tag: RxBle#ClientOperationQueue, Level: 3, Message: STARTED
DisconnectOperation(17945456)
XXX Tag: RxBle#ClientOperationQueue, Level: 4, Message: RUNNING
DisconnectOperation{MAC='XX:XX:XX:XX:XX:XX'}
/BluetoothManager: getConnectionState()
/BluetoothManager: getConnectedDevices
/BluetoothGatt: cancelOpen() - device: C0:63:39:49:4D:95
/BluetoothGatt: onClientConnectionState() - status=0 clientIf=10 device=C0:63:39:49:4D:95
/System.out: XXX Tag: RxBle#GattCallback, Level: 4, Message: MAC='XX:XX:XX:XX:XX:XX'
onConnectionStateChange(), status=0, value=0
/BluetoothGatt: close()
Итак, как настроить индикацию ???