28

我正在使用 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 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

知道如何通过 L2CAP 清除 cahce mantain 吗?

4

5 回答 5

13

当我研究 Android BLE API 时,我找不到用于更改连接间隔和监督超时的 API(也许从属延迟也是如此,我不记得了)。我确实需要更改这些,您必须从从设备进行。

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

另一方面,主设备(在您的情况下是 Android 设备)可能有兴趣自行更改连接间隔,以节省电量,并且您希望将连接间隔更改为更宽松的间隔。

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

于 2014-02-10T08:52:42.407 回答
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): #####

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

于 2014-02-06T06:03:37.467 回答
3

至于改变连接间隔:

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

它仍然不像我们开发人员想要的那样多才多艺,但至少……

于 2017-10-02T09:09:45.917 回答
2

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

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

2)或者您可以在您的代码中以编程方式将它们配对。这是我在网上找到的配对代码,对我有用

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());
        }
    }
于 2014-04-15T20:02:18.333 回答
2

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

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

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

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

于 2014-02-05T16:31:27.473 回答