Android 4.4:低功耗蓝牙;无需扫描 BLE 设备即可连接

Posted

技术标签:

【中文标题】Android 4.4:低功耗蓝牙;无需扫描 BLE 设备即可连接【英文标题】:Android 4.4: Bluetooth Low Energy; Connect without scanning for a BLE device 【发布时间】:2015-10-01 11:41:00 【问题描述】:

我的应用应连接到蓝牙 LE 设备。通常您使用mBluetoothAdapter.startLeScan(mLeScanCallback); 执行设备扫描。回调为您提供有关可用设备的信息。

如果你想连接到专用设备,你可以这样做

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);

然后

mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

在我看来,连接到 BLE 设备所需的唯一事情就是知道 BLE 地址,然后通过上述两个步骤连接到它。因此,如果我已经知道 BLE 地址(例如,它写在 BLE 设备的标签上),我就不需要执行 BLE 扫描。

但是我遇到的是,如果我有一个以前从未通过 BLE 扫描找到的 BLE 设备,则无法使用其 BLE 地址直接连接到它。我必须用我的安卓手机至少扫描一次才能找到它。之后我再也不需要扫描了,我只需使用它的 BLE 地址就可以连接到 BLE 设备。

应该是这样还是我监督了什么?

非常感谢, 斯蒂芬

【问题讨论】:

连接前是否需要pairing and/or bonding? 据我了解BLE,这是没有必要的。此外,如果我确实执行了扫描,我不会对配对或绑定做任何事情,并且它可以工作。问题是直接连接到设备而无需进行 BLE 扫描。 【参考方案1】:

设备地址只是蓝牙设备的唯一标识,不包含连接信息。扫描对于从蓝牙设备检索广播信号中的信息是必要的,以便可以建立连接。扫描完成后,信息将保存在设备的某个位置并绑定到设备地址。

我认为如果您尝试检索蓝牙地址的值,它将返回 null,直到它被扫描一次。

【讨论】:

你有消息来源证实这一点吗? Source 并没有具体说明这一点,虽然我不是蓝牙协议方面的专家,但我的推断是,虽然设备地址可以用来识别设备,但它没有指定在什么渠道上交流。该协议为从设备和主设备指定了一个查询通道,以相互了解并提供进一步的连接指令。一旦检索到该信息,master 就可以保存该信息并在下次直接执行连接,因为它已经有了指令。 请注意,这对于未绑定的 BLE 设备也是如此。这意味着一旦扫描完成并进行服务发现,一旦 android 将缓存服务并调用 BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);将在不到 1 秒的时间内建立连接。【参考方案2】:

Hoa Do 的回答并不正确。

由于 Android 的 BLE API 中存在一些可怕的设计缺陷,因此无法判断给定地址是公共地址还是随机地址。 (您可以在https://devzone.nordicsemi.com/question/43670/how-to-distinguish-between-random-and-public-gap-addresses/ 阅读有关不同地址类型的更多信息)。 getRemoteDevice 方法应该采用附加参数“随机地址/公共地址”,但它没有。如果地址类型不正确,蓝牙控制器将无法连接到设备。

Android 的 BLE 堆栈具有一些内部启发式来“猜测”地址是公开的还是随机的,但不幸的是,这在 Android 版本之间以及您使用 autoConnect=true 或 false 时会有所不同。但是,如果您已绑定设备 (https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createBond()),那么无论给定地址是公共地址还是随机地址,它将存储在其内部数据库中。如果您要连接的外围设备使用随机可解析地址,那么如果您使用绑定,它也可以处理。因此我强烈建议使用绑定。

如果您不使用绑定,则需要在连接到设备之前进行扫描,因为当您开始扫描并检测到设备时,Android 的 BLE 堆栈会暂时(直到下次重新启动蓝牙)记住地址类型一个地址。如果您在连接前没有扫描设备,它仍然会尝试连接,但它可能会尝试使用错误的地址类型连接并因此失败。

【讨论】:

以上是关于Android 4.4:低功耗蓝牙;无需扫描 BLE 设备即可连接的主要内容,如果未能解决你的问题,请参考以下文章

Android 低功耗蓝牙开发(扫描连接)

Android 低功耗蓝牙开发(扫描连接)

Qt低功耗蓝牙系列三(低功耗蓝牙客户端的程序设计纯Android代码)

Qt低功耗蓝牙系列三(低功耗蓝牙客户端的程序设计纯Android代码)

需要为 Android 6.0 上的蓝牙低功耗扫描启用位置

Android 低功耗蓝牙开发(扫描连接数据交互)Kotlin版