【问题标题】:Connect other Bluetooth LE device without scanning?无需扫描即可连接其他蓝牙 LE 设备?
【发布时间】:2014-03-04 10:02:47
【问题描述】:

是否可以在不扫描的情况下与其他蓝牙 LE 设备连接。

当蓝牙打开时,我正在开发应用程序,然后当我进入任何市场时自动收到通知,表明 Beacon 设备(基本上是蓝牙 LE)在您的范围内。不用我扫描蓝牙乐。我的蓝牙刚刚打开。没有扫描。

因为我们的要求是蓝牙不只是扫描,当有新的 BLE 在范围内时显示警报或任何通知。

我实现了一些扫描方法

startScan(){} 
stopScan(){}
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {}

但我不希望我直接想要获取连接消息。

请以代码片段的形式帮助我,并提供一些解释
谢谢

【问题讨论】:

  • 我认为“扫描”只是打开收音机和收听广告包的术语。如果您不打开收音机收听,您将不会收到任何信息。
  • 如果您之前没有与设备配对,仅打开蓝牙不会为您提供有关您周围设备的信息。您可以尝试的一种选择是定期尝试使用 BluetoothAdapter Connect 方法进行连接,因为您知道信标的地址。不过,您必须进行广泛的测试才能看到这对电池寿命的影响。正如@TimTisdall 指出的那样,如果没有打开扫描,手机就不会寻找信标发出的数据包。

标签: android bluetooth bluetooth-lowenergy


【解决方案1】:

您可以使用蓝牙适配器。

BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mac);
device.connectGatt(mContext, false, mGattCallback);
// TODO your code

如果蓝牙设备不在身边,在BluetoothGattCallback的onConnectionStateChange中会报告BluetoothGatt.STATE_DISCONNECTED。

BluetoothDevice 的创建者具有包范围。但是BluetoothAdapter的getRemoteDevice的源码是:

public BluetoothDevice getRemoteDevice(String address) {
    return new BluetoothDevice(address);
}

【讨论】:

    【解决方案2】:

    您只是想发现支持特定服务的设备吗?有一个重载 startLeScan(UUID[], ...),您可以在其中传递您感兴趣的服务的 UUID。

    否则,如果您只想连接到已知 BT 地址的设备,您也许可以使用该地址创建一个蓝牙设备对象并在其上调用 connectGatt()。只是一个想法,不确定这是否可行:-)

    【讨论】:

      【解决方案3】:

      无法创建带有地址的蓝牙设备对象! BluetoothDevice 的创建者具有包范围。所以你不能创建蓝牙设备。 而且虽然 BluetoothDevice 实现了 Parcelable,但它不能从文件中创建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 2015-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多