可以通过以下两点加速蓝牙连接:
1、更新连接参数
interval:连接间隔(connection intervals ),范围在 7.5 毫秒 到 4 秒。
latency:连接延迟
。。。 还有一些其它参数.
 
Android API不提供具体的参数值, 只提供了三个常量:
CONNECTION_PRIORITY_HIGH
CONNECTION_PRIORITY_BALANCED
CONNECTION_PRIORITY_LOW_POWER
从Android的源码找到对应的参数:
在发起连接请求时,通过BluetoothGatt实例发起更新:
mBluetoothGatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH);
 
2、在请求连接时,设置自动连接标识为 false。
自动连接标识为true 时,虽然能提高连接成功的概率,但是会导致连接时间加长.
具体解释如下:
 
连接失败的问题
由于Android的蓝牙协议栈bluedroid 在低版本存在一些bug,如当连接的时候,callback 返回 status=133 的情况. 出现这种情况的原因应该手机APP频繁的操作连接以及断开。解决的方式可以参考以下几种:
1、当断开连接时,调用mBluetoothGatt.disconnect(); 该方式只是断开连接,并没有真正释放资源,可以在 disconnect 的回调里调用 mBluetoothGatt.close()
2、当连接同一台设备时,可通过判断地址是否一样,使用mBluetoothGatt.connect(); 但这方式似乎会导致连接放慢.
3、出现这种情况,delay 一会儿,然后再重连. 只能通过多次重连方式。
4、从google 回来的一些资料显示,当手机断开连接 mBluetoothGatt.disconnect(); 甚至是mBluetoothGatt.close()。 app蓝牙只是给蓝牙服务发送了一个断开连接,蓝牙服务是以队列的形式去处理它. 要彻底断开该连接,可以通过让对方设备(从设备)也主动断开。我尝试过这种方式,确实解决了我当前的问题.
 
connection fail 资料:
 
status=133, 对于状态的错误:GATT_ERROR
 
connections fail :
1)If your connections fail to happen, the BLE peripheral may be sending packets too slowly, or their signal level may be too low. This can be an issue with output power, range between the devices, interference, or other issues.
 
2)The BLE connection settings are some of the most critical parameters to understand in BLE. Connection interval, slave latency and other settings are sent upon during a connection, and they can tell you a lot about what the devices agree to. If you’re having connection problems, it can be that the two devices don’t agree on the parameters (and the central device disconnects).
 
 
另外可以查看一下Android源码 packages\apps\Bluetooth 目录下 bluetooth APP 的源码,看处理的方式.
 
 
BLE 连接过程:
 
 
注:图中M代表手机,S代表设备B,M->S表示手机将数据包发给设备B,即手机开启Tx窗口,设备B开启Rx窗口;S->M正好相反,表示设备B将数据包发给手机,即设备B开启Tx窗口,手机开启Rx窗口。
如图所示,手机在收到A1广播包ADV_IND后,以此为初始锚点(这个锚点不是连接的锚点),T_IFS后给Advertiser发送一个connection request命令,即A2数据包,告诉advertiser我将要过来连你,请做好准备。Advertiser根据connect_req命令信息做好接收准备,connect_req包含如下关键信息:
  • Transmit window offset,发送窗口偏移
  • Transmit window size, 发送窗口大小
  • connection interval  连接间隔
  • latency 从设备延迟
  • timeout 监控超时
.......
这些参数可以由主设备确定,也可以让从设备确定. 我们取了最优(也是最耗电的配置)
connection interval = 7.5ms
latency = 0
timeout = 4000ms
当主设备发起一个连接请求后(意思告诉从设备,我要连你, 要你做好准备), 在一个1.25ms时间单位, 加上发送窗口大小,发送窗口偏移时间后,发送一个空白给 从设备,并准备接收从设备的包,当接收到从设备的空包后,表示连接正式确立。我们可以理想大概这样计算连接时间:
 
time = 1.25ms + Transmit window offset + Transmit window size +  connection interval
 
连接成功后,master和slave在每一个connection interval开始的时候,都必须交互一次,即master给slave发一个包,slave再给master发一个包,整个交互过程称为一个connection event。
 
参考资料:BLE连接建立过程 http://www.mamicode.com/info-detail-2275982.html
 
 
其它资料:
Android BLE Issues:
开源框架 SweetBlue 对蓝牙问题的总结:
 
google bluetooth的问题列表:

蓝牙学习笔记二(Android连接问题)的更多相关文章

  1. Android Studio安卓学习笔记(二)Android项目结构

    上一篇代码,我们学习了Android的功能以及如何用Android Studio开发第一个安卓程序.下面就要介绍Android项目结构.为日后学习打基础. 一:Android项目结构 打开MyFris ...

  2. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  3. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  4. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  5. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  6. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  7. InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  8. CNN学习笔记:全连接层

    CNN学习笔记:全连接层 全连接层 全连接层在整个网络卷积神经网络中起到“分类器”的作用.如果说卷积层.池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样 ...

  9. kvm虚拟化学习笔记(二)之linux kvm虚拟机安装

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

随机推荐

  1. c#中partial 作用

    申明一下:我也是在百度上找的答案,然后合起来的,这样感觉好理解一点!partial是局部类型的意思就是说有这个关键字的类.结构或接口可以写成几个部分比如: public partial class P ...

  2. 安装并使用pt-ioprofile

    pt-ioprofile,是一个percona的性能分析工具,可以查看进程输出.输入,打印一些表文件及活动IO.pt-ioprofile是一个只读工具,所以对数据没风险.由于网上对pt-ioprofi ...

  3. Windows Server查看和记录远程登录信息的方法

    前两天我的一台Windows Server 2012R2的服务器中了传说中的cryptowall病毒,所有数据文件都被加密,需要我支付1个比特币才能解码.幸好服务器上没什么重要的文件,还好我没钱,我选 ...

  4. svn Please execute the 'Cleanup' command. 问题解决

    1由于使用svn 更新文件出错,导致svn中断,然后就一直循环出现  ‘’Please execute the 'Cleanup' command‘’ 问题: 查找网上方案 . 有使用sqlite3 ...

  5. Twain Capabilities 转

    转自:http://blog.csdn.net/pamxy/article/details/8629213 Asynchronous Device Events   异步设备事件 CAP_DEVICE ...

  6. 题解 P2920 【[USACO08NOV]时间管理Time Management】

    题面 作为一名忙碌的商人,约翰知道必须高效地安排他的时间.他有N工作要 做,比如给奶牛挤奶,清洗牛棚,修理栅栏之类的. 为了高效,列出了所有工作的清单.第i分工作需要T_i单位的时间来完成,而 且必须 ...

  7. SDN2017 第二次作业

    阅读文章<软件定义网络(SDN)研究进展>,并根据所阅读的文章,书写一篇博客,回答以下问题(至少3个): 1.为什么需要SDN?SDN特点? 2.SDN的基本思想? 3.ONF全称是什么, ...

  8. JavaScript利用Date实现简单的倒计时实例

    介绍 Date对象,是操作日期和时间的对象.Date对象对日期和时间的操作只能通过方法.Date在js中和Array类似,都是拥有自己的特殊方法的特殊对象. 创建 Date 对象的语法: var my ...

  9. HTML5音/视频标签详解

    一.发展历: 早期:<embed>+<object>+文件   问题:不是所有浏览器都支持,而且embed不是标准.   现状:Realplay.window media.Qu ...

  10. Win8下IIS的安装和站点的公布

    版权声明:本文为博主原创文章,不经博主同意注明链接就可以转载. https://blog.csdn.net/Senior_lee/article/details/32939411         之前 ...