是否可以自动连接蓝牙低功耗(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_STATE
和EXTRA_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方面做错了什么?或者我现在如何以唯一正确的方式工作?每次必须扫描设备似乎是一个真正的痛苦(和电池消耗),看看设备是否在那里,如果这样读取数据并明天检查,否则在一小时左右检查。蓝牙的意义在于它应该在它接近时直接配对,不是吗?
答案 0 :(得分:5)
无需重新扫描即可正常工作。你根本不需要配对。只需再次为第一次连接获取的gatt对象调用BluetoothGatt.connect()
。
一旦ble设备再次可用,您将在onConnectionStateChange
收到BluetoothGattCallback
个活动。如果使用autoconnect选项,则甚至不需要调用BluetoothGatt.connect()
方法。只需监控你的cllback,如果你没有看到任何连接太长时间,请不要忘记用close()
关闭BluetoothGatt。
是的,要获得第一个连接,您应该使用BluetoothAdapter.startLeScan
扫描设备,而不是常见的蓝牙设备扫描。