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

Posted

技术标签:

【中文标题】为啥在 Android 中将 autoConnect 设置为 true 时,App 不会重新连接到 BLE 设备?【英文标题】:Why the App doesn't reconnect to the BLE device when set autoConnect to true in Android?为什么在 Android 中将 autoConnect 设置为 true 时,App 不会重新连接到 BLE 设备? 【发布时间】:2014-11-19 12:47:30 【问题描述】:

我在 Android 和 BLE 中进行开发。我希望应用在 BLE 设备 断开连接后自动重新连接BLE 设备,但又回到范围和广告中。

我使用以下代码连接BLE设备:

public void connect(final String address) 
        // TODO Auto-generated method stub
        Log.w(TAG, "BluetoothLeService Connect function.");
        if(mBluetoothAdapter == null || address == null)
            Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
            //return false;
        

        final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
        mBluetoothGatt = device.connectGatt(this, true, mGattCallback);

    

我已将 AutoConnect 设置为 true ,但是当 BLE 设备断开连接并返回范围时,它没有重新连接。

为什么在 Android 中将 autoConnect 设置为 true 时应用无法重新连接到 BLE 设备?

我错过了什么吗?

提前致谢。

【问题讨论】:

【参考方案1】:

自动连接参数确定是否主动连接到远程设备(或)当远程设备在范围内时被动扫描并完成连接。

但这并不意味着断开连接数天然后重新出现的外围设备将重新连接。

通常,与设备的第一次连接应该是直接的(autoConnect 设置为 false),随后与已知设备的连接应该在 autoConnect 参数设置为 true 的情况下调用。

另外请注意,自动连接仅在设备仍在广播时起作用。如果没有,那么它将无法正常工作。

我希望您在设备断开连接时手动重新连接。如果万一您最终遵循此操作,您将需要一个标记来确定设备是否在未经用户同意的情况下实际断开连接。

如果为真,则取消绑定/取消注册您的服务/广播接收器并使用您之前必须保存的设备地址再次连接。

【讨论】:

android中autoConnect设置为true时,设备断开连接后BLE重新连接的时间限制是多少? 我不敢说实话,因为我从来没有发现自动连接功能是完全可靠的(至少在我的情况下),就像我之前提到的那样,我编写了自己的代码来重新连接BLE 更加有效和可靠。 我明白了。感谢您的帮助! 我也没有发现自动连接功能是可靠的,在不同的设备上,重新连接的发生方式不同。前任。根据我的经验,connectionInterval 后重新连接所需的时间差异很大。 @VikramEzhil 你能分享一下BLE的重新连接代码吗【参考方案2】:

根据我对 BLE 设备的实验,它在 Kitkat 和 Lollipop 等不同版本中具有不同的行为。即使我观察到,在 API 级别 24 中引入的 ScanCallback 也不是那么可靠。

要使自动连接工作,BLE 设备必须处于活动状态。

对我来说,我必须支持 kitkat 和棒棒糖,所以在连接 gatt 时我称之为:

  if(Build.VERSION.SDK_INT  == Build.VERSION_CODES.KITKAT) 
            gatt = device.connectGatt(this, true, executor);
         else 
            gatt = device.connectGatt(this, false, executor);
        

现在自动连接在 Lollipop 和 Kitkat 中都适用于我。

【讨论】:

现在你只是禁用了非 kitkat 的自动连接?这意味着您将使用直接连接,其含义是 30 秒超时和一次最多 1 个待处理连接。

以上是关于为啥在 Android 中将 autoConnect 设置为 true 时,App 不会重新连接到 BLE 设备?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 JavaScript 中将全局变量添加到窗口对象?

为啥不能在 Java 中将类声明为静态?

为啥我不能在通知中将数组转换为 AnyObject?

为啥我们在 PHP 中将一些变量声明为“$_variablename”...? [复制]

为啥我们在 jsonArrayRequest 中将 jsonRequest 参数设置为 null?

为啥我不能在 Swift 中将对象数组返回给 UIStackView? [复制]