Android BLE连接时间间隔

我正在使用Android BLE API在Nexus 4上开发BLE应用程序。 我有几个问题/怀疑:

1)是否有方法设置/覆盖BLE中央设备的连接或通知间隔。 我发现对于Android,默认连接间隔固定为7.5ms。 有没有办法改变这个连接/通知延迟时间间隔设置。

资料来源: http : //processors.wiki.ti.com/index.php/Bluetooth_SensorTag?DCMP=lprf-stdroid&HQS=lprf-stdroid-pr-wiki1#Supported_Android_devices

2)连接到远程设备时,我面临随机时间间隔后断开连接的问题。 有很多人面临连接丢失问题,指出Android在使用Android 4.3 API进行BLE连接时不稳定。 有没有解决scheme?

编辑

我在这里观察到什么是什么时候需要时间重新连接,然后它与一些L2CAP日志…跟随日志

Trying to create a new connection laststate_ BOND_NONE D/BluetoothGatt( 9620): connect() - device: 1C:BA:81:11:CA:36, auto: true D/BluetoothGatt( 9620): registerApp() D/BluetoothGatt( 9620): registerApp() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510 D/BtGatt.GattService( 3208): registerClient() - UUID=1adsds0911-4sdsc-41dc-8ac0-0sdsdf550510 D/BtGatt.btif( 3208): btif_gattc_register_app D/BtGatt.btif( 3208): btgattc_handle_event: Event 1000 D/BtGatt.btif( 3208): btif_gattc_upstreams_evt: Event 0 D/BtGatt.GattService( 3208): onClientRegistered() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510, clientIf=5 D/BluetoothGatt( 9620): onClientRegistered() - status=0 clientIf=5 D/BtGatt.GattService( 3208): clientConnect() - address=1C:BA:8C:1E:CA:36, isDirect=true D/BtGatt.btif( 3208): btif_gattc_open D/BtGatt.btif( 3208): btgattc_handle_event: Event 1004 D/BtGatt.btif( 3208): btif_get_device_type: Device [1c:ba:8c:1e:ca:36] type 2, addr. type 0 W/bt-l2cap( 3208): L2CAP - LE - cannot start new connection at conn st: 3 

任何想法如何可以通过L2CAP清除cahce mantain?

    当我研究Android BLE API时,找不到用于改变连接间隔和监视超时的API(也许是从属延迟,从头顶记不住)。 我需要改变这些,你必须从奴隶装置。

    你可以忽略Ashwini的回答,他所说的只是不正确的。 蓝牙4.0兼容的主设备必须支持从7.5毫秒到4.0秒的连接间隔。 从设备可以请求更改连接参数并发送连接参数更新请求,主设备将相应地更新连接参数。

    另一方面,主人(在你的情况下,Android设备)可能有兴趣改变自己的连接间隔,以节省电力,你想改变连接间隔,以一个更轻松的时间间隔。

    在我看来,Android API以及甚至几个设备上的硬件实现都是不成熟的,使用BLE是BLE的意图,它为Android设备带来了巨大的动力。 未来我相信你会看到更好的支持在API级别和主机和控制器的一个部门,使控制器可以保持连接,即使移动设备的主要CPU正在睡觉。 这将节省大量的电力,并且可以保持与您的BLE设备24/7的连接,而不会对您的电池寿命产生任何重大限制。

    @Ashwini:正如上一个评论中提到的连接间隔7.5,它在一段时间内工作得更好。 一段时间后,L2CAP问题出现,连接不工作,除非蓝牙适配器被重置。 而且,当蓝牙适配器被禁用并且再次以编程方式重新启用时,已经注意到奇怪的行为。 我们得到以下GKI错误:

     > /GKI_LINUX( 2232): ##### ERROR : GKI_exception: GKI_exception(): Task State Table > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [0] task name [BTU] state [0] > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [1] task name [BTIF] state [1] > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [2] task name [A2DP-MEDIA] state [1] > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: GKI_exception 65531 Sending to unknown dest##### > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: > 02-05 15:49:24.466 E/GKI_LINUX( 2232): > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: * GKI_exception(): 65531 Sending to unknown dest > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: *************** > 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### 

    此外,这个createBond API有助于改善与BLE设备的连接(实际上不需要配对连接)?

    对于你的第一个问题,正如OneWorld所说,build议让智能手机处理连接延迟间隔设置。 这些设置紧密依赖于特定智能手机使用的蓝牙硬件和堆栈。

    关于断线问题,我也面临类似的问题。 我想,这是由于一个问题logging在给定的链接。 当操作系统处理连接和配对时,您无法取消配对设备,并且所有重新连接尝试失败。 如果设备在4.3上使用私有API以编程方式配对(&unpaired),则不会发生这种情况,前提是您已正确处理了GATT连接。 在android 4.4.2中,添加了用于配对的createBond API。 所以4.4.2,沟通工作得很好。

    关于Android上蓝牙低功耗的稳定性,我可以确认它非常不稳定。 我已经使用低能量传感器testing了安装在Nexus 4和Nexus 5上的应用程序。 尽pipe具有相同的操作系统版本4.4.2,但两台设备的连接结果不同。 我观察到在Nexus 4上一段时间后设备断开连接,而Nexus 5则运行良好。

    希望这可以帮助你前进的问题。

    我遇到了与第二个问题相同的自动断开连接问题。 两种解决方法:

    1)在运行应用程序之前,通过蓝牙设置手动将您的Android设备与远程设备配对。

    2)或者你可以编程将它们在你的代码中。 这里是我在网上find的配对代码,这对我很有用

     private void pairDevice(BluetoothDevice device) { try { Log.d("pairDevice()", "Start Pairing..."); Method m = device.getClass() .getMethod("createBond", (Class[]) null); m.invoke(device, (Object[]) null); Log.d("pairDevice()", "Pairing finished."); } catch (Exception e) { Log.e("pairDevice()", e.getMessage()); } } 

    至于改变连接间隔:

    从Android Lollipop API级别21开始,您可以使用: requestConnectionPriority()有三个级别:CONNECTION_PRIORITY_BALANCED,CONNECTION_PRIORITY_HIGH或CONNECTION_PRIORITY_LOW_POWER。

    它仍然不是我们开发者想要的那么多才多艺,但至less有一些东西…