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中局部变量

static bool scanningStarted = FALSE;

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]

你可能感兴趣的:(CC2640R2F学习笔记(9)——GAP主机端扫描)