美文网首页物联网loT从业者物联网相关技术研究
CC2640R2F学习笔记(9)——GAP主机端扫描

CC2640R2F学习笔记(9)——GAP主机端扫描

作者: Leung_ManWah | 来源:发表于2019-03-21 09:16 被阅读0次

    一、背景

    链路层(LL)控制设备的射频状态,有五个设备状态:待机、广告、扫描、初始化和连接。

    广播 为广播数据包,而 扫描 则是监听广播。

    GAP通信中角色,中心设备(Central - 主机)用来扫描和连接 外围设备(Peripheral - 从机)

    二、配置扫描参数

    2.1 扫描参数相关宏

    #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.1 执行扫描函数

    原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主机端扫描

        本文链接:https://www.haomeiwen.com/subject/umitvqtx.html