# BLE蓝牙重连异常

#### 问题现象

代码里实现有连接设备流程和重新连接流程，正常连接流程和重连的流程代码逻辑一致，正常连接流程，通信是没有问题的，但是重连通信一直报BussinessError 2900099：Operation failed这个错误。

#### 背景知识

getServices：client获取server端支持的所有服务能力，即服务发现流程。使用Callback异步回调。

应用调用该方法后，才能调用其他读写特征值、描述符等其他方法，且需确保server支持的服务能力中包含需要操作的特征值或描述符。并且这些方法，都需要在异步回调结果返回后，才能调用下一次读取或者写入操作，包含接口如下所示：

*   readCharacteristicValue.
*   readDescriptorValue.
*   writeCharacteristicValue.
*   writeDescriptorValue.
*   setCharacteristicChangeNotification.
*   setCharacteristicChangeIndication.

#### 问题定位

分析hilog日志，从日志发现在重新连接流程时，有方法调用不合理的情况：

1.  setCharacteristicChangeNotification和getServices一直在循环调用，且getServices在setCharacteristicChangeNotification之后调用，而正常流程是先调用getServices之后才能调用setCharacteristicChangeNotification。
    
2.  writeCharacteristicValue没有在setCharacteristicChangeNotification异步回调回来之后再调用。
    

#### 分析结论

1.  从日志分析是setCharacteristicChangeNotification和getServices/writeCharacteristicValue这两个接口存在调用阻塞，没有在异步回调回来之后再调用，导致报错2900099，需要排查方法调用是否存在问题。
2.  setCharacteristicChangeNotification和getServices一直在循环调用，可能是每次重连GATT设备时都重新创建gattClient对象，未调用close销毁之前创建的gattClient对象，导致调用方法多次重复订阅。

#### 修改建议

排查问题代码，发现是代码中的重新连接流程有问题，会在每次重连GATT设备时都重新创建gattClient对象，而之前创建的gattClient对象未调用close销毁。可以考虑如下修改建议：

*   在重连时重用gattClient对象，连接断开时，使用现有的gattClient对象进行重连。
*   如果需要重新创建gattClient对象，需要将之前创建的gattClient对象调用close销毁。
*   在适当的时候如应用退出或不再需要连接时，调用close方法释放资源。