【发布时间】:2014-04-15 06:59:44
【问题描述】:
我们正在执行以下过程来与 BLE 设备配对。
Connect() + discoverServices() + Pairing(Bonding)。
有时 Android 操作系统会以一种奇怪的方式取消配对我们的 BT 设备,即:
- 不发送绑定状态已更改的广播通知
- 甚至系统蓝牙设置应用程序都认为设备仍然配对
- 只有 bt 重启(通过设置应用关闭和打开)刷新状态并显示设备不再配对
设备配对成功后,ACTION_BOND_STATE 的变化如下。
[6:19:28 PM] Himen Patel:04-09 18:18:27.325:D/BluetoothGatt(8380):onCharacteristicWrite() - Device=C2:69:E9:57:93:A4 UUID=860b2c07 -e3c5-11e2-a28f-0800200c9a66 状态=5 04-09 18:18:27.365:E/millisUntilFinished(8380):millisUntilFinished = 15 04-09 18:18:28.105: E/BelwithDeviceActor(8380): 键状态更改为:C2:69:E9:57:93:A4 新状态:11 以前:10
04-09 18:18:28.105:E/millisUntilFinished(8380):millisUntilFinished = 20 04-09 18:18:29.135:E/millisUntilFinished(8380):millisUntilFinished = 18 04-09 18:18:30.135:E/millisUntilFinished(8380):millisUntilFinished = 17 04-09 18:18:31.145:E/millisUntilFinished(8380):millisUntilFinished = 16 04-09 18:18:32.145:E/millisUntilFinished(8380):millisUntilFinished = 15
04-09 18:18:33.105: D/BluetoothGatt(8380): onCharacteristicWrite() - 设备=C2:69:E9:57:93:A4 UUID=032a0000-0000-0000-0000-000000000000 状态=137 04-09 18:18:33.115:E/BelwithDeviceActor(8380):键状态更改为:C2:69:E9:57:93:A4 新状态:12 以前:11
04-09 18:18:33.115: I/System.out(8380): unregisterReceiver true
现在,当操作系统以奇怪的方式删除配对时,ACTION_BOND_STATE 会发生如下变化。 . . . . 键状态更改为:C2:69:E9:57:93:A4 新状态:10。
在我们的 APP 中,我们还会收到 act=android.bluetooth.device.action.ACL_DISCONNECTED flg=0x4000010 的即时事件。
这里重要的是,此时我们只是失去了与设备的配对,受保护的特性不再对我们起作用。 如果我们使用系统设置 app 或 BluetoothAdapter::disable() 和 enable() 重新启动 bt,我们可以看到我们没有与设备配对。
有趣的是,不重启bt,系统设置应用仍然认为并显示我们与设备配对。
测试了运行 4.4.2 的 nexus 4、运行 4.4.2 的 nexus 5 甚至运行 4.3 的三星 Galaxy s4。
我们的期望是:
- 在取消配对的情况下应该有系统广播
- 系统偏好设置应用程序应该显示当前的配对状态,即使没有 bt 重启
我们还观察并获得了嗅探数据,我们发现当我们的绑定被操作系统以奇怪的方式删除时,我们的加密设置为 0x000000。
【问题讨论】:
-
Android 错误跟踪器中有一个错误,您应该可以搜索它。
-
我在装有 kit kat 4.4.3 的 Moto G 中也遇到了这个问题,您是否找到了解决此问题的方法?
标签: android bluetooth bluetooth-lowenergy