【CC2640R2F】香瓜CC2640R2F之连接参数

本文最后修改时间:2017年12月15日 03:10

 

一、本节简介

本节介绍CC2640R2F的连接参数相关知识


二、实验平台

1)CC2640R2F平台

①协议栈版本:CC2640R2 SDK v1.40.00.45

②编译软件:CCS7.3.0.00019

③硬件平台:香瓜CC2640R2F开发板

④仿真器:香瓜XDS100V3下载器

2)手机平台
①手机型号:红米1S
②安卓版本:安卓4.3
③安卓app:BLE Reader


三、版权声明

1)作者:甜甜的大香瓜

2)声明:喝水不忘挖井人,转载请注明出处。

3)纠错/业务合作:[email protected]

4)香瓜BLE之CC2640R2F群:557278427

5)本文出处:原创连载资料《简单粗暴学蓝牙5》

6)完整开源资料下载地址(电脑端打开):

https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

7)香瓜CC2640R2F开发板购买链接:

https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4023-16963296339.8.21bfc58419sWKt&id=558653143169

8)香瓜XDS100V3下载器购买链接:

https://item.taobao.com/item.htm?spm=a230r.1.14.1.1d150040zvJBco&id=558356989143&ns=1&abbucket=6#detail


四、实验前提

1、在进行本文步骤前,请先阅读以下章节:

1)《简单粗暴学蓝牙5》的“第一章至第四章”章节​。

2)《低功耗蓝牙开发权威指南》的“9.4.2 连接参数更新请求和响应”章节。


2、在进行本文步骤前,请先实现以下章节:

暂无


五、基础知识

1、连接参数是什么?

答:连接参数用于规定主从机数据通信时间,包含最小连接间隔、最大连接间隔等参数,如果连接参数设置不合理,就会导致连接断开。

CC2640R2F端的SimpleBLEPeripheral工程默认的连接参数如下:

#ifndef FEATURE_OAD
// Minimum connection interval (units of 1.25ms, 80=100ms) for automatic
// parameter update request
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL     80        //最小连接间隔 

// Maximum connection interval (units of 1.25ms, 800=1000ms) for automatic
// parameter update request
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL     800       //最大连接间隔  

#else // FEATURE_OAD
// Increase the the connection interval to allow for higher throughput for OAD

// Minimum connection interval (units of 1.25ms, 8=10ms) for automatic
// parameter update request
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL     8

// Maximum connection interval (units of 1.25ms, 8=10ms) for automatic
// parameter update request
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL     8
#endif // FEATURE_OAD

// Slave latency to use for automatic parameter update request
#define DEFAULT_DESIRED_SLAVE_LATENCY         0         //可忽略连接间隔的次数,默认是不忽略 

// Supervision timeout value (units of 10ms, 1000=10s) for automatic parameter
// update request
#define DEFAULT_DESIRED_CONN_TIMEOUT          1000      //连接超时时间,连接IOS时此参数必须小于6S

// After the connection is formed, the peripheral waits until the central
// device asks for its preferred connection parameters
#define DEFAULT_ENABLE_UPDATE_REQUEST         GAPROLE_LINK_PARAM_UPDATE_WAIT_REMOTE_PARAMS

// Connection Pause Peripheral time value (in seconds)
#define DEFAULT_CONN_PAUSE_PERIPHERAL         6         //有时当从机断开连接时,主机端过10S才会断开,此时将此数值改小可让主机快速发现断开连接 

2、连接参数更新过程是如何?

答:主从机连接时,首先使用的是主机端默认的连接参数。

1)如果从机端禁止参数更新,则之后的通信都将使用主机端默认的连接参数。

2)如果从机端允许参数更新,则在主从机连接的几秒后(比如DEFAULT_CONN_PAUSE_PERIPHERAL为6,则表示6S后),从机会向主机端发送连接参数更新请求。

①如果从机的连接参数符合主机端的连接标准,则更新参数;

②如果从机的连接参数不符合主机端的连接标准,则不更新参数。如果此时使用的主机参数,不在从机申请的参数范围内,则会造成连接断开。


3、为何有时主机读取从机的特征值需要2S的时间?

答:因为连接参数中的连接超时时间过长,可以作如下修改:

// Supervision timeout value (units of 10ms, 1000=10s) for automatic parameter
// update request
#define DEFAULT_DESIRED_CONN_TIMEOUT          100//1000      //连接超时时间,连接IOS时此参数必须小于6S

4、IOS端的连接参数有何具体要求?

答:

•Interval Max * (Slave Latency + 1) <= 2 s
•Interval Min >= 20 ms
•Interval Min + 20 ms <= Interval Max
•Slave Latency <= 4
•ConnSupervisionTimeout <= 6 s
•Interval Max * ( Slave Latency + 1) * 3 < ConnSupervisionTimeout
根据上述要求,要特别注意的是下面两点:

1、最大连接间隔要比最小连接间隔大20ms。

2、连接超时参数需要小于6S。(从机工程默认的连接参数是不符合IOS的连接参数要求的,因此默认连接参数会导致连接参数更新失败)

3、IOS的默认连接参数是30ms。


5、如果从机申请更新参数失败了,会执行什么操作?
答:
GAPRole_SendUpdateParam函数中的最后一个形参,即是更新参数失败后的执行操作。
它一共有3个选项(无动作、重发、断开连接):

#define GAPROLE_NO_ACTION                    0 //!< Take no action upon unsuccessful parameter updates
#define GAPROLE_RESEND_PARAM_UPDATE          1 //!< Continue to resend request until successful update
#define GAPROLE_TERMINATE_LINK               2 //!< Terminate link upon unsuccessful parameter updates

6、CC2640R2F主机如何直接更新参数?CC2640R2F从机如何申请参数更新?

答:

1)CC2640R2F主机直接更新参数

           // Connection update
          GAPCentralRole_UpdateLink(connHandle,
                                    DEFAULT_UPDATE_MIN_CONN_INTERVAL,
                                    DEFAULT_UPDATE_MAX_CONN_INTERVAL,
                                    DEFAULT_UPDATE_SLAVE_LATENCY,
                                    DEFAULT_UPDATE_CONN_TIMEOUT);
2) CC2640R2F从机申请参数更新

①使用举例

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); 
②抓包
【CC2640R2F】香瓜CC2640R2F之连接参数_第1张图片

上图可知,从机先向主机申请参数更新,主机应答允许,随后从机将更新数据发送给主机。


7、为什么同一个模块与不同手机连接,有的手机连接正常,而有的手机会连接断开?

答:因为各个手机厂商修改了手机中的蓝牙连接参数。

假设小米4S的连接参数范围为10ms~200ms,而华为p10的连接参数范围为20ms~300ms。

而此时你手上的模块作为从机申请的连接参数范围为7.5ms~10ms。

此时就会是小米4S能支持10ms的连接参数,而华为p10则无法支持此参数造成蓝牙连接断开。

所以,解决这个兼容性的办法:调整模块的连接参数范围,例如调整到7.5ms~20ms。


8、假设从机申请的连接参数范围是10ms~30ms,那么主机会选择哪个数值作为连接参数?

答:主机有决定参数的权利,10ms~30ms之间都是有可能的。

据群友反馈安卓一般会选择可选择范围的最大值,也就是30ms。

实际情况与机型有关,应抓包查看。


9、假设从机申请的连接参数范围是10ms~30ms,从机端发送数据的速率多少合适?

答:由于最终连接参数与主机有关,所以10ms~30ms都是有可能的连接参数。

所以为了保证兼容性,应在协议栈中启动一个30ms的定时器,每30ms发送一次数据。

这样应用层每30ms写入的数据,会被协议栈储存起来,然后每10~30ms的连接间隔发送一次。不会造成阻塞。


10、从机的更新参数申请,在什么时候发送最合适?

答:更新参数的申请可以在连接中的任意时间端发送,但是由于连接初始时有大量的设备信息需要交互,所以连接一开始不适合将连接间隔增大,这样只会让设备信息交互的时间更久。

所以在设备信息交互的过程之后,再进行更新参数申请是比较合适的。

从机协议栈默认是在连接6S之后才发出更新参数申请(DEFAULT_CONN_PAUSE_PERIPHERAL为6),可以根据项目情况适当缩小这个数值,有的群友使用1S,也是可以的。

最优值还是需要各位自行测试。




你可能感兴趣的:(【CC2640R2F】香瓜CC2640R2F之连接参数)