GoR*_*RoS 12 android bluetooth bluetooth-lowenergy android-6.0-marshmallow
我遇到了Android 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
Run Code Online (Sandbox Code Playgroud)
如果我根据连接和断开应用程序与BLE外围设备进行一些压力测试,则成功率几乎不会达到50%.
阅读Android的最新文档,他们建议在connectGatt方法的最后一个参数中指定传输模式,以强制执行BLE传输连接而不是BR/EDR:
device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
Run Code Online (Sandbox Code Playgroud)
这种改进没有任何改变.
根据一些建议并阅读有关BLE连接问题的内容,我发现三星Galaxy S6存在一些相关问题,其中一个问题是他们提出了一系列修复BLE连接问题的步骤.关键的一个是清除蓝牙共享系统应用数据.这样做,连接率几乎立即增加了100%.但是,如果您等待并使用其他一些BLE应用程序并连接到其他外围设备,问题迟早会回来.
Google Play中有一些应用尝试修复这些BLE问题,他们基本上做的是:
/system/bin/rm -r /data/misc/bluetoothd/*
/system/bin/rm -r /data/misc/hcid/*
Run Code Online (Sandbox Code Playgroud)
虽然这是一种清除蓝牙缓存的方法,但它需要设备根植,这对专业应用来说不是一个合理的解决方案.
我研究的私有Android API都没有帮助我解决这个问题,我发现的唯一类似的是强制执行与问题无关的服务发现缓存清理.
使用BLE数据包嗅探器我发现ADV_CONNECT_REQ甚至没有从设备发送到外围设备,一段时间后Android堆栈触发STATE_DISCONNECTED事件BluetoothGattCallback.
我不知道为什么在某些6.0设备中出现此问题而在其他设备中没有,因为蓝牙共享缓存似乎是问题所在.那里到底存储了什么?刚刚连接/配对的设备?我是唯一一个遇到这个问题的人吗?如果没有,你们怎么解决它?我不想指导最终用户如何清除蓝牙共享应用数据.
有一个名为“removeBond”的隐藏方法。有时,ble设备无法明确断开,此时需要调用remove bond。
代码来自这里
//remove authrization
Method method = null;
try {
method = gatt.getDevice().getClass().getMethod("removeBond", (Class[]) null);
method.invoke(gatt.getDevice(), (Object[]) null);
} catch (Exception e) {
e.printStackTrace();
}
gatt.disconnect();
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用隐藏方法“刷新”刷新 GATT 服务。本来刷新方法是为了更新 gatt 服务,但在某些意外断开的情况下,您可能需要刷新才能正确连接您的 gatt 服务。
如何在不使用缓存的情况下以编程方式强制 Android 上的蓝牙低功耗服务发现
| 归档时间: |
|
| 查看次数: |
6150 次 |
| 最近记录: |