Android 6.0 Marshmallow BLE连接问题

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设备中出现此问题而在其他设备中没有,因为蓝牙共享缓存似乎是问题所在.那里到底存储了什么?刚刚连接/配对的设备?我是唯一一个遇到这个问题的人吗?如果没有,你们怎么解决它?我不想指导最终用户如何清除蓝牙共享应用数据.

Sta*_*Kou 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 上的蓝牙低功耗服务发现