连接间隔
就是两个连接事件之间的时间间隔,连接间隔以1.25为单位,连接间隔的值为6(7.5ms)~3200(4s).不同的应用可能要求不同的时间间隔。长的时间间隔的优势是显著地节省功耗,因为设备可以在连接事件之间有较长时间的休眠,坏处是当设备有应用数据需要发送时,必须要等到下一个连接事件;短的时间间隔优势是两设备连接频发,可以更快地收发数据,不利之处是设备因连接事件的到来而被频繁的唤醒,会有较多功耗.
在实际应用的时候,有时候需要发送数据快一点,这个时候我们可以把连接间隔改小一点,这样发送数据快,但是功耗大,当把数据发完的时候,可把连接间隔改小一点,这样可以降低功耗,达到一个均衡.比如穿戴设备连接上的时候,可能需要快速把本地数据发给手机,这个时候就可以把连接间隔设置小点。传送完毕后间隔设置大点。这样功耗就不会太大。
这个间隔 是指成功连接后 的周期性通讯时间,主机会根据使用情况 在 这个取值范围内 选择合适的 间隔时间,这个具体值是不可控的,所以需要划定一个范围使得通讯响应在自己的可控范围之内。这个具体值会影响到下一次通讯数据包的响应时间,需要根据自己的情况来调整这个范围达到 既省电又匹配程序响应速度 的目的。
比如:
大数据传递时:通讯数据包是连续传递的,主机会选择min值来进行通讯。
无数据传递时:通讯是空闲状态,主机会选择max值来定期询问从机状态,以保持连接不中断。(在空闲时,由于使用max的值作为通讯周期,会影响到程序的下一个命令的发送时间)
2
有阅读蓝牙协议栈和一些材料,简单的说就是主机决定连接参数的值( connection interval, slave latency, timeout),从机可以请求更新这些参数,主机决定是不是接受,接受的值是多少。所以是会出现手机接受参数后和从机请求的参数有偏差,或者甚至是拒绝(ios)。
这里不得不提到:android 和 ios 的ble开发与兼容不是一个等级。
相同点:android 和 ios 都是在手机和设备建立连接时就会默认设置这些参数,app开发是无法修改这些参数的,这些默认参数由手机厂商决定。
不同点:当产品基于功耗等的考虑是应该要修改这些参数的,都是由从机提出更新申请,ios 有保护机制当从机给的参数超过它的范围它会拒绝这些不合理参数,然后使用默认值。而android 目前(4.3 4.4)是都会接受从机的更新参数,即使不合理。这里就会照成一种 设备通信 ios可以 android出问题 而且android即使接受参数并且使用这些参数更新后还会出现和参数不和的现象,典型的就在这个timeOut上,是会比更新请求里的timeOut长而且不同手机长的时间不一样。ios 好像是长5秒
举例:
gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; // 0.5sec 连接间隔时间,指定一个最大值和最小值,以供Master 建立连接
gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;// 1sec ,连接间隔时间,1.25毫秒的倍数,7.5ms~4s之间
gap_conn_params.slave_latency = SLAVE_LATENCY;// 从机潜伏,允许设备跳过的最大连接次数,为0,能快速收到Master发送过来的数据
gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT;// 监督超时时间,超时没有收到数据则认为连接断开