一、本节简介
本节介绍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
答:
•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
答:
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);
②抓包
上图可知,从机先向主机申请参数更新,主机应答允许,随后从机将更新数据发送给主机。
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,也是可以的。
最优值还是需要各位自行测试。