我开发了一个使用ble的应用程序。我当时使用Eclipse作为开发工具。
我的“使用ble的应用”已安装在我的智能手机上。然后将智能手机和PC连接到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秒钟。
答案 0 :(得分:0)
这取决于蓝牙框架。所有Bluetooth LE动作都是异步的,并且立即返回,但是它们的功能是根据OS自己的内部调度执行的。通常,开始扫描可能会非常快速地开始,但是在启动设备扫描的回调之前,可能会延迟某些时间。我通常注意到在最近断电或长时间闲置的设备上使用蓝牙功能时会出现延迟。通常,在第一次扫描后,所有后续扫描都是快速且响应迅速的。
我认为操作系统执行了一些节电操作,并在内部关闭了蓝牙无线电(这只是推测,我还没有进行任何测试来证明这一点。)
答案 1 :(得分:0)
发现服务需要时间,因为蓝牙GATT协议很糟糕,并且优化很差。这是一个闲聊协议,需要许多请求和响应。更好的主意是只请求“给我GATT结构”,然后GATT服务器以突发方式响应所有信息。
所花费的时间取决于外围设备的GATT服务器具有多少服务,特征和描述符。它还取决于UUID是16位UUID还是128位UUID。与此无关的是,Android操作系统运行缓慢或类似。
在GATT发现期间,较新的Android版本(如果我没记错的话,为6及更高版本)会临时将连接间隔更改为7.5 ms,只是为了使其更快。
您可以在Android设备上检查HCI日志,也可以使用空气嗅探器查看该发现过程。
有时可以使其更快的一个简单解决方法是,在建立连接后,外围设备请求更大的MTU。