Android BLE连接时间间隔

CoD*_*oDe 27 android connection-pooling l2cap bluetooth-lowenergy

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

1)有没有办法设置/覆盖BLE中央设备的连接或通知间隔.我发现对于Android,默认连接间隔固定为7.5毫秒.有没有办法更改此连接/通知延迟间隔设置.

资料来源: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连接时,android是不稳定的.这有什么解决方案吗?

编辑

我在这里观察到的另一个问题是,当需要时间重新连接时,它会随着一些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
Run Code Online (Sandbox Code Playgroud)

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

Gle*_*sen 12

当我研究Android BLE API时,我找不到用于更改连接间隔和监督超时的API(也许是奴隶延迟,从我的脑海中记不起来).我确实需要更改这些,您必须从从属设备进行更改.

Ashwini的答案你可以忽略,他说的话根本就不正确.符合蓝牙4.0标准的主设备必须支持从7.5毫秒到4.0秒的连接间隔.从设备可以请求改变连接参数并发送连接参数更新请求,并且主设备将相应地更新连接参数.

在另一方面,主(在你的情况下,Android设备)可能在改变自身的连接间隔,以节省电力的兴趣,和你想的连接区间更改为更宽松的时间间隔.

在我看来,Android API甚至几个设备上的硬件实现还不成熟,并且在BLE的意义上使用BLE可以在Android设备上获得更多功能.在未来,我相信你会在API级别和主机和控制器的分区上看到更好的支持,这样即使移动设备的主CPU处于休眠状态,控制器也可以保持连接.这将节省大量电力,您可以24/7保持与BLE设备的连接,而不会对电池寿命造成任何重大限制.

  • 这取决于从设备.让我们说这个设备是房间里的温度传感器.然后,每隔7.5毫秒发送一次温度并没有多大意义,它只会浪费很多功率而且不会给你任何额外的东西.将连接间隔更改为4s,这对于临时更新来说仍然是一个非常好的频率,但是您将减少533次传输,并且相应地减少电流消耗,使您的电池续航时间更长.这就是BLE背后的线索. (4认同)

小智 5

@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): #####
Run Code Online (Sandbox Code Playgroud)

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


Vit*_*tik 5

至于改变连接间隔:

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

它仍然没有我们开发人员想要的那么通用,但至少有一些......


Ash*_*kar 2

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

关于断线问题,我也遇到过类似的问题。我认为,这是由于给定链接中登录的问题造成的。当操作系统处理连接和配对时,您无法取消设备配对,并且此后所有重新连接尝试都会失败。如果设备在 4.3 上使用私有 API 以编程方式配对(和取消配对),则不会发生这种情况(假设您已正确处理 GATT 连接)。在android 4.4.2中,添加了createBond API用于配对。因此,在 4.4.2 中,通信效果非常好。

关于Android上低功耗蓝牙的稳定性,我可以确认它相当不稳定。我已经使用低能耗传感器测试了安装在 Nexus 4 和 Nexus 5 上的应用程序。尽管具有相同的操作系统版本 4.4.2,但这两个设备给出了不同的连接结果。我发现 Nexus 4 上的设备在一段时间后断开连接,而 Nexus 5 则一切正常。

希望这可以帮助您解决问题。