android BLE - 自发断开后自动重新连接

时间:2014-07-15 16:15:16

标签: android bluetooth-lowenergy disconnect

在我的Nexus7上使用android 4.4 BLE API,我能够成功地与外围BLE设备进行交互 - 连接,断开连接,读取,写入....

如果活动连接由于某种原因而中断(在这种情况下,外围设备被重置),我会观察到以下行为....

  • 我的外围设备(按设计)在任何有效连接终止后(无论出于何种原因)开始做广告;我可以通过我的蓝牙数据包嗅探器看到这个....

  • 我在我的Android应用程序中按预期收到onConnectionStateChanged回调,此时我在我的活动BluetoothGatt实例上调用close();这是我在客户端发起的“正常”断开连接时遵循的相同程序......

  • 在此之后不久,android BLE堆栈尝试重新连接到同一个外设;通过数据包嗅探器,我可以看到BLE连接请求在空中传播......

但是,我的应用程序没有启动此重新连接;事实上,我看不到来自任何蓝牙日志的信息,这表明这甚至发生了!!!!

是否在BLE堆栈中有一些“模式”,它会尝试自动重新建立已连接的连接???

感谢....

2 个答案:

答案 0 :(得分:3)

无论autoConnect标志设置为false还是true,都会在各种Android手机上发生这种情况。

还没有找到一个完整的解决方案,似乎android BLE堆栈一旦再次获得广告信号就会自发地重新启动连接,只是忽略了它是故意断开连接的应用程序...... / p>

部分解决方案可能涉及不使用此处所述的BluetoothGatt.connect()方法:

https://stackoverflow.com/a/23749770/4144487

因此,示例连接方法可能如下所示:

void connect(Context context) {
    if (mGatt != null) {
        mGatt.close();
     }
    mGatt = mDevice.connectGatt(context, false, callback);
}

为了解释这个问题的重要性,当它发生时,外设认为它是连接的,我的“真正的”应用程序再也找不到了。在某些手机如Galaxy S3和Redmi note 3中,我发现从通知栏关闭蓝牙开关是“释放”外围设备并允许我发现设备。在像Nexus 5x这样的其他产品中,只有手机重启才能解决问题。

答案 1 :(得分:0)

如果您在调用autoConnect=true时使用BluetoothGatt#connectGatt(),我发现这种情况正在发生。 一般我发现最好使用autoConnect=false,但是对于某些设备,除非使用true,否则根本无法连接,所以我通常都会这样做。我首先尝试false,如果失败则使用true,然后您描述的行为就是您必须解决的问题。