【问题标题】:RxAndroidBle2 working differently in scanning and connecting across Android phone modelsRxAndroidBle2 在跨 Android 手机型号的扫描和连接方面的工作方式不同
【发布时间】:2018-06-12 09:23:31
【问题描述】:

首先,感谢 Polidea 为 Android BLE (RxAndroidBle2) 提供了出色的基于 ReactiveX 的库!

当我遇到这个库时,我已经用 RxAndroidBle 完全替换了我在我的 Android 应用程序中使用的 BLE,这消除了我在使用 BLE 和 Java 原生 BT API 时遇到的很多问题。我的应用程序旨在连接和引导 BLE 外围设备。下面我从我的 Android Java 代码中复制粘贴了我对 RxAndroidBle 的使用作为示例。

但我不完全理解为什么 RxAndroidBle 可以无缝地和新的 Android 模型一起工作,而它在旧的 Android 模型中存在问题。

问题是有些老款手机确实可以扫描找到设备,但是找到合适的设备后却无法连接BT外设。连接有问题的设备例如华为 P8 Lite (Android 6.0) 和 Asus Zenfone Go ZB500KL (Android 6.0)。相同的代码在新设备中运行良好。

所以我的问题:

  1. 我怎么知道,在哪些手机型号或 Android 版本中,RxAndroidBle2 库 1.5.0 的工作方式应该与它在 >6.0 Android 版本中的工作方式相同。

  2. 为什么扫描始终在所有 Android 设备 >5.0 中工作,但不是在所有 Android 设备中连接

提前感谢您的任何回答!

我的代码示例:

扫描----

scanDisposable = rxBleClient.scanBleDevices(
      new ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
            .build(),
      new ScanFilter.Builder()
            .setServiceUuid(new ParcelUuid(Globals.uuid_my_service))
            .build()
)
      .compose(bindUntilEvent(FragmentEvent.PAUSE))
      .observeOn(AndroidSchedulers.mainThread())
      .take(scanTimeMillis, TimeUnit.MILLISECONDS)
      .doFinally(this::dispose)
      .subscribe(this::addScanResult, this::onScanFailure);

连接----

connectionDisposable = bleDevice.establishConnection(false)
      .compose(bindUntilEvent(PAUSE))
      .flatMapSingle(connection ->
            connection.discoverServices()
                  .flatMap(services -> services.getService(Globals.uuid_my_service))
                  .map(service -> service.getCharacteristic(Globals.uuid_program_characteristic))
                  .flatMap(characteristic -> connection
                        .writeCharacteristic(characteristic, programData))
      )
      .doFinally(this::dispose)
      .subscribe(
            characteristic -> {
               Log.i(tag, characteristic.toString());
               bluetoothResponses.msgToUserOnSuccess("\n" + "Success...");
               atomicSuccess.set(true);
            },
            throwable -> {
               bluetoothResponses.onConnectionFailure(throwable);
            });

【问题讨论】:

  • 真正的问题是什么?你能用RxBleLog.setLogLevel(RxBleLog.VERBOSE)添加日志吗?
  • 我已经启用了日志记录,在我从实时设备获取日志后会在此处发布。不过,这需要几天时间,设备就在那里......无论如何,根据手机型号的不同,会有很多不同的行为。
  • 另一个问题:你总是在开始连接之前停止扫描吗?
  • 这是一个很好的提示。我没有调用scanDisposable.dispose(),只是设置了scanDisposable = null。让我们看看这是否会影响具有旧 Android 版本的设备!
  • 在扫描和连接后添加对 dispose() 的调用使其适用于许多手机型号,所以这是一个很好的提示。我想查看 RxAndroidBle API 文档中对此的解释。或许值得一提的是,在某些模型中,即使不调用 dispose() 也可以扫描和连接,但为了覆盖最广泛的设备,应该始终调用 dispose()。然而,有些手机型号总体上无法正常工作。我正在尝试获取有关其中原因的更多信息。

标签: android bluetooth bluetooth-lowenergy interop rxandroidble


【解决方案1】:

我怎么知道,在哪些手机型号或 Android 版本中,RxAndroidBle2 库 1.5.0 的工作方式应该与它在 >6.0 Android 版本中的工作方式相同。

您不知道 — BLE 实施因供应商、设备、芯片等而异。组合太多,设备特定错误太多。

为什么扫描总是在所有 Android 设备 >5.0 中工作,但不是在所有 Android 设备中连接

BLE 堆栈的一些实现存在问题。有时它们只是随机失败,但是当立即重试时,一切都开始起作用了。有时扫描和连接之间的额外时间(约 500 毫秒)可以解决问题。

华为 P8 Lite (6.0) 有一个糟糕的 BLE 芯片,它不能同时处理扫描和连接。显然有时the NearbyMessageService from Google Play Services scans continuously in the background 并阻止成功连接。这种情况也可能显示在其他供应商/设备上。作为开发人员,您对此无能为力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多