天天看點

CC2640R2F BLE5.0 BLE連接配接參數更新過程詳解BLE連接配接參數更新過程詳解

CC2640R2F BLE5.0 BLE連接配接參數更新過程詳解BLE連接配接參數更新過程詳解
CC2640R2F BLE5.0 BLE連接配接參數更新過程詳解BLE連接配接參數更新過程詳解
CC2640R2F BLE5.0 BLE連接配接參數更新過程詳解BLE連接配接參數更新過程詳解

BLE連接配接參數更新過程詳解

有關連接配接參數概念和作用我們在 Generic Access Profile (GAP) 一章中已經詳細講解過,這一章示範如何通過修改simple_peripheral例程實作連接配接參數更新,并分析程式流程。

介紹

連接配接參數更新過程中都是主機發起的,從機隻能被動的接收主機設定的參數,這個過程發生在連接配接的時候,當連接配接之後如果主機設定的參數不利于從機,從機可以發送請求,請求中包含需要的連接配接參數,從機請求主機重新更新連接配接參數,主機可以拒絕,如果主機同意修改連接配接參數,并且參數合理,則主機發起連接配接參數更新,如果參數不合理(例如主機不支援過大或者過小的連接配接間隔),則主機會對參數進行協商,選擇最合理的參數進行設定。由于從機發起連接配接參數更新請求的過程包含了主機發起連接配接參數更新的過程。本文以simple_peripheral工程為例,示範由從機發起連接配接參數更新請求的過程。

硬體環境

使用USB連接配接CC2640R2F Evaluation Board。確定跳線帽正确連接配接,如下圖所示

CC2640R2F BLE5.0 BLE連接配接參數更新過程詳解BLE連接配接參數更新過程詳解

軟體環境

  • IAR Embedded workbench 7.80.3
  • BLE-STACK V3.0.1
  • Packet Sniffer
  • BTool

協定棧和IAR安裝以及我們工程編譯參考CC2640R2 BLE 開發環境搭建 編譯參考 編譯第一個工程(simple_peripheral),有關BTool使用請參考BTool。 有關Packet Sniffer使用請參考 Packet Sniffer 。所有工具可以在CC2640R2開發工具集介紹裡獲得。

運作流程

  1. 在simple_perpheral中可以選擇使用按鍵和定時器的方式進行連接配接參數更新,這裡我們使用定時器的方式進行連接配接參數更新,并且對定時器啟動過程進行分析。

    在peripheral.c檔案中,定義了

    startUpdateClock

    的結構體變量,

    startUpdateClock

    作為連接配接參數更新的定時器事件句柄。在gapRole_init()中,可以找到其初始化過程。Util_constructClock(&startUpdateClock, gapRole_clockHandler,0, 0, false, START_CONN_UPDATE_EVT);
  • 參數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

事件的處理過程裡面可以看見

//source\ti\ble5stack\profiles\roles\cc26xx\peripheral.c  GAP_LINK_ESTABLISHED_EVENT Line 1195
uint16_t timeout = GAP_GetParamValue(TGAP_CONN_PAUSE_PERIPHERAL);

Util_restartClock(&startUpdateClock, timeout*1000);      

是以當一旦連接配接建立,就啟動該定時器,這裡

timeout

通過

GAP_GetParamValue

得到。在

SimpleBLEPeripheral_init

函數中,通過下面代碼段已經設定了DEFAULT_CONN_PAUSE_PERIPHERAL值。

//examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral.c DEFAULT_CONN_PAUSE_PERIPHERAL  Line 144
// Connection Pause Peripheral time value (in seconds)
#define DEFAULT_CONN_PAUSE_PERIPHERAL         6
GAP_SetParamValue(TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL);      

當定時器時間到達後,調用下面回調函數,并傳入初始化中設定的

START_CONN_UPDATE_EVT

參數,可以看出,該回調函數僅發送了一個事件。

//source\ti\ble5stack\profiles\roles\cc26xx\peripheral.c  gapRole_clockHandler Line 1626
void gapRole_clockHandler(UArg a0)
{
  gapRole_setEvent(a0);
}      

然後在

gapRole_taskFxn

函數中進行相應事件處理。這裡調用

gapRole_startConnUpdate

函數進行連接配接參數更新。

//source\ti\ble5stack\profiles\roles\cc26xx\peripheral.c  gapRole_taskFxn Line 895
if (events & START_CONN_UPDATE_EVT)
{
// Start connection update procedure
gapRole_startConnUpdate(GAPROLE_NO_ACTION, &gapRole_updateConnParams);
}
      

而在simple_peripheral.c中使用以下函數端對連接配接參數變量進行指派。其中需要特别注意

DEFAULT_ENABLE_UPDATE_REQUEST

。需要在其 定義處修改成

GAPROLE_LINK_PARAM_UPDATE_INITIATE_BOTH_PARAMS

。這樣雙方都可以啟動連接配接參數更新過程。

//examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral.c enableUpdateRequest line 510
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;      
  1. 上述過程了解清楚後,我們就可以在

    peripheral.c

    檔案中直接修改連接配接參數,在更新的時候使用我們自己設定的連接配接參數。
//examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral.c DEFAULT_DESIRED_MAX_CONN_INTERVAL line 118
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL     500
#define DEFAULT_DESIRED_CONN_TIMEOUT          2500
#define DEFAULT_DESIRED_SLAVE_LATENCY         1      

下圖是使用BTool建立連接配接之後等待6秒收到的資料。可以看出在連接配接的時候使用的是主機端設定的連接配接參數。ConnInterval=80,ConnLatency=0,ConnTimout=2000。建立連接配接6秒之後,啟動連接配接參數更新,并且更新為設定的 ConnInterval=500,ConnLatency=1,ConnTimout=2500。

CC2640R2F BLE5.0 BLE連接配接參數更新過程詳解BLE連接配接參數更新過程詳解

下面我們使用Packet Sniffer抓包分析一下流程:如圖示首先定時器時間到達之後,由從機向主機(S->M)發送連接配接參數更新請求指令,并攜帶更新參數值,主機接收到之後有權利拒絕本次更新,這裡主機傳回0X0000(M->S),表示同意本次連接配接參數更新。随後主機端會根據從機的參數進行一次協商,如果從機設定的參數不滿足主機端設定的最大值或最小值,則主機會設定目前支援的最大值,舉個例子,如果這裡我們把

DEFAULT_DESIRED_CONN_TIMEOUT

改成一個比較小的數值,主機端可能就不會使用我們設定的值。而使用主機端所能支援的最小值。是以最後主機發送協商之後最終使用的連接配接參數(M->S)。從機接收并更新後傳回應答響應。

//source\ti\ble5stack\inc\l2cap.h L2CAP_CONN_PARAMS_ACCEPTED line 210
#define L2CAP_CONN_PARAMS_ACCEPTED       0x0000 //!< Connection Parameters accepted
#define L2CAP_CONN_PARAMS_REJECTED       0x0001 //!< Connection Parameters rejected      
CC2640R2F BLE5.0 BLE連接配接參數更新過程詳解BLE連接配接參數更新過程詳解

下面是連接配接過程中,由主機直接發起的連接配接參數更新請求,可以看出如果是主機直接修改連接配接參數,隻需要發送連接配接參數更新請求。從機傳回響應之後即完成了連接配接參數更新。

CC2640R2F BLE5.0 BLE連接配接參數更新過程詳解BLE連接配接參數更新過程詳解

加入我們

文章所有代碼、工具、文檔開源。加入我們QQ群 591679055擷取更多支援,共同研究CC2640R2F&BLE5.0。

CC2640R2F BLE5.0 BLE連接配接參數更新過程詳解BLE連接配接參數更新過程詳解

© Copyright 2017, 成都樂控暢聯科技有限公司.

繼續閱讀