一、背景
鍊路層(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]