3

我在读取 Ble 设备和使用 RxAndroidBle 库时遇到问题。

我不断收到此错误:

BleGattException{status=22, bleGattOperation=BleGattOperation{description='CONNECTION_STATE'}}

谁能看看我的代码,看看我可能做错了什么:

subscription = rxBleDevice.establishConnection(context, true)
            .subscribe(rxBleConnection -> {
                rxBleConnection.readCharacteristic(UUID.fromString(UUID_LOG_COUNT)).doOnNext(Action1 -> Logger.d(Helper_Utils.reverseHex(HexString.bytesToHex(Action1))));
            }, throwable -> {
                Logger.d("Error", throwable.getMessage());
            });

如果您需要更多信息,我会尽力提供。

编辑

我用过 2 部不同的手机: OnePlus 两部 Android 6.0.1 Moto G Play Android 6.0.1

我已经尝试过多次打开和关闭 wifi 和蓝牙。我从来没有读过这个例子。

4

2 回答 2

0

感谢 s_noopy 发现我的问题。

这是我的问题的解决方案:

subscription = rxBleDevice.establishConnection(context, true)
        .subscribe(rxBleConnection -> {
           rxBleConnection.readCharacteristic(UUID.fromString(UUID_LOG_COUNT))
.subscribe(characteristicValue -> {
                            Logger.d(Helper_Utils.reverseHex(HexString.bytesToHex(characteristicValue)));
                        });
        }, throwable -> {
            Logger.d("Error", throwable.getMessage());
        });

我用 .subscribe 改变了 .doOnNext

于 2017-03-30T15:31:08.180 回答
0

status = 22是与 Android 操作系统断开外围设备相关的问题。您可以从代码中做很多事情来防止它。

至于不读取特征值——那是因为你没有订阅它。编程(或一般的反应式编程)的最佳方法RxJava是准备一个只有一个订阅的流,因为这样可以最大限度地减少状态量。

你可以这样做:

Subscription s = rxBleDevice.establishConnection(true) // establish the connection
  .flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(UUID.fromString(UUID_LOG_COUNT))) // when the connection is established start reading the characteristic
  .take(1) // after the first value unsubscribe from the upstream to close the connection
  .subscribe( // subscribe to read values
    characteristicValue -> Logger.d(Helper_Utils.reverseHex(HexString.bytesToHex(characteristicValue))), // do your thing with the read value here
    throwable -> Logger.d("Error", throwable.getMessage()) // log / show possible error here
  );

请记住,您可以通过调用将断开外围设备来取消它.subscribe()的结果。SubscriptionSubscription.unsubscribe()

我的代码引用了RxAndroidBle 1.2.0昨天发布的新 API。

于 2017-03-30T15:51:35.260 回答