一、背景
链路层(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]