天天看點

CC2640R2F學習筆記(9)——GAP主機端掃描一、背景二、配置掃描參數三、執行掃描四、開機掃描五、循環掃描

一、背景

鍊路層(LL)控制裝置的射頻狀态,有五個裝置狀态:待機、廣播、掃描、初始化和連接配接。

廣播 為廣播資料包,而 掃描 則是監聽廣播。

GAP通信中角色,中心裝置(Central - 主機)用來掃描和連接配接 外圍裝置(Peripheral - 從機)。

本篇是關于配置以及啟動或關閉掃描的流程,解析掃描到的廣播資料包檢視 CC2640R2F學習筆記(18)——GAP主機端擷取從機廣播資料

二、配置掃描參數

2.1 掃描參數相關宏

// Enable/Disable Unlimited Scanning Feature
#define ENABLE_UNLIMITED_SCAN_RES             FALSE

// Maximum number of scan responses
// this can only be set to 15 because that is the maximum
// amount of item actions the menu module supports
#define DEFAULT_MAX_SCAN_RES                  15

#define DEFAULT_SCAN_DURATION                 4000   // 值越小,則發現的同一裝置廣播包越多
#define DEFAULT_SCAN_WIND                     80
#define DEFAULT_SCAN_INT                      80
           

2.2 配置GAP參數值

以SDK2.4 multi_role工程為例,在 multi_role_init() 初始化多角色應用程式函數中,

/*===================================== 主機 =====================================*/
/*------------------- 掃描參數 -------------------*/
// 掃描處理周期,周期越短,處理次數越多
GAP_SetParamValue(TGAP_GEN_DISC_SCAN, DEFAULT_SCAN_DURATION);

// 掃描間隔
GAP_SetParamValue(TGAP_CONN_SCAN_INT, DEFAULT_SCAN_INT);
GAP_SetParamValue(TGAP_CONN_SCAN_WIND, DEFAULT_SCAN_WIND);
GAP_SetParamValue(TGAP_CONN_HIGH_SCAN_INT, DEFAULT_SCAN_INT);
GAP_SetParamValue(TGAP_CONN_HIGH_SCAN_WIND, DEFAULT_SCAN_WIND);
GAP_SetParamValue(TGAP_GEN_DISC_SCAN_INT, DEFAULT_SCAN_INT);
GAP_SetParamValue(TGAP_GEN_DISC_SCAN_WIND, DEFAULT_SCAN_WIND);
GAP_SetParamValue(TGAP_LIM_DISC_SCAN_INT, DEFAULT_SCAN_INT);
GAP_SetParamValue(TGAP_LIM_DISC_SCAN_WIND, DEFAULT_SCAN_WIND);
GAP_SetParamValue(TGAP_CONN_EST_SCAN_INT, DEFAULT_SCAN_INT);
GAP_SetParamValue(TGAP_CONN_EST_SCAN_WIND, DEFAULT_SCAN_WIND);
           

2.3 配置GAP角色規範(Role Profile)

以SDK2.4 multi_role工程為例,在 multi_role_init() 初始化多角色應用程式函數中,

/*===================================== 主機 =====================================*/
/*------------------- 掃描參數 -------------------*/
// 設定掃描回應裝置數
uint8_t scanRes = 0;
// In case that the Unlimited Scanning feature is disabled
// send the number of scan results to the GAP
if(ENABLE_UNLIMITED_SCAN_RES == FALSE)
{
    scanRes = DEFAULT_MAX_SCAN_RES;    // 最大掃描回應裝置數,如果廣播的從機超過了15個,隻能掃描到先回應的從機
}

GAPRole_SetParameter(GAPROLE_MAX_SCAN_RES, sizeof(uint8_t), &scanRes, NULL);
           

三、執行掃描

3.1 正在掃描标志

以SDK2.4 multi_role工程為例,multi_role.c中局部變量

3.2 執行掃描函數

原mr_doScan函數修改後

/**
 @brief 執行掃描函數
 @param index 1 - 開啟掃描;0 - 取消掃描
 @return TRUE - 成功;FALSE - 失敗
*/
bool mr_doScan(uint8_t index)
{
    if(index)                                                           // 執行掃描
    {
        if(linkDB_NumActive() < maxNumBleConns)                         // 如果連接配接裝置數未飽和
        {
            if(!scanningStarted)                                        // 不在掃描中
            {
                scanningStarted = TRUE;                                 // 開始掃描标志置一

                GAPRole_StartDiscovery(DEFAULT_DISCOVERY_MODE,          // 開始掃描
                                       DEFAULT_DISCOVERY_ACTIVE_SCAN,
                                       DEFAULT_DISCOVERY_WHITE_LIST);

                return TRUE;
            }
            else                                                        // 正在掃描中
            {
                return FALSE;
            }
        }
        else                                                            // 連接配接裝置數飽和
        {
            return FALSE;
        }
    }
    else                                                                // 取消掃描
    {
        GAPRole_CancelDiscovery();
        return TRUE;
    }
}
           

四、開機掃描

以SDK2.4 multi_role工程為例,在 multi_role_processRoleEvent() 處理多角色事件函數中,

switch(pEvent->gap.opcode)
{
    /*================================== 裝置初始化完成事件 ==================================*/
    case GAP_DEVICE_INIT_DONE_EVENT:
    {
      ```
      ```
      mr_doScan(1);     // 開啟掃描
    }
    break;
}
           

五、循環掃描

以SDK2.4 multi_role工程為例,在 multi_role_processRoleEvent() 處理多角色事件函數中,

switch(pEvent->gap.opcode)
{
    /*===================================== 掃描完成事件 =====================================*/
    case GAP_DEVICE_DISCOVERY_EVENT:
    {
      if(pEvent->gap.hdr.status == SUCCESS)
      {
        uint8_t i;

        // 掃描完成,清除正在掃描标志
        scanningStarted = FALSE;
        ```
        ```
      }

      mr_doScan(1);    // 繼續掃描
    }
    break;
}
           

• 由 Leung 寫于 2019 年 3 月 21 日

• 參考:simplelink_cc2640r2_sdk_2_40_00_32 [提取碼:3pg6]