连接到其中一个时继续扫描其他BLE设备

时间:2017-12-11 21:27:49

标签: android rx-java rxandroidble

我希望我的应用程序连续扫描最多3个不同的BLE外围设备(由MAC地址标识)。找到一台设备后,我会停止扫描并连接到它。代码:

static Observable<ScanResult> bleSharedScanner = MyApplication
        .getRxBleClient()
        .scanBleDevices(new ScanSettings.Builder()
                .setScanMode(SCAN_MODE)
                .build())
        .share();

static Observable<ScanResult> device1Scanner = bleSharedScanner
        .filter(scanResult -> scanResult.getBleDevice().getMacAddress().equalsIgnoreCase( device1MacAddress ) 
        );

Device2和Device3的代码相同。最初我订阅了所有这三款设备扫描仪;当我发现其中一个设备unsubscribe订阅时 - 同时继续扫描其他两个设备。

到目前为止,这似乎正在我的测试Android手机上工作。但我注意到您对a previous question的回复:“...在尝试连接之前停止scanSubscription - Android有时无法同时处理好扫描和连接。”

这是一个常见问题吗?有一个很好的解决方法吗?我需要继续扫描其他设备,同时与找到的设备进行交互。

2 个答案:

答案 0 :(得分:1)

我的经验表明,当扫描正在进行时(我在P8 Lite和P9上确认)有两个不同的外围设备时,至少有一些华为设备在连接外围设备时出现问题。

当扫描正在进行时,我收到COMMAND_DISALLOWED命令的LE_CREATE_CONNECTION。主机和BLE芯片之间的通信是从HCI Snoop Log中提取的。对我有用的唯一解决方法是停止扫描一段时间建立连接。

我们没有任何统计数据证明这一点 - 不幸的是。

答案 1 :(得分:1)

&#34;正确&#34;方法是简单地连接到每个设备并将autoConnect标志设置为true。然后,您可以将多个连接挂起,并且与扫描时相比,连接尝试永远不会超时。

唯一的问题是,自最近的蓝牙重启以来,设备必须至少粘贴或扫描一次才能正确地使堆栈学习设备的地址类型(公共或随机)。

无论如何,99%的常用Android设备都有可以同时扫描和启动的蓝牙芯片。华为P8 lite和廉价的华硕平板电脑是迄今为止我发现的唯一无法做到的例外情况。