Android:自动重新连接BLE设备

时间:2015-12-22 22:42:23

标签: android bluetooth-lowenergy android-bluetooth

我的目标是让Android设备重新连接到之前已连接到而无需用户干预的BLE设备,就像它对经典BT配对设备所做的那样(甚至通过动力循环)。

BTLE设备的一个想法是节省服务,绑定和启用状态,以便重新连接非常快并且在外围设备上消耗的功率非常小。

我所做的似乎有效,但效果不佳。

第一步是连接或配对并连接到新设备,将'autoconnect'参数设置为'true'。 当设备断开连接时,不会调用 gatt.close()。无论我到哪里,我都会看到应该调用gatt.close()。但如果我打电话给gatt.close(),Android中心应用程序永远不会重新连接。我已多次测试过了。

如果我没有调用gatt.close()并且没有重启Android,则通常会发生自动连接。有时它可能需要很长时间,特别是在5.0版之后。然而,它是不可靠的并且由于非常低的扫描周期而且在扫描周期实际检测到广告之前设备退出广告可能是不可靠的。我不确定,因为没有办法像广告那样检测扫描操作!扫描也可能在一定时间后停止,但没有相关文档。

所以我认为我需要做的是以某种方式将Android使用的后台扫描速率设置为更高的占空比(仅在5.0及以上),当设置了自动连接但我不知道如何做这个。我不想开始自己的扫描,但不知何故设置了Android用于重新连接的后台扫描速率。有谁知道如何做到这一点?有谁真的知道autoconnect和gatt.close()是如何工作的?

如上所述,也许自动连接不是要重新连接?

2 个答案:

答案 0 :(得分:1)

经过多次试验和磨难之后,这就是我最好让Android自动连接的唯一用户操作是首先选择设备(如果使用设置菜单然后首先配对)。

您必须将配对事件捕获到BroadcastReceiver中并执行BluetoothDevice.connectGatt()将autoconnect设置为true。然后,当设备断开连接时,调用gatt.connect()。

更新:虽然上述方法通常有效,但有时可能会因为待处理的连接使用非常保守的扫描速率而非常缓慢。另一个缺点是,对于要自动重新连接的每个设备,您必须保持BluetoothGatt对象执行挂起连接。在嵌入式世界中,这是疯狂的。相反,人们通过检查其广告来连续扫描并连接到所需设备。一个只保存有关设备的最小数据量(服务,配对状态和密钥等)。捕获广告时,您会看到它是否是您已知的设备之一,如果是,则连接到该广告。 我试过Android上的等价物。一直扫描(低功率)并连接到感兴趣的广告,并维护代表已知设备的类。这种方法有一些烦人的细节(比如在连接后连接和重启时关闭扫描)但它基本上没有维护连接的开销。但有一个我不明白的例外。扫描仪从未看到过一个预配对设备的广告。但是,如果我调用此设备的挂起连接,则重新连接。我根本不明白这一点。在我的嵌入式平台上,它可以正常工作。 如果其他人尝试过这种方法进行自动重新连接,请分享您的经验!

我发现Android没有看到预配对设备的原因。如果设备响应扫描请求,Android仅报告扫描结果。配对后,此设备仅发出广告并忽略扫描请求,因此Android系统不会在ScanCallback中传递其广告。因此,为了使用扫描方法工作,我必须对这些特定设备使用挂起连接方法。看起来你似乎无法获胜!

答案 1 :(得分:0)

这就是我能够为我的应用程序执行此操作的方式。 我首先将设备的地址存储在SharedPreference中,然后将其存储在我的BluetoothLeService的gattClientCallback函数中

else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            intentAction = ACTION_DISCONNECTED;


            DeviceActivity.runOnUI(() -> {

                sharedPreferences  = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

             String  name_dev_1 = sharedPreferences.getString("Dev_1", null) ;

              connectToDevice(name_dev_1);

                disconnectGattServer();
            });
        }
    }

这是如果您的设备断开连接,它将继续尝试建立连接,直到建立连接为止。