Android 4.0 蓝牙连接遇到的奇怪问题

移动开发 码拜 4年前 (2017-04-30) 1645次浏览
      大家好,本人最近在开发一个App和硬件交互的项目,但是在开发过程中遇到了很奇怪很棘手的问题,拿出来和大家说一下。
在连接时有这么一个情况,本人先打开app端的蓝牙搜索功能,然后在硬件关机状态下开机,app端设置扫描时间为30s,待app端扫描到硬件时,点击硬件建立连接,这时候底层会报一个133的错误,再去连接会一直报133的错误,退出app再去搜索连接依然还是133,但是重启系统蓝牙再去搜索连接好使。但是这个情况并不是在全部手机上都有,在三星Note4 手机上直接连上或开始会报133,但是再去连接依然会连接上,非三星手机 华为荣耀 7i,P9,小米4c等就和上述描述的情况一样需要重启蓝牙才能再次连接上。
最开始报133这个问题,查阅网上资料都说是没有执行gatt的close()方法,gatt对象的数量超过Android系统最大数量导致,于是本人在每次在重新连接前都执行disconnect()和close()方法,但是这样依然会出现上面的问题。这是说一下三星手机和非三星手机的重连方法,重连有两种一种是使用已有对象gatt.reconnect()方法,另一种是重新建立gatt对象,bluetoothDevice.connectGatt(this, false, mGattCallback)方法。对于三星手机本人使用第一种和第二种方法都好使,所以就使用了第一种。对于非三星手机,经本人测试和从网上查阅的资料看第一种方式连接成功的概率非常小,所以本人使用第二种方式,相当于重新建立一次蓝牙连接
对于133的问题打印的log日志如下:
D/BluetoothGatt: registerApp()
D/BluetoothGatt: registerApp() – UUID=ed47197c-722e-49de-a2b6-97b87579dd14
D/BluetoothGatt: onClientRegistered() – status=0 clientIf=8
D/BluetoothLeClass: Trying to create a new connection.
D/BluetoothGatt: onClientConnectionState() – status=133 clientIf=8 device=BE:EF:BE:EF:BA:E9
I/BluetoothLeClass: Disconnected from GATT server.

对于这种重启蓝牙能重新建立连接的这种方法,本人开始怀疑能否真的是在蓝牙建立连接过程中发生阻塞了,于是本人又用反射调用了gatt对象的refresh()方法,在执行close()之前执行,但是并没什么用。 最后本人再说下前提条件我们的硬件是没有问题的,ios端和电脑端蓝牙连接都是没有这个问题出现的。各位朋友,有什么想法或建议衷心希望您提出来,小弟非常感谢!

解决方案

30

虽然本人不知道原理,但是有几个操作可以让这种情况出现地少一点:
1.尽量不要在startLeScan的时候尝试连接,先stopLeScan后再去连
2.对同一设备断开后再次连接,哪怕调用完close,需要等待一段时间(400毫秒试了1次,结果不行;1000毫秒则再没出现过问题)后再去connectGatt
3.在gatt连接没断开前,是搜索不出该设备的
4.假如嫌关闭又打开蓝牙麻烦,可以在连接前startLeScan一下,成功率要高一点

10

在每次close前,先将BluetoothGatt  refresh一下,应该就可以了,这里的refresh只有通过反射的方式去执行,直接上代码:
/**
* 清理本地的BluetoothGatt 的缓存,以保证在蓝牙连接设备的时候,设备的服务、特征是最新的
* @param gatt
* @return
*/
public boolean refreshDeviceCache(BluetoothGatt gatt) {
if(null != gatt){
try {
BluetoothGatt localBluetoothGatt = gatt;
Method localMethod = localBluetoothGatt.getClass().getMethod( “refresh”, new Class[0]);
if (localMethod != null) {
boolean bool = ((Boolean) localMethod.invoke(
localBluetoothGatt, new Object[0])).booleanValue();
return bool;
}
} catch (Exception localException) {
localException.printStackTrace();
}
}
return false;
}

10

本人这里有个BLE的基础操作库,已经过实际项目验证,并没有出现过相似情况,你可以使用该库再试试能否会出现这种情况。
项目介绍:http://blog.csdn.net/xiaoyaoyou1212/article/details/52346904
项目地址:https://github.com/xiaoyaoyou1212/BLE

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Android 4.0 蓝牙连接遇到的奇怪问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)