1

我开发了一个使用 ble 的应用程序。我使用 Eclipse 作为开发工具。

我的“使用 ble 的应用程序”安装在我的智能手机上。我将智能手机和电脑连接到 USB。然后在我的智能手机上,我启动了我开发的“使用 ble 的应用程序”。

我在 Eclipse 的 Logcat 中找到了以下日志。

08-22 20:59:11.278: V/BluetoothLeService(23378): report STATE_CONNECTED
08-22 20:59:11.283: E/BluetoothLeService(23378): ccccc BluetoothGattCallback public void onConnectionStateChange end
08-22 20:59:11.283: I/MainActivity2(23378): BroadcastReceiver CONNECTED
08-22 20:59:11.288: I/MainActivity2(23378): BroadcastReceiver GATT_SUCCESS
08-22 20:59:11.288: I/BluetoothLeService(23378): getBtGatt()
08-22 20:59:11.288: V/MainActivity2(23378): onView mServicesRdy = false
08-22 20:59:11.288: V/MainActivity2(23378): onView mBtGatt = android.bluetooth.BluetoothGatt@4335ebb8
08-22 20:59:11.288: I/BluetoothLeService(23378): getNumServices()
08-22 20:59:11.288: D/BluetoothGatt(23378): discoverServices() - device: 98:7B:F3:52:48:11
08-22 20:59:11.288: E/MainActivity2(23378): mBtGatt.discoverServices() = true
08-22 20:59:11.288: D/BluetoothGatt(23378): discoverServices() - device: 98:7B:F3:52:48:11
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=00001800-0000-1000-8000-00805f9b34fb
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=00001801-0000-1000-8000-00805f9b34fb
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=0000180a-0000-1000-8000-00805f9b34fb
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=f000aa00-0451-4000-b000-000000000000
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=f000aa60-0451-4000-b000-000000000000
08-22 20:59:15.193: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=f000ccc0-0451-4000-b000-000000000000

在上面的日志中,

08-22 20:59:11.288: D/BluetoothGatt(23378): discoverServices() - device: 98:7B:F3:52:48:11
08-22 20:59:15.188: D/BluetoothGatt(23378): onGetService() - Device=98:7B:F3:52:48:11 UUID=00001800-0000-1000-8000-00805f9b34fb

这大约需要 3~4 秒。

我想知道为什么这部分大约需要 3~4 秒。

4

2 回答 2

1

发现服务需要时间,因为蓝牙 GATT 协议有点糟糕,而且优化得非常糟糕。这是一个需要许多请求和响应的健谈协议。一个更好的主意是只请求“给我 GATT 结构”,然后 GATT 服务器用所有信息突发响应。

所需时间取决于外围设备的 GATT 服务器有多少服务、特征和描述符。它还取决于 UUID 是 16 位 UUID 还是 128 位 UUID。这与 Android 操作系统速度慢或类似无关。

较新的 Android 版本(如果我没记错的话,是 6 及更高版本)在 GATT 发现期间临时将连接间隔更改为 7.5 毫秒,以使其更快。

您可以检查 Android 设备上的 HCI 日志或使用空气嗅探器查看此发现过程。

有时使其更快的一个简单解决方法是外围设备在连接设置后请求更大的 MTU。

于 2018-08-23T08:34:45.653 回答
0

这是依赖于蓝牙框架的东西。所有蓝牙 LE 操作都是异步的并立即返回,但它们的功能是基于操作系统自己的内部调度执行的。通常开始扫描可能会很快开始,但在某些时候它可能会延迟,然后才会触发您的设备扫描回调。我通常会注意到在最近关闭电源或长时间处于空闲状态的设备上使用蓝牙功能时会出现延迟。通常在第一次扫描后,所有后续扫描都很快且反应灵敏。

我认为操作系统执行了一些省电操作并在内部关闭了蓝牙无线电(这只是推测,我没有进行任何测试来证明这一点)。

于 2018-08-22T12:34:02.340 回答