【问题标题】:android BLE - automatic re-connect after spontaneous disconnectandroid BLE - 自发断开后自动重新连接
【发布时间】:2014-07-15 16:15:15
【问题描述】:

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

如果 active 连接因任何原因中断(在这种情况下,外围设备已重置),我观察到以下行为....

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

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

  • 此后不久,android BLE 堆栈尝试重新连接到同一个外围设备;通过数据包嗅探器,我可以看到 BLE 连接请求通过无线方式发出......

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

BLE 堆栈中是否存在某种“模式”,它会尝试自动重新建立中断的连接???

谢谢....

【问题讨论】:

    标签: android bluetooth-lowenergy disconnect


    【解决方案1】:

    无论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 等其他设备上,只需重启手机即可解决问题。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多