发新帖我要提问
12
返回列表
[蓝牙]

低功耗蓝牙BLE之连接事件、连接参数和更新方法

[复制链接]
楼主: nawu
手机看帖
扫描二维码
随时随地手机跟帖
nawu|  楼主 | 2019-7-10 10:45 | 显示全部楼层
第二种方法在使用的时候有可能碰到一种情况,就是我们只想修改某一个或者某两个连接参数,剩下的参数想保持原有的,这样的话,我们需要在修改连接参数之前先去读取连接参数,然后将需要修改的参数进行重新设置即可,读取连接参数的代码如下:

uint16 interval;
uint16 latency;
uint16 timeout;
GAPRole_GetParameter(GAPROLE_CONN_INTERVAL, &interval);
GAPRole_GetParameter(GAPROLE_CONN_LATENCY, &latency);
GAPRole_GetParameter(GAPROLE_CONN_TIMEOUT, &timeout);

使用特权

评论回复
nawu|  楼主 | 2019-7-10 10:45 | 显示全部楼层
下面我们通过一个实例来具体了解下连接参数修改的方法,需求是将连接间隔修改为25,从机延迟修改为8,超时时间不修改,更新失败后重新发送参数更新请求,本实例中主设备是安卓设备,从设备是CC2541。代码实现如下:

uint16 interval;
uint16 latency;
uint16 timeout;

GAPRole_GetParameter(GAPROLE_CONN_INTERVAL, &interval);
GAPRole_GetParameter(GAPROLE_CONN_LATENCY, &latency);
GAPRole_GetParameter(GAPROLE_CONN_TIMEOUT, &timeout);
       
GAPRole_SendUpdateParam( 25, 25, 8, timeout, GAPROLE_RESEND_PARAM_UPDATE);

使用特权

评论回复
nawu|  楼主 | 2019-7-10 10:46 | 显示全部楼层

该过程抓包显示如下:




从抓到的包中我们看到首先是S->M,即从设备发送连接参数更新请求,请求中带有申请的连接参数,然后M->S,即主设备返回连接参数更新响应,Result为0,表示同意修改更新。最后M->S发送Data type为Control的链路层连接参数更新控制规程,携带同意的连接参数,这样,新的连接参数就会投入使用。


使用特权

评论回复
nawu|  楼主 | 2019-7-10 11:29 | 显示全部楼层
注意修改连接参数的时候要满足一定的要求:

1.安卓设备作主设备时,连接参数满足的要求见本篇博文第二节“连接参数介绍”中提到的内容。另外实际开发过程中发现安卓设备作主设备时存在一个问题,就是部分安卓设备连接BLE设备之后,只能进行一次连接参数的修改。



2. 苹果系统设备作主设备时,连接参数更新的要求比较苛刻,如下:



Interval Max * (Slave Latency + 1) ≤ 2 seconds

Interval Min ≥ 20 ms

Interval Min + 20 ms ≤ Interval Max

Slave Latency ≤ 4

connSupervisionTimeout ≤ 6 seconds

Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout



即:



最大连接间隔时间 *(从机延迟 + 1) ≤ 2s

最小连接间隔时间 ≥ 20 ms

最小连接间隔时间 + 20 ms ≤ 最大连接间隔时间

从机延迟 ≤ 4

超时时间 ≤ 6s

最大连接间隔时间 *(从机延迟 + 1)* 3  < 超时时间



所以如果你的BLE从设备需要被IOS主设备连接,那你的BLE从设备的默认申请的连接参数一定要满足上述要求,并且连接过程中修改连接参数的时候也要满足上述要求。


使用特权

评论回复
dirtwillfly| | 2019-7-13 21:34 | 显示全部楼层
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则