这里会显示出您选择的修订版和当前版本之间的差别。
cc2640r2f:connect_params_update [2017/08/31 16:30] 127.0.0.1 外部编辑 |
cc2640r2f:connect_params_update [2021/06/22 23:14] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | < | ||
- | # BLE连接参数更新过程详解 # | ||
- | 有关连接参数概念和作用我们在 <a href=" | ||
- | |||
- | |||
- | ## 介绍 ## | ||
- | 连接参数更新过程中都是主机发起的,从机只能被动的接收主机设置的参数,这个过程发生在连接的时候,当连接之后如果主机设置的参数不利于从机,从机可以发送请求,请求中包含需要的连接参数,从机请求主机重新更新连接参数,主机可以拒绝,如果主机同意修改连接参数,并且参数合理,则主机发起连接参数更新,如果参数不合理(例如主机不支持过大或者过小的连接间隔),则主机会对参数进行协商,选择最合理的参数进行设置。由于从机发起连接参数更新请求的过程包含了主机发起连接参数更新的过程。本文以simple_peripheral工程为例,演示由从机发起连接参数更新请求的过程。 | ||
- | |||
- | ## 硬件环境 ## | ||
- | 使用USB连接< | ||
- | |||
- | ![](http:// | ||
- | |||
- | ## 软件环境 ## | ||
- | - IAR Embedded workbench 7.80.3 | ||
- | - BLE-STACK V3.0.1 | ||
- | - Packet Sniffer | ||
- | - BTool | ||
- | |||
- | |||
- | 协议栈和IAR安装以及我们工程编译参考< | ||
- | |||
- | ## 运行流程 ## | ||
- | |||
- | 1. 在simple_perpheral中可以选择使用按键和定时器的方式进行连接参数更新,这里我们使用定时器的方式进行连接参数更新,并且对定时器启动过程进行分析。 | ||
- | 在peripheral.c文件中,定义了`startUpdateClock`的结构体变量,`startUpdateClock`作为连接参数更新的定时器事件句柄。在gapRole_init()中,可以找到其初始化过程。**Util_constructClock(& | ||
- | - 参数1: startUpdateClock表示定时器事件句柄。 | ||
- | - 参数2: gapRole_clockHandler定时事件回调函数。 | ||
- | - 参数3: 定时器周期。 | ||
- | - 参数4: 当该参数为0,则定时器执行一次,当该参数不为0,则周期性执行定时,周期值由该值确定。 | ||
- | - 参数5: true表示立即执行,false表示等待。 | ||
- | - 参数6: 定时器回调参数。 | ||
- | 所以这里创建了一个周期为0,并且只执行一次的定时器,其中回调处理函数的参数是START_CONN_UPDATE_EVT事件。 | ||
- | |||
- | 2.在`gapRole_processGAPMsg`中,`GAP_LINK_ESTABLISHED_EVENT`事件的处理过程里面可以看见 | ||
- | ````C | ||
- | // | ||
- | uint16_t timeout = GAP_GetParamValue(TGAP_CONN_PAUSE_PERIPHERAL); | ||
- | |||
- | Util_restartClock(& | ||
- | ```` | ||
- | 所以当一旦连接建立,就启动该定时器,这里`timeout`通过`GAP_GetParamValue`得到。在`SimpleBLEPeripheral_init`函数中,通过下面代码段已经设置了DEFAULT_CONN_PAUSE_PERIPHERAL值。 | ||
- | ````C | ||
- | // | ||
- | // Connection Pause Peripheral time value (in seconds) | ||
- | #define DEFAULT_CONN_PAUSE_PERIPHERAL | ||
- | GAP_SetParamValue(TGAP_CONN_PAUSE_PERIPHERAL, | ||
- | ```` | ||
- | 当定时器时间到达后,调用下面回调函数,并传入初始化中设置的`START_CONN_UPDATE_EVT`参数,可以看出,该回调函数仅发送了一个事件。 | ||
- | ````C | ||
- | // | ||
- | void gapRole_clockHandler(UArg a0) | ||
- | { | ||
- | gapRole_setEvent(a0); | ||
- | } | ||
- | ````` | ||
- | 然后在`gapRole_taskFxn`函数中进行相应事件处理。这里调用`gapRole_startConnUpdate`函数进行连接参数更新。 | ||
- | ````C | ||
- | // | ||
- | if (events & START_CONN_UPDATE_EVT) | ||
- | { | ||
- | // Start connection update procedure | ||
- | gapRole_startConnUpdate(GAPROLE_NO_ACTION, | ||
- | } | ||
- | |||
- | ```` | ||
- | 而在simple_peripheral.c中使用以下函数端对连接参数变量进行赋值。其中需要特别注意`DEFAULT_ENABLE_UPDATE_REQUEST`。需要在其 定义处修改成`GAPROLE_LINK_PARAM_UPDATE_INITIATE_BOTH_PARAMS`。这样双方都可以启动连接参数更新过程。 | ||
- | ````C | ||
- | // | ||
- | uint8_t enableUpdateRequest = DEFAULT_ENABLE_UPDATE_REQUEST; | ||
- | uint16_t desiredMinInterval = DEFAULT_DESIRED_MIN_CONN_INTERVAL; | ||
- | uint16_t desiredMaxInterval = DEFAULT_DESIRED_MAX_CONN_INTERVAL; | ||
- | uint16_t desiredSlaveLatency = DEFAULT_DESIRED_SLAVE_LATENCY; | ||
- | uint16_t desiredConnTimeout = DEFAULT_DESIRED_CONN_TIMEOUT; | ||
- | ```` | ||
- | 3. 上述过程理解清楚后,我们就可以在`peripheral.c`文件中直接修改连接参数,在更新的时候使用我们自己设置的连接参数。 | ||
- | ````C | ||
- | // | ||
- | #define DEFAULT_DESIRED_MAX_CONN_INTERVAL | ||
- | #define DEFAULT_DESIRED_CONN_TIMEOUT | ||
- | #define DEFAULT_DESIRED_SLAVE_LATENCY | ||
- | ```` | ||
- | |||
- | 下图是使用BTool建立连接之后等待6秒收到的数据。可以看出在连接的时候使用的是主机端设置的连接参数。ConnInterval=80,ConnLatency=0,ConnTimout=2000。建立连接6秒之后,启动连接参数更新,并且更新为设置的 ConnInterval=500,ConnLatency=1,ConnTimout=2500。 | ||
- | ![](http:// | ||
- | |||
- | |||
- | |||
- | 下面我们使用Packet Sniffer抓包分析一下流程:如图示首先定时器时间到达之后,由从机向主机(S-> | ||
- | ```C | ||
- | // | ||
- | #define L2CAP_CONN_PARAMS_ACCEPTED | ||
- | #define L2CAP_CONN_PARAMS_REJECTED | ||
- | ``` | ||
- | ![](http:// | ||
- | |||
- | 下面是连接过程中,由主机直接发起的连接参数更新请求,可以看出如果是主机直接修改连接参数,只需要发送连接参数更新请求。从机返回响应之后即完成了连接参数更新。 | ||
- | ![](http:// | ||
- | |||
- | |||
- | ## 加入我们 ## | ||
- | 文章所有代码、工具、文档开源。加入我们[**QQ群 591679055**](http:// | ||
- | <div> | ||
- | <p align=" | ||
- | <a target=" | ||
- | © Copyright 2017, 成都乐控畅联科技有限公司. | ||
- | </p> | ||
- | </ | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | </ | ||