在 Android 中与低功耗蓝牙设备配对

Pairing to a Bluetooth Low Energy device in Android

是否可以自动连接低功耗蓝牙 (BLE) 设备?

Android documentation indicates that the [BluetoothDevice.connectGatt()](https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context,布尔值,android.bluetooth.BluetoothGattCallback)) 有一个自动连接参数:

boolean indicating whether to automatically connect to the BLE device as soon as it becomes available

但是,要调用它,您首先需要 BluetoothDevice。据我所知,获得此信息的唯一方法是扫描可用设备。每次都设置扫描以连接到设备似乎不是一种理想的方式。此外,我尝试使用 nRF Control Master Panel 通过 autoConnect = true 连接到我的外围设备,但这并没有连接到设备。然而,在没有 autoConnect 的情况下连接确实可以连接,并且我已经成功地以这种方式从外围设备读取数据和向外围设备写入数据。

蓝牙中将两个设备配对的一般方式。但是,搜索我的 BLE 设备并使用 BluetoothDevice.createBond() 似乎不起作用。在我的 ACTION_BOND_STATE_CHANGED-回调中,EXTRA_BOND_STATEEXTRA_PREVIOUS_BOND_STATE 只是从 BOND_BONDINGBOND_NONE 并返回。我没有读出错误或任何东西 - 所以也许我在这里遗漏了一些东西。这是回调:

private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {

            final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
            final int prevState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR);

            Log.e(TAG, "prevState " + prevState + ", state " + state);
        }
    }
};

所以这种绑定似乎不起作用。

我的问题是:我是不是在配对或自动连接方面做错了什么?或者我目前如何让它工作是唯一正确的方式?每次都必须扫描设备,看看设备是否在那里,如果是,读取数据并明天再回来查看,否则一小时左右再回来查看,这似乎是一个真正的痛苦(和电池耗尽)。蓝牙的重点是只要靠近就应该直接配对,不是吗?

无需重新扫描即可正常工作。您根本不需要配对。只需再次调用 BluetoothGatt.connect() 获取您从第一次连接获取的 gatt 对象。 一旦 ble 设备再次可用,您将在 BluetoothGattCallback 中收到 onConnectionStateChange 事件。如果您使用自动连接选项,您甚至不需要调用 BluetoothGatt.connect() 方法。只需监控您的 cllback,如果您长时间未看到任何连接,请不要忘记使用 close() 关闭 BluetoothGatt。

是的,要获得第一个连接,您应该使用 BluetoothAdapter.startLeScan 扫描蓝牙设备,而不是扫描常见的蓝牙设备。