用户工具

站点工具


cc2640r2f:connect_params_update

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
cc2640r2f:connect_params_update [2017/08/31 16:30]
127.0.0.1 外部编辑
cc2640r2f:connect_params_update [2021/06/22 23:14] (当前版本)
行 1: 行 1:
 <markdown> <markdown>
-# BLE连接参数更新过程详解 # +# BLE 连接参数更新过程详解 # 
-有关连接参数概念和作用我们在 <a href="..\..\..\ble_stack_app\stack\gap\gap.html">Generic Access Profile (GAP)</a> 一章详细讲解,这一章演示如何通过修改simple_peripheral例程实现连接参数更新,并分析程序流程。+有关连接参数概念和作用在 <a href="http://docs.leconiot.com/doku.php?id=cc2640r2f:ble_stack_app:stack:gap:gap">Generic Access Profile (GAP)</a> 一章已详细讲解,这一章演示如何通过修改 simple_peripheral 例程实现连接参数更新,并分析程序流程。
  
  
 ## 介绍 ## ## 介绍 ##
-连接参数更新过程中都是主机发起的,从机只能被动接收主机设置的参数这个过程发生在连接的时候,当连接之后如果主机设置的参数不利于从机,从机可以发送请求,请求中包含需要的连接参数从机请求主机重新更新连接参数,主机可以拒绝如果主机同意修改连接参数,并且参数合理,则主机发起连接参数更新如果参数不合理(例如主机不支持过大或者过小的连接间隔),则主机会对参数进行协商,选择最合理的参数进行设置。由于从机发起连接参数更新请求的过程包含了主机发起连接参数更新的过程。本文以simple_peripheral工程为例,演示由从机发起连接参数更新请求的过程。+连接参数更新过程中都是主机发起的,从机只能被动接收主机设置的参数。 
 + 
 +这个过程发生在连接的时候,当连接之后如果主机设置的参数不利于从机,从机可以发送请求,请求中包含需要的连接参数。 
 +从机请求主机重新更新连接参数,主机可以拒绝如果主机同意修改连接参数,并且参数合理,则主机发起连接参数更新如果参数不合理(例如主机不支持过大或者过小的连接间隔),则主机会对参数进行协商,选择最合理的参数进行设置。 
 + 
 +从机发起连接参数更新请求的过程包含了主机发起连接参数更新的过程。本文以 simple_peripheral 工程为例,演示由从机发起连接参数更新请求的过程。
  
 ## 硬件环境 ## ## 硬件环境 ##
-使用USB连接<a href="..\..\..\leconiot\cc13x0_cc26x0_evaluation_board\cc13x0_cc26x0_evaluation_board.html">CC2640R2F Evaluation Board</a>确保跳线帽正确连接,如下图所示+使用 USB 连接 <a href="http://docs.leconiot.com/doku.php?id=cc2640r2f:leconiot:cc13x0_cc26x0_evaluation_board:cc13x0_cc26x0_evaluation_board"> CC2640R2F Evaluation Board </a>确保跳线帽正确连接,如下图所示
  
 ![](http://www.leconiot.com/md_res/cc2640r2f/ble_stack_app/app_examples/connect_params_update/image/picture.jpg) ![](http://www.leconiot.com/md_res/cc2640r2f/ble_stack_app/app_examples/connect_params_update/image/picture.jpg)
行 19: 行 24:
  
  
-协议栈和IAR安装以及我们工程编译参考<a href="..\..\..\get_started\development_environment_set_up\development_environment_set_up.html">CC2640R2 BLE 开发环境搭建</a> 编译参考 <a href="..\..\..\get_started\first_build\first_project_buid.html">编译第一个工程(simple_peripheral)</a>,有关BTool使用请参考<a href="..\..\..\tool_kits\btool\btool.html">BTool</a>。 有关Packet Sniffer使用请参考 <a href="..\..\..\tool_kits\packet_sniffer\packet_sniffer.html">Packet Sniffer </a>。所有工具可以在<a href="..\..\..\get_started\development_tools_kit\develpoment_tool_kits.html">CC2640R2开发工具集介绍</a>里获得。+协议栈和 IAR 安装以及工程编译参考<a href="http://docs.leconiot.com/doku.php?id=cc2640r2f:get_started:development_environment_set_up:development_environment_set_up"> CC2640R2 BLE 开发环境搭建 </a> 编译参考 <a href="http://docs.leconiot.com/doku.php?id=cc2640r2f:get_started:first_build:first_project_buid"> 编译第一个工程(simple_peripheral)</a>,有关 BTool 使用请参考<a href="http://docs.leconiot.com/doku.php?id=cc2640r2f:tool_kits:btool:btool"> BTool </a>。 有关 Packet Sniffer 使用请参考 <a href="http://docs.leconiot.com/doku.php?id=cc2640r2f:tool_kits:packet_sniffer:packet_sniffer"> Packet Sniffer </a>。所有工具可以在<a href="http://docs.leconiot.com/doku.php?id=cc2640r2f:get_started:development_tools_kit:develpoment_tool_kits"> CC2640R2开发工具集介绍 </a>里获得。
  
 ## 运行流程 ## ## 运行流程 ##
 +1. 在 simple_perpheral 中可以选择使用按键和定时器两种方式进行连接参数更新,本文使用定时器的方式进行连接参数更新,并且对定时器启动过程进行分析。
  
-1. 在simple_perpheral中可以选择使用按键和定时器的方式进行连接参数更新,这里我们使用定时器的方式进行连接参数更新,并且对定时器启动过程进行分析。 +在 peripheral.c 文件中,定义了 `startUpdateClock` 的结构体变量,`startUpdateClock` 作为连接参数更新的定时器事件句柄。 
-在peripheral.c文件中,定义了`startUpdateClock`的结构体变量,`startUpdateClock`作为连接参数更新的定时器事件句柄。在gapRole_init()中,可以找到其初始化过程**Util_constructClock(&startUpdateClock, gapRole_clockHandler,0, 0, false, START_CONN_UPDATE_EVT)**;  +在 gapRole_init() 中,可以找到其初始化过程** Util_constructClock (& startUpdateClock, gapRole_clockHandler,0, 0, false, START_CONN_UPDATE_EVT )**;  
-- 参数1: startUpdateClock表示定时器事件句柄。 +- 参数1: startUpdateClock 表示定时器事件句柄。 
-- 参数2: gapRole_clockHandler定时事件回调函数。+- 参数2: gapRole_clockHandler 定时事件回调函数。
 - 参数3: 定时器周期。 - 参数3: 定时器周期。
-- 参数4: 当该参数为0,则定时器执行一次,当该参数不为0,则周期性执行定时,周期值由该值确定。 +- 参数4: 当该参数为 0 ,则定时器执行一次,当该参数不为 0 ,则周期性执行定时,周期值由该值确定。 
-- 参数5: true表示立即执行,false表示等待。+- 参数5: true 表示立即执行,false 表示等待。
 - 参数6: 定时器回调参数。 - 参数6: 定时器回调参数。
-所以这里创建了一个周期为0,并且只执行一次的定时器,其中回调处理函数的参数是START_CONN_UPDATE_EVT事件。 
  
-2.在`gapRole_processGAPMsg`中,`GAP_LINK_ESTABLISHED_EVENT`事件的处理过程里面可以看+这里创建了一个周期为 0 ,并且只执行一次的定时器,其中回调处理函数的参数是 START_CONN_UPDATE_EVT 事件。 
 + 
 +2. 在 `gapRole_processGAPMsg` 中,`GAP_LINK_ESTABLISHED_EVENT` 事件的处理过程可以看到: 
 ````C ````C
 //source\ti\ble5stack\profiles\roles\cc26xx\peripheral.c  GAP_LINK_ESTABLISHED_EVENT Line 1195 //source\ti\ble5stack\profiles\roles\cc26xx\peripheral.c  GAP_LINK_ESTABLISHED_EVENT Line 1195
行 40: 行 48:
 Util_restartClock(&startUpdateClock, timeout*1000); Util_restartClock(&startUpdateClock, timeout*1000);
 ```` ````
-所以当一旦连接建立,就启动该定时器,这里`timeout`通过`GAP_GetParamValue`得到。在`SimpleBLEPeripheral_init`函数中,通过下面代码段已经设置了DEFAULT_CONN_PAUSE_PERIPHERAL值。+一旦连接建立,就启动该定时器`timeout` 通过 `GAP_GetParamValue` 得到。在 `SimpleBLEPeripheral_init` 函数中,下面代码段已经设置了DEFAULT_CONN_PAUSE_PERIPHERAL 值。
 ````C ````C
 //examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral.c DEFAULT_CONN_PAUSE_PERIPHERAL  Line 144 //examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral.c DEFAULT_CONN_PAUSE_PERIPHERAL  Line 144
行 47: 行 55:
 GAP_SetParamValue(TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL); GAP_SetParamValue(TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL);
 ```` ````
-当定时器时间到达后,调用下面回调函数,并传入初始化中设置的`START_CONN_UPDATE_EVT`参数,可以看出该回调函数仅发送了一个事件。+当定时器时间到达后,调用下面回调函数,并传入初始化中设置的 `START_CONN_UPDATE_EVT` 参数,可以看出该回调函数仅发送了一个事件。
 ````C ````C
 //source\ti\ble5stack\profiles\roles\cc26xx\peripheral.c  gapRole_clockHandler Line 1626 //source\ti\ble5stack\profiles\roles\cc26xx\peripheral.c  gapRole_clockHandler Line 1626
行 55: 行 63:
 } }
 ````` `````
-然后在`gapRole_taskFxn`函数中进行相应事件处理。这里调用`gapRole_startConnUpdate`函数进行连接参数更新。+然后在 `gapRole_taskFxn` 函数中进行相应事件处理调用 `gapRole_startConnUpdate`函数进行连接参数更新。
 ````C ````C
 //source\ti\ble5stack\profiles\roles\cc26xx\peripheral.c  gapRole_taskFxn Line 895 //source\ti\ble5stack\profiles\roles\cc26xx\peripheral.c  gapRole_taskFxn Line 895
行 65: 行 73:
  
 ```` ````
-在simple_peripheral.c中使用以下函数端对连接参数变量进行赋值。其中需要特别注意`DEFAULT_ENABLE_UPDATE_REQUEST`需要在其 定义处修改`GAPROLE_LINK_PARAM_UPDATE_INITIATE_BOTH_PARAMS`这样双方都可以启动连接参数更新过程。+最后在 simple_peripheral.c 中使用以下函数端对连接参数变量进行赋值。特别注意 `DEFAULT_ENABLE_UPDATE_REQUEST` 需要在其定义处修改为 `GAPROLE_LINK_PARAM_UPDATE_INITIATE_BOTH_PARAMS` 这样双方都可以启动连接参数更新过程。 
 ````C ````C
 //examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral.c enableUpdateRequest line 510 //examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral.c enableUpdateRequest line 510
行 74: 行 83:
 uint16_t desiredConnTimeout = DEFAULT_DESIRED_CONN_TIMEOUT; uint16_t desiredConnTimeout = DEFAULT_DESIRED_CONN_TIMEOUT;
 ```` ````
-3. 上述过程理解清楚后,我们就可以在`peripheral.c`文件中直接修改连接参数,在更新的时候使用我们自己设置的连接参数。+3. 上述过程理解清楚后,就可以在 `peripheral.c` 文件中直接修改连接参数,在更新的时候使用自己设置的连接参数。 
 ````C ````C
 //examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral.c DEFAULT_DESIRED_MAX_CONN_INTERVAL line 118 //examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral.c DEFAULT_DESIRED_MAX_CONN_INTERVAL line 118
行 82: 行 92:
 ```` ````
  
-下图是使用BTool建立连接之后等待6秒收到的数据。可以看出在连接的时候使用的是主机端设置的连接参数。ConnInterval=80,ConnLatency=0,ConnTimout=2000。建立连接6秒之后,启动连接参数更新,并且更新为设置的 ConnInterval=500,ConnLatency=1,ConnTimout=2500。+下图是使用 BTool 建立连接之后等待 6 秒收到的数据。可以看出在连接的时候使用的是主机端设置的连接参数。ConnInterval = 80 ,ConnLatency = 0 ,ConnTimout = 2000 。建立连接 6 秒之后,启动连接参数更新,并且更新为设置的 ConnInterval = 500 ,ConnLatency = 1 ,ConnTimout = 2500 。 
 ![](http://www.leconiot.com/md_res/cc2640r2f/ble_stack_app/app_examples/connect_params_update/image/BToolconnect.png) ![](http://www.leconiot.com/md_res/cc2640r2f/ble_stack_app/app_examples/connect_params_update/image/BToolconnect.png)
  
  
  
-下面我们使用Packet Sniffer抓包分析一下流程:如图示首先定时器时间到达之后,由从机向主机(S->M)发送连接参数更新请求命令,并携带更新参数值主机接收到之后有权利拒绝本次更新,这里主机返回0X0000(M->S),表示同意本次连接参数更新。后主机端会根据从机的参数进行一次协商,如果从机设置的参数不满足主机端设置的最大值或最小值,则主机会设置当前支持的最大值举个例子,如果这里我们把`DEFAULT_DESIRED_CONN_TIMEOUT`改成一个比较小的数值,主机端可能就不会使用我们设定的值而使用主机端所能支持的最小值。所以最后主机发送协商之后最终使用的连接参数(M->S)从机接收并更新后返回应答响应。+使用 Packet Sniffer 抓包分析一下流程: 
 +如图首先定时器时间到达之后,由从机向主机(S->M)发送连接参数更新请求命令,并携带更新参数值主机接收到之后有权利拒绝本次更新,如果主机返回 0X0000(M->S)表示同意本次连接参数更新。 
 +主机端会根据从机的参数进行一次协商,如果从机设置的参数不满足主机端设置的最大值或最小值,则主机会设置当前支持的最大值举个例子,如果把 `DEFAULT_DESIRED_CONN_TIMEOUT` 改成一个比较小的数值,主机端可能就不会使用我们设定的值而使用主机端所能支持的最小值。 
 +最后主机发送协商之后最终使用的连接参数(M->S)从机接收并更新后返回应答响应。 
 ```C ```C
 //source\ti\ble5stack\inc\l2cap.h L2CAP_CONN_PARAMS_ACCEPTED line 210 //source\ti\ble5stack\inc\l2cap.h L2CAP_CONN_PARAMS_ACCEPTED line 210
行 93: 行 108:
 #define L2CAP_CONN_PARAMS_REJECTED       0x0001 //!< Connection Parameters rejected #define L2CAP_CONN_PARAMS_REJECTED       0x0001 //!< Connection Parameters rejected
 ``` ```
 +
 ![](http://www.leconiot.com/md_res/cc2640r2f/ble_stack_app/app_examples/connect_params_update/image/Snifferconnect.png) ![](http://www.leconiot.com/md_res/cc2640r2f/ble_stack_app/app_examples/connect_params_update/image/Snifferconnect.png)
  
 下面是连接过程中,由主机直接发起的连接参数更新请求,可以看出如果是主机直接修改连接参数,只需要发送连接参数更新请求。从机返回响应之后即完成了连接参数更新。 下面是连接过程中,由主机直接发起的连接参数更新请求,可以看出如果是主机直接修改连接参数,只需要发送连接参数更新请求。从机返回响应之后即完成了连接参数更新。
 +
 ![](http://www.leconiot.com/md_res/cc2640r2f/ble_stack_app/app_examples/connect_params_update/image/SnifferconnectM.png) ![](http://www.leconiot.com/md_res/cc2640r2f/ble_stack_app/app_examples/connect_params_update/image/SnifferconnectM.png)
  
cc2640r2f/connect_params_update.1504168239.txt.gz · 最后更改: 2021/06/22 23:14 (外部编辑)