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

时间:2015-04-18 21:56:34

标签: android bluetooth bluetooth-lowenergy

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

Android documentation表示[BluetoothDevice.connectGatt()](https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context,boolean,android.bluetooth.BluetoothGattCallback))有一个autoConnect参数:

  

布尔值,指示是否自动连接到BLE设备   一旦可用

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

蓝牙配置两台设备的一般方式。但是,搜索我的BLE设备并使用BluetoothDevice.createBond()似乎不起作用。在我的ACTION_BOND_STATE_CHANGED - 回调中,EXTRA_BOND_STATEEXTRA_PREVIOUS_BOND_STATE只是从BOND_BONDING转到BOND_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);
        }
    }
};

所以这种类型的粘合似乎不起作用。

我的问题是:我是否在配对或autoConnect方面做错了什么?或者我现在如何以唯一正确的方式工作?每次必须扫描设备似乎是一个真正的痛苦(和电池消耗),看看设备是否在那里,如果这样读取数据并明天检查,否则在一小时左右检查。蓝牙的意义在于它应该在它接近时直接配对,不是吗?

1 个答案:

答案 0 :(得分:5)

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

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