21

我的目标是在低功耗蓝牙设备和手机之间建立自动连接。我按照示例代码找到了这条线

// We want to directly connect to the device, so we are setting the autoConnect parameter to false.
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

上面的代码表示false使用自动连接。但是,我在这里找到了 API ,它说

BluetoothGatt connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback, int transport) 连接到此设备托管的 GATT 服务器。

而且我还尝试了两个标志:truefalse,并且仅true有效。我正在使用版本 >= Android 5.0。代码和 API 之间有不一致的地方吗?哪个标志是正确的?如果我想进行自动连接,我需要注意什么吗?

这是我的代码

public boolean connect(final String address) {
    if (mBluetoothAdapter == null || address == null) {
        Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
        return false;
    }

    // Previously connected device.  Try to reconnect.
    if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)
            && mBluetoothGatt != null) {
        Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");
        if (mBluetoothGatt.connect()) {
            mConnectionState = STATE_CONNECTING;
            return true;
        } else {
            return false;
        }
    }

    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
    if (device == null) {
        Log.w(TAG, "Device not found.  Unable to connect.");
        return false;
    }
    // We want to directly connect to the device, so we are setting the autoConnect
    // parameter to false.
    mBluetoothGatt = device.connectGatt(this, true, mGattCallback);
    Log.d(TAG, "Trying to create a new connection.");
    mBluetoothDeviceAddress = address;
    mConnectionState = STATE_CONNECTING;
    return true;
}
4

2 回答 2

43

“直接连接”与“自动连接”相反,因此如果将 autoConnect 参数设置为 false,您将获得“直接连接”。请注意,执行“mBluetoothGatt.connect()”也将使用自动连接。

请注意https://code.google.com/p/android/issues/detail?id=69834这是一个影响旧版本 Android 的错误,它可能会使您的自动连接改为直接连接。这可以通过反射来解决。

直接连接和自动连接之间存在一些未记录的差异:

直接连接是具有 30 秒超时的连接尝试。当直接连接正在进行时,它将暂停所有当前的自动连接。如果已经有一个直接连接挂起,最后一个直接连接将不会立即执行,而是排队并在前一个完成时启动。

使用自动连接,您可以同时拥有多个挂起的连接,并且它们永远不会超时(直到明确中止或蓝牙关闭)。

如果连接是通过自动连接建立的,Android 将在断开连接时自动尝试重新连接到远程设备,直到您手动调用 disconnect() 或 close()。一旦通过直接连接建立的连接断开,就不会尝试重新连接到远程设备。

与自动连接相比,直接连接具有不同的扫描间隔和扫描窗口,这意味着它将花费更多的无线电时间来侦听远程设备的可连接广告,即建立连接的速度更快。

Android 10 的新变化

从 Android 10 开始,直接连接队列已被移除,并且不会再暂时暂停自动连接。这是因为直接连接现在像自动连接一样使用白名单。在进行直接连接时改进了扫描窗口/间隔。

于 2016-10-22T00:20:48.850 回答
0

autoConnect 参数确定是主动连接到远程设备,还是在远程设备处于范围/可用时被动扫描并完成连接。通常,与设备的第一次连接应该是直接的(autoConnect 设置为 false),随后与已知设备的连接应该在 autoConnect 参数设置为 true 的情况下调用。

于 2021-02-12T10:13:25.020 回答