蓝牙服务器重启后 BLE 配对出现问题

Posted

技术标签:

【中文标题】蓝牙服务器重启后 BLE 配对出现问题【英文标题】:Problem with BLE pairing after BLuetooth server is restarted 【发布时间】:2020-10-15 12:44:21 【问题描述】:

我在使用低功耗蓝牙的两个 android 设备之间的连接(通过绑定)存在问题。在两台设备上,我都运行 Android 8.0。问题如下。 当我在两个设备之间建立连接时,一切正常,但在关闭 BLE 服务器(并再次打开它)后,我无法从客户端重新连接。到目前为止,唯一的方法是从客户端删除绑定信息。然而,这根本不舒服。有没有办法在不手动删除绑定的情况下重新建立连接?例如,从 BLE 协议重置一些标志或其他东西。另外,我有一个连接过程的简短输出:

1970-01-04 05:36:10.158 5254-5348/   D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6
1970-01-04 05:36:10.164 5254-5348/   D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=7C:92:B3:23:C0:19
1970-01-04 05:36:10.164 5254-5348/   I/info: ######## CURRENT BLE STATUS: 0 [DISCONNECTED]
1970-01-04 05:36:10.164 5254-5348/   I/info: ######## NEW BLE STATUS: 2 [CONNECTED]
1970-01-04 05:36:10.164 5254-5348/   D/BluetoothGatt: configureMTU() - device: 7C:92:B3:23:C0:19 mtu: 482
1970-01-04 05:36:10.238 5254-5348/   D/BluetoothGattServer: onConnectionUpdated() - Device=7C:92:B3:23:C0:19 interval=39 latency=0 timeout=500 status=42
1970-01-04 05:36:10.239 5254-5268/   D/BluetoothGatt: onConnectionUpdated() - Device=7C:92:B3:23:C0:19 interval=39 latency=0 timeout=500 status=42
1970-01-04 05:36:11.164 5254-5348/   D/BluetoothGatt: onConfigureMTU() - Device=7C:92:B3:23:C0:19 mtu=482 status=0
1970-01-04 05:36:11.165 5254-5348/   D/BluetoothGatt: requestConnectionPriority() - params: 1
1970-01-04 05:36:11.360 5254-5348/   D/BluetoothGattServer: onConnectionUpdated() - Device=7C:92:B3:23:C0:19 interval=39 latency=0 timeout=500 status=0
1970-01-04 05:36:11.361 5254-5268/   D/BluetoothGatt: onConnectionUpdated() - Device=7C:92:B3:23:C0:19 interval=39 latency=0 timeout=500 status=0
1970-01-04 05:36:11.793 5254-5348/   D/BluetoothGatt: onConnectionUpdated() - Device=7C:92:B3:23:C0:19 interval=12 latency=0 timeout=2000 status=0
1970-01-04 05:36:11.793 5254-5268/   D/BluetoothGattServer: onConnectionUpdated() - Device=7C:92:B3:23:C0:19 interval=12 latency=0 timeout=2000 status=0
1970-01-04 05:36:13.353 5254-5348/   D/BluetoothGattServer: onServerConnectionState() - status=0 serverIf=5 device=7C:92:B3:23:C0:19
1970-01-04 05:36:13.355 5254-5348/   D/BluetoothGatt: onClientConnectionState() - status=19 clientIf=6 device=7C:92:B3:23:C0:19
1970-01-04 05:36:13.356 5254-5348/   I/info: ######## CURRENT BLE STATUS: 19 [HID_DEVICE]
1970-01-04 05:36:13.356 5254-5348/   I/info: ######## NEW BLE STATUS: 0 [DISCONNECTED]
1970-01-04 05:36:13.356 5254-5348/   D/BluetoothGatt: close()

如您所见,客户端的初始状态为:DISCONNECTED。之后,他尝试连接,但几秒钟后断开连接。 任何想法为什么?

非常感谢!

【问题讨论】:

【参考方案1】:

我认为这是因为其中一个 Android 设备有一个标志表明它需要绑定,或者 GATT 表中的一个特性需要绑定(除非您专门调用 InitiatePairing 或 @987654322 @ 方法)。

您可以通过检查您的 Android 设备自动触发绑定的原因(即检查整个 GATT 表并确定是否存在需要身份验证的特定属性)或添加解决方法来解决此问题,以删除以编程方式绑定。后者可能是更快的方法,我已经看到它在多个场合完成。查看下面的链接以了解这是如何完成的:-

BLE Device Remove Bonding Automatically on Android Delete All Paired Bluetooth Devices on Android

我还推荐以下链接,这些链接描述了这一点以及 Android 上进一步的配对/绑定操作:-

Making Android BLE Work - Part 4 The Ultimate Guide to BLE on Android 4 Tips to Make Android BLE Work

【讨论】:

您好,感谢您的回答。实际上是的,我定义的一些特征需要结合。我还有一个调用 CreateBond() 方法的 BondListener。所以对于我的应用程序,绑定是必需的。正如我告诉你的,在客户端删除绑定后问题就解决了。但是,我不确定这个“解决方案”是否是最好的。 没问题,乐于助人。链接中的答案会按照您的要求以编程方式删除债券(因此您不必手动执行任何操作)。不幸的是,Android BLE 实现存在许多问题和限制,因此像这样的解决方法可能是唯一的解决方案。

以上是关于蓝牙服务器重启后 BLE 配对出现问题的主要内容,如果未能解决你的问题,请参考以下文章

ios 核心蓝牙与外部 BLE 设备配对

蓝牙配对 - HFP 配置文件和经典蓝牙/BLE

iOS 蓝牙与设备配对和取消配对

Android 蓝牙低功耗配对

配对蓝牙设备有优势吗?

iPad长时间待机之后,不重启就无法连接罗技蓝牙键盘,是怎么回事?