当前位置: 首页 > 知识库问答 >
问题:

Android 4.4:蓝牙低能耗;连接而不扫描BLE设备

孔宇
2023-03-14

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

如果要连接到专用设备,请执行以下操作

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);

然后

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

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

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

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

非常感谢Stefan

共有3个答案

阎志义
2023-03-14

自从第一次问起这个问题以来,已经过去了很多年,我能够完成以下工作。我的设备没有随机地址,所以如果您知道有关您的设备的信息,那么以下内容应该可以正常工作。

// perform scan, get device and store address somewhere 
// like in shared preferences
String bleAddress = bluetoothDevice.getAddress();
this.getSharedPreferences("myPrefs", MODE_PRIVATE).edit().putString("BLE_ADDRESS",bleAddress .apply();


// next time no need to scan, just get the remote device
// from the bluetoothAdapter and connect.
String address = this.getSharedPreferences("myPrefs", MODE_PRIVATE).getString("BLE_ADDRESS",null);
if (address != null) {
    BluetoothDevice device = bluetoothAdapter.getRemoteDevice(ble_address)
    device.connectGatt(context, false, this, BluetoothDevice.TRANSPORT_LE);
}
郎增
2023-03-14

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

孟鸿朗
2023-03-14

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

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

 类似资料:
  • 我目前正在开发一个应用程序,将使用蓝牙低能耗。 我正在使用以下链接, http://developer.android.com/samples/BluetoothLeGatt/src/com.example.android.bluetoothlegatt/DeviceScanActivity.html 我无法扫描周围的BLE设备。 要扫描设备,

  • ap.connectBLEDevice(OPTION | deviceId, CALLBACK) 连接低功耗蓝牙设备。可直接传入一个字符串作为 OPTION.deviceId。 OPTION 参数说明 名称 类型 必填 描述 deviceId String 是 蓝牙设备 id 错误码说明 error 描述 12 链接失败 代码示例 <script src="https://gw.alipayobj

  • 我正在尝试制作一个应用程序,它使用Android的新蓝牙低能耗API。为此,我从API Level18附带的BLE示例开始。 当我读到Android不能充当外围设备时,我将Android手机置于中央模式,扫描周围的BLE设备。为此,我用一个模拟心脏传感器的北欧平台做了一些测试。一切都以完美的方式运作! 多谢了。 编辑:经过一些艰苦的测试,我在AOSP页面上提出了一个问题。这里可以查

  • 我试图用BLE API扫描附近的蓝牙设备,但它似乎不起作用 我已经在清单中添加了权限 以下内容在创建对象时 创建扫描仪回调对象并进一步扫描 在logcat中,我只看到以下内容 这是我的app build gradle } 有人能指出我在这里遗漏了什么吗?

  • 开启蓝牙扫描 参数说明 字段 类型 必须? 说明 blePrefix String 是 设备名称类型前缀 示例代码 Swift: RokidMobileSDK.binder.startBLEScan(blePrefix: String) ->Bool Objc: [RokidMobileSDK.binder startBLEScanWithBlePrefix:@"Rokid-"]; 手机蓝牙未打

  • 扫描设备 介绍 需要传入扫描蓝牙设备的名称的前缀,回调均在主线程。如果传空,是无法获取设备列表。 1、单前缀蓝牙设备 参数说明 字段 类型 必须? 说明 type String 是 设备名称类型前缀 举个大栗子 String type = "Rokid-" RokidMobileSDK.binder.startBTScan(type, new IBTScanCallBack() { @Ov