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

时间:2015-10-01 11:41:00

标签: android bluetooth

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

如果您想连接到专用设备,可以执行类似

的操作
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);

然后

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

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

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

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

非常感谢, 斯蒂芬

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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()),则无论给定地址是公共地址还是随机地址,设备都将存储在其内部DB中。如果要连接的外围设备使用随机可解析地址,则在使用绑定时也可以处理该地址。因此,我强烈建议使用绑定。

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