首页 文章

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

提问于
浏览
1

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

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

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

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

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

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

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

谢谢....

2 回答

  • 2

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

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

    部分解决方案可能涉及不使用 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这样的其他产品中,只有手机重启才能解决问题 .

  • 0

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

相关问题