繁体   English   中英

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

[英]Android 4.4: Bluetooth Low Energy; Connect without scanning for a BLE device

我的应用程序将连接到蓝牙LE设备。 通常使用mBluetoothAdapter.startLeScan(mLeScanCallback);执行设备扫描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设备。

是应该是这样还是我监督某事?

非常感谢,Stefan

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

我想如果你试图检索蓝牙地址的值,它将返回null,直到它被扫描一次。

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堆栈将暂时(直到下次重新启动蓝牙)记住地址的地址类型。 如果在连接之前没有扫描设备,它仍会尝试连接,但有可能尝试连接错误的地址类型,从而失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM