我在使用安卓6.0的时候,发现了一些严重的与蓝牙低功耗有关的问题。其中一个冲突设备就是这个:
DEVICE INFO:
Name: Samsung Galaxy SV
Model number: SM-G900V
Android vers: 6.0.1
Patch level: May 1, 2016
Hard. vers: G900V.05
如果我基于连接和断开应用程序与BLE外设进行一些压力测试,成功率几乎只有50%。
阅读Android的最新文档,他们建议在connectGatt方法的最后一个参数中指定传输模式,以强制执行BLE传输连接而不是BR / EDR:
device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
这项改进没有任何变化。
在遵循一些建议并阅读有关BLE连接问题的文章后,我发现三星Galaxy S6存在几个相关问题,在其中一个中,他们建议采取一系列步骤来解决BLE连接问题。 其中关键步骤是清除蓝牙共享系统应用程序数据。 这样做,连接成功率几乎立即增加了近100%。 但是,如果您等待并使用其他BLE应用程序并连接到其他外围设备,则问题迟早会重新出现。
在Google Play中有一些应用程序尝试修复这些BLE问题,它们基本上所做的是:
/system/bin/rm -r /data/misc/bluetoothd/*
/system/bin/rm -r /data/misc/hcid/*
尽管这是清除蓝牙缓存的一种方法,但它需要设备被root,这对于专业应用来说并不是一个合理的解决方案。我研究过的私有Android API都无法帮助我解决这个问题,唯一类似的是强制服务发现缓存清理,但与该问题无关。
使用BLE数据包嗅探器,我发现设备甚至没有发送
ADV_CONNECT_REQ
到周边设备,一段时间后,Android堆栈在BluetoothGattCallback
中触发了STATE_DISCONNECTED
事件。我不知道为什么某些6.0设备会出现这个问题,而其他设备则不会,因为蓝牙共享缓存似乎是问题所在。那里到底存储了什么?只是之前连接/配对的设备吗?我是唯一遇到这个问题的人吗?如果不是,你们怎么解决的?我不想指导最终用户如何清除蓝牙共享应用程序数据。