7

我的应用程序与 BLE 外围设备通信。有时,应用程序在该外围设备已连接的情况下启动。我可以通过调用来检索设备:

BluetoothManager manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
List<BluetoothDevice> connectedDevices = manager.getConnectedDevices(BluetoothProfile.GATT);

然后我可以根据地址或 UUID 过滤 connectedDevices。但是,BluetoothDevice 没有断开连接的方法。要断开连接,我需要一个 BluetoothGATT 实例。但我能看到获取 BluetoothGATT 实例的唯一方法是调用

connectedDevice.connectGatt(Context, boolean, BluetoothGattCallback)

这需要很长时间。最重要的是,当我调用 disconnect() 时,我在调用 connectGatt 后返回的 BluetoothGatt 实例似乎并没有真正断开外围设备。

所以我的问题是:

  • 有没有办法在不调用 connectGatt 的情况下断开连接的蓝牙设备?
  • 为什么 connectGatt 对于已经连接的设备需要这么长时间?
  • 在连接的蓝牙设备上调用 connectGatt 是否有效?

谢谢

4

3 回答 3

7

这是我的 2 美分供您查询。

  • 有没有办法在不
    调用 connectGatt 的情况下断开连接的蓝牙设备?

    你需要打电话bluetoothGatt.disconnect();为什么你需要打电话 connectGatt 断开连接?如果是因为您需要 gatt 实例,请在设备已连接时保存。不要在 connectedDevice 上调用 connectGatt。

  • 为什么 connectGatt 对于已经
    连接的设备需要这么长时间?

    导致建立连接的两个设备都需要处于可连接模式(有广告、可连接、不可连接等模式)。建立连接后,设备将不再处于可连接模式。这就是它需要更长的时间的原因。不要调用它,或者在重新连接之前断开连接。

  • 在连接的蓝牙设备上调用 connectGatt 是否有效

    编码中的所有内容都是有效且合法的,但请阅读我对第二点的回答。

于 2015-11-23T22:17:57.303 回答
1

有时,应用程序在该外围设备已连接的情况下启动。

这意味着某些其他应用程序已连接到外围设备。当然,您不能断开其他应用程序的连接。连接外围设备的应用程序也必须断开它。

于 2017-03-23T12:59:30.627 回答
0

对于我的项目,我发现了这个解决方法,不知道它是否是最好的解决方案,但也许它可以帮助某人。

声明一个 BluetoothGatt 列表:

List<BluetoothGatt> gattList = new ArrayList<>();

在 OnConnectionStateChange 中,每次连接新设备时,将他的 gatt 对象添加到列表中:

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);
    if (newState == BluetoothProfile.STATE_CONNECTED) {                  
        gattList.add(gatt) ;
    }       
}

使用以下函数获取您的 gatt 对象,使用 BluetoothDevice 地址(更容易检索):

public BluetoothGatt getGattFromAddress(String address) {
    BluetoothGatt gatt = null ;
    for(int i=0; i<gattList.size(); i++)    {
        if(address.equals(gattList.get(i).getDevice().getAddress()))
            gatt = gattList.get(i);
    }
    return gatt ;
}

执行 gatt 操作:

getGattFromAddress(bleDeviceAddress).disconnect();
于 2021-05-12T10:05:29.263 回答