android中重复连接ble设备导致的连接后直接返回STATE_DISCONNECTED的解决办法
* 通过使用if(gatt==null)来判断gatt是否被创建过,如果创建过就使用gatt.connect();重新建立连接。
* 但是在这种情况下测试的结果是重新连接需要花费很长的时间。
* 解决办法是通过gatt = device.connectGatt(this, false, gattCallback);建立一个新的连接对象,很明显这样的速度要比上一种方法快很多
* 然而,多次创建gatt连接对象的直接结果是创建过6个以上gatt后就会再也连接不上任何设备,原因应该是android中对BLE限制了同时连接的数量为6个
* 解决办法是在每一次重新连接时都执行一次gatt.close();关闭上一个连接。
* 有人说为什么不在gatt.disconnect();后加一条gatt.close();呢,原因是如果立即执行gatt.close();会导致gattCallback无法收到STATE_DISCONNECTED的状态。
* 当然,最好的办法是在gattCallback收到STATE_DISCONNECTED后再执行gatt.close();,这样逻辑上会更清析一些。
*/
很好的经验分享 谢谢
我觉得不是close没有执行的原因,当然你的解决方法(在每次connect前,检查是否已经有了Gatt对象,有了的话,就close,然后建立连接重新分配-这个方法)是没错的。真实的原因是每一次连接都会生成一个Gatt对象,每一个Gatt对象都需要断开连接,不然的话,一旦其中有一个Gatt对象没有断开连接,系统就会认为你是在连接的,让你连扫描都扫描不到这个设备,就别说继续连接了。。。。你的方法是正好保证了系统中只有一个Gatt对象,且把真实的(也就是最后的那个)给保存了起来,用于实际操作。而disconnect本身在这个算法里面就可以代替close。close和disconnect的区别在于,close除了断开连接外,还会释放掉所有资源,导致不可以直接在后面的操作中用gatt对象的connect直接连接,而disconnect并不释放资源,所以,所有的资源还保存着,就可以用Gatt的connect进行简单恢复连接,而不是在device那一层进行操作。至于为啥允许可以对一个外设连接多次,这个事情我也很纳闷,不知道什么场景需要这样的操作。。。
学习了
为什么要重复链接呢?什么应用场景?
楼主你好,按照您说的这种方式,我修改后还是会出现连接不上的现象,连回调函数都无法进入。
您好,楼主,我在开发的时候也遇到,出现的问题也一样,请问您解决了吗
这个贴子就是解决办法
感谢楼主分享,好东西
最近刚好遇上这个问题,回去试试。太感谢了。
楼主大大 求问个问题。ble callback STATE_DISCONNECTED 断开连接 我是直接断电的,但是回调需要20S求解。能不能 快点。
你使用哪个BLE模块?修改一下模块的连接参数试试