12

我有暴露 BLE 服务器的 Android 应用程序。我与BluetoothGattServer#connect 连接。它有效 - 我的应用程序使用STATE_CONNECTED调用BluetoothGattServerCallback#onConnectionStateChange。完成客户端后,我尝试使用BluetoothGattServer#cancelConnection断开与我的应用程序的连接。

但是我没有接到BluetoothGattServerCallback#onConnectionStateChange的电话,并且似乎连接仍然处于活动状态,因为我的 BLE 客户端没有开始做广告(当没有任何连接时它会这样做)。

在 logcat 我只看到:

BluetoothGattServer: cancelConnection() - device: XX:XX:XX:XX:XX:XX

有趣的是,一旦我完全关闭 BT ,我的应用程序就会使用STATE_DISCONNECTED调用BluetoothGattServerCallback#onConnectionStateChange 。

谷歌跟踪器中的类似问题:6346163464

4

3 回答 3

8

当 newState==BluetoothProfile.STATE_CONNECTED 时,您必须调用 BluetoothGattServer.connect();。

@Override
public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
    super.onConnectionStateChange(device, status, newState);
    if (newState == BluetoothProfile.STATE_CONNECTED){
        mDevice = device;
        mBluetoothGattServer.connect(device, false);
    }else {
        mDevice = null;
    }
}

private void cancelConnection(){
    if (mDevice != null) {
        mBluetoothGattServer.cancelConnection(mDevice);
    }
}
于 2019-04-11T06:23:06.383 回答
2

在调用 disconnect() 方法时遇到同样的问题。在我的 BluetoothGattCallback 中的 onConnectionStateChange 中没有给出断开连接。

循环蓝牙似乎是唯一有效的方法。

编辑:另外,disconnect() 和 close() 方法被调用后,我仍然根据这段代码连接:

public int getConnectedBLEDevices() {
        int i = 0;
        List<BluetoothDevice> devices = mBluetoothManager.getConnectedDevices(BluetoothProfile.GATT);
        for(BluetoothDevice device : devices) {
            if(device.getType() == BluetoothDevice.DEVICE_TYPE_LE) {
                Logs.writeEvent(TAG+".getConnectedBLEDevices()", device.getAddress() + "\n"+ getStateAsString(mBluetoothManager.getConnectionState(device, BluetoothProfile.GATT)));
                i++;
            }
        }
        return i;
    }
于 2016-08-08T21:16:21.037 回答
1

请参阅https://issuetracker.google.com/issues/37127644

状态:无法修复(预期行为) 您必须调用 BluetoothGattServer.connect() 将连接标记为已使用,然后调用 BluetoothGattServer.disconnect() 将其标记为不再使用。然后在超时后,如果没有其他人正在使用该连接,堆栈可以决定断开与远程的连接。如果在建立连接后未调用 BluetoothGattServer.connect(),则堆栈将保持连接,直到某些 gatt 客户端/服务器应用程序开始使用此连接。

于 2019-04-18T09:17:03.217 回答