Android ble 设备有时不会断开连接

Posted

技术标签:

【中文标题】Android ble 设备有时不会断开连接【英文标题】:Android ble device is not disconnecting sometime 【发布时间】:2016-10-05 19:53:12 【问题描述】: 在断开连接设备后,我收到断开连接回调。但有一段时间它仍然没有断开连接。在某些层连接状态保持不变。所以我无法重新连接。

我已经在 android 5 和 android 6 中进行了测试。 在 HTC One A9、Moto x play、Moto G4 中

如果我关闭蓝牙。然后再次断开回调即将到来,并且设备实际上正在断开连接。 -请给一些解决问题的建议。 我正在为ble操作执行以下步骤 1.发现设备。
    连接到设备。 onConnectionStateChange(已连接)我正在做 gatt.discoverServices() onServicesDiscovered 回调我正在阅读特征 5.onCharacteristicRead 回调我在做写特征。 6.onCharacteristicWrite 回调我正在做 gatt.disconnect() onConnectionStateChange(断开连接)我正在做 gatt.close()

在后台设备扫描的整个过程中正在进行。

【问题讨论】:

如果你确实调用了 gatt.disconnect() 那么它将断开连接。如果没有,则 Android BLE 堆栈中存在错误。 我也有同样的问题... :( 有任何更新吗?运气好吗?(使用 API 21) - 对我来说,它的工作原理是考虑 1) 在连接的设备上进行操作时不要扫描。 我遇到了同样的问题。现在我只是关闭并清空BluetoothGatt。除了在三星 Galaxy S4 上之外,这都有效。在该设备上,我必须在断开/关闭后等待 15-20 秒才能再次连接,否则我将不得不关闭蓝牙并再次打开才能使其正常工作。 查看这个答案,它可能有助于解决您的问题***.com/a/63187218/2296798 【参考方案1】:

此问题可能与未调用 stopScan() 方法有关。 见 SoroushA 的评论 Totally Disconnect a Bluetooth Low Energy Device

【讨论】:

【参考方案2】:

您需要确保连接到您的设备不超过一次。我发现,如果不添加自己的保护,您可能会无意中同时与一台设备(即存在多个 BluetoothGatt 对象)建立多个连接。您可以通过任何这些 BluetoothGatt 对象与设备进行通信,因此此时您不会注意到问题。但是当您尝试断开连接时(错误地)让连接保持打开状态。

要消除这种风险,您需要大致如下代码:

BluetoothGatt mBluetoothGatt;
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() 
    @Override
    public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)             
        if (device != null) 
            Log.d(TAG, "LeScanCallback!!!!  device " + device.getAddress());

            boolean foundDevice = false;

            if (device.getName() != null) 
                Log.d(TAG, "LeScanCallback!!!!  " + device.getName());
                // Put your logic here!
                if (device.getName().compareTo("YOUR_DEVICE") == 0) 
                    Log.d(TAG, "Found device by name");
                    foundDevice = true;
                
                else 
                    Log.d(TAG,"Found " + device.getName());
                
            

            if(mBluetoothGatt == null && foundDevice) 
                mBluetoothGatt = device.connectGatt(getApplicationContext(), false, mGattCallback);
                // Make sure to handle failure cases in your callback!

                Log.d(TAG, "Stopping scan."); //Appropriate only if you want to find and connect just one device.
                mBluetoothAdapter.stopLeScan(this);
            
        
    
;

【讨论】:

以上是关于Android ble 设备有时不会断开连接的主要内容,如果未能解决你的问题,请参考以下文章

Android 8.1 连接到调用 connectGatt 的 BLE 外围设备。回调总是说断开连接。从不连接

Android BLE 外围设备与状态码 BLE_HCI_INSTANT_PASSED(0x28) 断开连接

为啥在 Android 中将 autoConnect 设置为 true 时,App 不会重新连接到 BLE 设备?

与 BLE 设备保持连接的 Android 应用

Android中不稳定的BLE连接

一起Talk Android吧(第二百九十七回:Android中的BLE开发:断开设备连接)