[经验] android中重复连接ble设备导致的连接后直接返回STATE_DISCONNECTED的解决办法

littleshrimp   2014-5-19 21:15 楼主
                        /*
                         * 通过使用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();,这样逻辑上会更清析一些。
                         */

回复评论 (11)

很好的经验分享 谢谢

加油!在电子行业默默贡献自己的力量!:)
点赞  2014-5-20 10:24
我觉得不是close没有执行的原因,当然你的解决方法(在每次connect前,检查是否已经有了Gatt对象,有了的话,就close,然后建立连接重新分配-这个方法)是没错的。真实的原因是每一次连接都会生成一个Gatt对象,每一个Gatt对象都需要断开连接,不然的话,一旦其中有一个Gatt对象没有断开连接,系统就会认为你是在连接的,让你连扫描都扫描不到这个设备,就别说继续连接了。。。。你的方法是正好保证了系统中只有一个Gatt对象,且把真实的(也就是最后的那个)给保存了起来,用于实际操作。而disconnect本身在这个算法里面就可以代替close。close和disconnect的区别在于,close除了断开连接外,还会释放掉所有资源,导致不可以直接在后面的操作中用gatt对象的connect直接连接,而disconnect并不释放资源,所以,所有的资源还保存着,就可以用Gatt的connect进行简单恢复连接,而不是在device那一层进行操作。至于为啥允许可以对一个外设连接多次,这个事情我也很纳闷,不知道什么场景需要这样的操作。。。 本帖最后由 huohou 于 2014-11-21 18:16 编辑
点赞  2014-11-21 18:14
学习了
点赞  2014-12-12 19:07
为什么要重复链接呢?什么应用场景?
点赞  2015-1-4 18:57
楼主你好,按照您说的这种方式,我修改后还是会出现连接不上的现象,连回调函数都无法进入。
点赞  2015-4-9 15:35
您好,楼主,我在开发的时候也遇到,出现的问题也一样,请问您解决了吗
点赞  2015-5-28 00:26
引用: cxlbbs 发表于 2015-5-28 00:26
您好,楼主,我在开发的时候也遇到,出现的问题也一样,请问您解决了吗

这个贴子就是解决办法
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2015-5-28 11:21
感谢楼主分享,好东西
点赞  2015-5-28 11:28
最近刚好遇上这个问题,回去试试。太感谢了。
点赞  2016-1-5 16:50
楼主大大 求问个问题。ble callback STATE_DISCONNECTED  断开连接  我是直接断电的,但是回调需要20S求解。能不能 快点。
点赞  2016-4-14 09:47
引用: xubin3060 发表于 2016-4-14 09:47
楼主大大 求问个问题。ble callback STATE_DISCONNECTED  断开连接  我是直接断电的,但是回调需要20S求解 ...

你使用哪个BLE模块?修改一下模块的连接参数试试
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2016-4-14 09:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复