 |
思澈科技軟件開發(fā)工具包
2.20
|
|
通用訪問配置文件 (GAP) 定義了設(shè)備發(fā)現(xiàn)、鏈接管理和相關(guān)安全程序。 在 BLE 中,為不同的場景定義了幾種模式和程序 :
- 廣播模式和觀察程序。 該模式和流程適用于無連接通信場景,例如信標 。
- 處于廣播模式的設(shè)備稱為廣播器。 它將發(fā)送帶有指定數(shù)據(jù)的不可連接的廣播。
- 設(shè)備實現(xiàn)的觀察程序稱為觀察者。 它將掃描不可連接的廣播以獲取數(shù)據(jù)。
- 發(fā)現(xiàn)模式和程序,連接模式和程序。 兩組模式和程序是針對不同場景下的鏈路建立,如定向連接、正常連接。
- 接受鏈路建立的設(shè)備稱為外設(shè)。 它將發(fā)送可連接或定向可連接廣播。
- 發(fā)起鏈路建立的設(shè)備稱為中央設(shè)備。 它將掃描廣播并通過廣播連接到指定的對等地址。
- 配對模式和程序。 模式和程序是將鏈路設(shè)置為不同的安全級別。
GAP 提供外圍 API 來管理廣播、連接和安全。
GAP API 詳情請參考 GAP Interface .
低功耗藍牙地址類型
藍牙 LE 有 4 種地址類型:
- 公共設(shè)備地址,由SIG分配,是唯一地址。
- 靜態(tài)隨機設(shè)備地址是隨機生成的,在電源循環(huán)期間不應(yīng)更改地址。 最高 2 位應(yīng)為 0x11。
- 私有設(shè)備地址,用于保護設(shè)備地址,并且可以在幾分鐘內(nèi)更改。 使用私有設(shè)備地址的設(shè)備必須具有身份地址,該地址可以是公共地址或靜態(tài)隨機地址。
- 可解析的私有設(shè)備地址,由本地身份解析密鑰(IRK)生成。 它可以由具有 IRK 的對等設(shè)備解決。 IRK 將在粘合過程中交換。 最高 2 位應(yīng)為 0x01
- 不可解析的私有設(shè)備地址,是隨機生成的。 無法解決。 最高 2 位應(yīng)為 0x00。
用戶可以在不同的場景中使用這 4 種地址類型。
- 一般情況下,應(yīng)使用公共地址或靜態(tài)隨機地址。
- 在安全敏感的可連接情況下,應(yīng)使用可解析的私有設(shè)備地址。
- 在安全敏感的不可連接的情況下,不可解析的私有地址應(yīng)該是 usd。
廣播
藍牙 LE 有 40 個物理信道(索引從 0~39)從 2.4GHz - 2.4835Hz,其中 37、38 和 39 信道分配給廣播。 在 37、38 或 39 頻道上依次發(fā)送的廣播稱為廣播事件。 相鄰廣播事件的兩個開始之間的距離稱為廣播間隔。 通道可以通過廣播參數(shù)channel_map配置為37、38、39中的任意通道。
如果間隔越小,則廣播越密集,中心設(shè)備可以更容易地掃描該廣播或更快地連接,而功耗更高。 相比之下,間隔越大,功耗越低,但掃描或連接會更困難。
特殊情況是高負載循環(huán)定向連接廣播。 定向廣播是發(fā)送指定的對等地址設(shè)備,使其攜帶對等地址而不是廣播數(shù)據(jù)或掃描 rsp 數(shù)據(jù)。 高占空比期望對端設(shè)備以非常高的頻率快速發(fā)起鏈路建立和廣播。 在這種情況下,不使用廣播間隔。 由于頻率高,廣播時長不能超過1.28s。
連接參數(shù)
在控制器中,發(fā)起鏈接建立的設(shè)備稱為主設(shè)備(master),接受鏈接建立的設(shè)備稱為從設(shè)備(slave)。 鏈接建立后,連接事件用于交換數(shù)據(jù)包。 在連接事件期間,主從交替發(fā)送數(shù)據(jù)接收數(shù)據(jù)。 主機先發(fā)送數(shù)據(jù)并接收數(shù)據(jù),而從機接收數(shù)據(jù)并響應(yīng)數(shù)據(jù)。 在一次正常的連接事件中,主設(shè)備和從設(shè)備應(yīng)至少發(fā)送一個數(shù)據(jù)包。
影響連接行為的參數(shù)有很多:
- 連接事件的長度稱為 CE 長度。 參數(shù) max_ce_len 和 min_ce_len 確定長度。
- 兩個連續(xù)連接事件之間的距離稱為連接間隔。
- 從設(shè)備延遲允許從設(shè)備在某些連接事件中不響應(yīng)主設(shè)備。 例如,如果從設(shè)備延遲為 2,則從設(shè)備可以每兩個連接事件響應(yīng)主設(shè)備。
- 兩次接收數(shù)據(jù)之間的最大間隔稱為監(jiān)督超時。 如果在這個時間間隔內(nèi)沒有收到數(shù)據(jù),說明連接異常。 導致超時的原因有很多,例如一臺設(shè)備超出范圍,一臺設(shè)備突然關(guān)機或堆棧損壞。
連接參數(shù)
從延遲
吞吐量和低功耗
吞吐量可以簡單地通過 Dsize(在一個連接事件中傳輸數(shù)據(jù)大?。? Dcount(每秒連接事件計數(shù),1/connection_interval)計算。 Dsize 和 Dcount 越大,吞吐量越高。 Dcount 僅由連接間隔決定,間隔越小計數(shù)越大。 最小連接間隔為 7.5 毫秒,通常為高吞吐量的間隔為 15 - 48 毫秒。 Dsize 比較復雜,用戶可以采用以下方法進行改進:
- 確保主設(shè)備和從設(shè)備都支持數(shù)據(jù)長度擴展(DLE)功能,這是藍牙核心協(xié)議 4.2 之后的一個選項功能。 此功能允許最大數(shù)據(jù)包大小從 27 字節(jié)到 251 字節(jié)。 每個數(shù)據(jù)包都有一定的頭部,當Dsize增大時,數(shù)據(jù)包的數(shù)量會減少,頭部的開銷也會減少。
- 確保主設(shè)備和從設(shè)備都支持藍牙核心協(xié)議 5.0 支持的物理 2M 功能。 該特性允許物理速率從 1M 到 2M。
- 準備了足夠的數(shù)據(jù)進行傳輸。 從Connection參數(shù)的說明來看,主設(shè)備和從設(shè)備交替發(fā)送和接收數(shù)據(jù)。 如果沒有更多數(shù)據(jù)要發(fā)送,則連接事件結(jié)束。 數(shù)據(jù)需要一些時間準備, 如果控制器沒有數(shù)據(jù)要依次傳輸,則數(shù)據(jù)只能在下一個連接事件中傳輸。 例如,如果主機發(fā)送一個數(shù)據(jù)包,需要從機響應(yīng),則可以發(fā)送下一個數(shù)據(jù)包,兩個連接事件只能發(fā)送一個數(shù)據(jù)包。 但是如果主機發(fā)送兩個數(shù)據(jù)包,然后需要從機響應(yīng),則兩個連接事件可以發(fā)送兩個數(shù)據(jù)包。
如果不需要傳輸數(shù)據(jù),設(shè)備可以改變參數(shù)進入低功耗傳輸模式。 有2種方法:
- 使用更大的連接間隔,例如將連接間隔從 30 更改為 500 毫秒。 這種方法可以降低主從傳輸功率。 但是當切換回高吞吐量間隔時會有一些延遲。 通常,連接間隔切換至少需要 6 個連接事件。 如果從 500 毫秒切換到 30 毫秒,前 3 秒 (500 * 6) 仍然使用 500 毫秒間隔。
- 啟用從機延遲,從機可以跳過幾個連接事件來響應(yīng)。 它可以解決延遲問題,但主機無法節(jié)省傳輸功率。 比如設(shè)置間隔30毫秒,從設(shè)備延遲20。 然后 主設(shè)備 每 30 毫秒傳輸一次,而 從設(shè)備 每 600 毫秒傳輸一次。 當從設(shè)備想要發(fā)送數(shù)據(jù)時,它只能每30毫秒響應(yīng)一次。
SMP
安全管理器配置文件 (SMP) 定義了生成和分發(fā)安全密鑰并加密與這些密鑰的鏈接的協(xié)議和行為。 相關(guān) API 與 GAP 集成。 SMP 中有四個功能。
- 配對:創(chuàng)建共享密鑰。
- 綁定:存儲配對創(chuàng)建并用于后續(xù)連接的密鑰。 綁定后,兩個設(shè)備成為可信設(shè)備對。
- 身份驗證:驗證兩臺設(shè)備是否具有相同的密鑰。
- 加密:加密鏈接以確保安全通信。
如圖 SMP 流程所示,主設(shè)備可以發(fā)起配對請求來觸發(fā)配對流程,而從設(shè)備可以發(fā)起安全請求來請求主設(shè)備發(fā)起配對請求。
SMP 流程
在 SIFLI BLE SDK 中,對于從設(shè)備角色,大部分過程都封裝在堆棧中,用戶只需要處理 BLE_GAP_BOND_IND 和 BLE_GAP_ENCRYPT_IND 。
消息流
例子
要啟用廣播,用戶需要
- 創(chuàng)建具有指定參數(shù)的廣播。
- 設(shè)置廣播數(shù)據(jù)并掃描 rsp 數(shù)據(jù)。
- 開始有持續(xù)時間的廣播。
static uint8_t adv_idx;
uint8_t adv_data[] = {0x07, 0x09, 0x53, 0x69, 0x66, 0x6c, 0x69, 0x00}
uint8_t scan_rsp[] = {0x07, 0xff, 0x01, 0x00, 0x01, 0x02, 0x03, 0x04}
int app_advertising_evt_handler(uint16_t event_id, uint8_t *
data, uint16_t
len, uint32_t context)
{
uint8_t ret;
switch (event_id)
{
{
LOG("Set adv data result %d", ret);
LOG("Set scan rsp result %d", ret);
LOG("start adv result %d", ret);
break;
}
{
LOG("Set adv cnf result %d", cnf->status);
break;
}
{
LOG("Set scan rsp cnf result %d", cnf->status);
break;
}
{
LOG("Start adv cnf result %d", cnf->result);
break;
}
{
LOG(
"ADV stopped reason %d", ind->
reason);
break;
}
{
LOG(
"ADV stop adv cnf result %d", cnf->
status);
break;
}
default:
break;
}
return 0;
}
void app_start_advertising(void *para)
{
uint8_t ret;
LOG("Create ADV result %d", ret);
}
void app_stop_advertising(void *para)
{
uint8_t ret;
LOG("Stop ADV result %d", ret);
}
充當外圍角色,用戶只需啟用廣播并等待中心設(shè)備連接。
除了數(shù)據(jù)傳輸之外,以下子程序在 GAP 中也很重要:
- 連接參數(shù)更新程序。 外圍設(shè)備可能需要中央設(shè)備修改一些參數(shù),例如連接間隔、監(jiān)督超時,以平衡高吞吐量和低功耗。
- 斷開程序。 斷開與中央設(shè)備的連接。
static uint8_t conn_idx;
int app_connection_evt_handler(uint16_t event_id, uint8_t *
data, uint16_t
len, uint32_t context)
{
{
break;
}
{
break;
}
{
LOG("conn update reason %d", cnf->reason);
break;
}
{
LOG(
"disonncet reason %d", ind->
reason);
break;
}
default:
break;
}
}
void app_update_connection_parameter(void *para)
{
uint8_t ret;
conn_para.ce_max_len = 100;
LOG("Update conn parameter ret %d", ret);
}
void app_disconnect(void *para)
{
LOG("Disconnect ret %d", ret);
}
uint32_t adv_intv_max
Maximum advertising interval (in unit of 625us). Must be greater than 20ms.
Definition: bf0_ble_gap.h:842
uint8_t actv_idx
Activity identifier.
Definition: bf0_ble_gap.h:929
uint16_t sup_to
Link supervision timeout, time = N * 10 ms.
Definition: bf0_ble_gap.h:1505
uint16_t len
Definition: bf0_ble_ancs.h:226
@ GAPM_ADV_PROP_UNDIR_CONN_MASK
Undirected connectable advertising.
Definition: bf0_ble_gap.h:325
uint8_t reason
Definition: bf0_ble_gap.h:1066
The struture of advertising start parameter.
Definition: bf0_ble_gap.h:910
uint8_t filter_pol
Advertising filtering policy (.
Definition: bf0_ble_gap.h:881
uint8_t ble_gap_start_advertising(ble_gap_adv_start_t *adv_start)
Start advertising. The event BLE_GAP_START_ADV_CNF will indicate the result.
@ GAPM_ADV_MODE_NON_DISC
Mode in non-discoverable.
Definition: bf0_ble_gap.h:237
@ BLE_GAP_ADV_CREATED_IND
Definition: bf0_ble_gap.h:134
uint8_t reason
Reason of disconnection(.
Definition: bf0_ble_gap.h:1525
@ BLE_GAP_STOP_ADV_CNF
Definition: bf0_ble_gap.h:140
uint8_t ble_gap_create_advertising(ble_gap_adv_parameter_t *para)
Create a new advertising set. The event BLE_GAP_ADV_CREATED_IND will receive if created successful....
The structure of BLE_GAP_UPDATE_CONN_PARAM_IND.
Definition: bf0_ble_gap.h:1587
uint8_t chnl_map
Bit field indicating the channel mapping (.
Definition: bf0_ble_gap.h:844
@ GAPM_ADV_TYPE_LEGACY
Legacy advertising.
Definition: bf0_ble_gap.h:226
@ BLE_GAP_ADV_STOPPED_IND
Definition: bf0_ble_gap.h:139
uint8_t own_addr_type
Own address type (.
Definition: bf0_ble_gap.h:870
uint8_t reason
Stopped reason.
Definition: bf0_ble_gap.h:1364
uint8_t status
Start result.
Definition: bf0_ble_gap.h:1428
uint8_t actv_idx
Activity identifier.
Definition: bf0_ble_gap.h:1351
The struture of BLE_GAP_UPDATE_CONN_PARAM_CNF.
Definition: bf0_ble_gap.h:1446
uint16_t sup_to
Supervision timeout.
Definition: bf0_ble_gap.h:1595
The struture of advertising stop parameter.
Definition: bf0_ble_gap.h:927
uint8_t max_adv_evt
Definition: bf0_ble_gap.h:920
uint8_t ble_gap_set_scan_rsp_data(ble_gap_adv_data_t *data)
Set scan rsp data, it should be set before advertising start. The event BLE_GAP_SET_SCAN_RSP_DATA_CNF...
uint8_t data[]
Definition: bf0_ble_ancs.h:227
The structure of BLE_GAP_ADV_STOPPED_IND.
Definition: bf0_ble_gap.h:1360
int8_t max_tx_pwr
Definition: bf0_ble_gap.h:879
uint16_t duration
Definition: bf0_ble_gap.h:916
uint8_t conn_idx
Connection index.
Definition: bf0_ble_gap.h:1499
Definition: bf0_ble_gap.h:1381
uint8_t disc_mode
Discovery mode (.
Definition: bf0_ble_gap.h:874
The structure of update connection parameter request.
Definition: bf0_ble_gap.h:1105
@ BLE_GAP_SET_ADV_DATA_CNF
Definition: bf0_ble_gap.h:136
uint8_t conn_idx
Connection index.
Definition: bf0_ble_gap.h:1589
uint8_t type
Advertising type (.
Definition: bf0_ble_gap.h:872
The structure of BLE_GAP_DISCONNECTED_IND.
Definition: bf0_ble_gap.h:1521
uint16_t prop
Bit field value provided advertising properties (.
Definition: bf0_ble_gap.h:876
uint8_t ble_gap_disconnect(ble_gap_disconnect_t *conn)
Disconnect peer device. The event BLE_GAP_DISCONNECT_CNF will indicate disconnect operation result....
The struture of advertising parmeter.
Definition: bf0_ble_gap.h:868
uint8_t ble_gap_update_conn_param(ble_gap_update_conn_param_t *conn_para)
Update the connection parameters with peer device. The event BLE_GAP_UPDATE_CONN_PARAM_IND will indic...
uint16_t con_interval
Connection interval, time = N * 1.25ms.
Definition: bf0_ble_gap.h:1501
uint16_t time_out
Supervision timeout (in unit of 10ms). Allowed range is 100ms to 32s.
Definition: bf0_ble_gap.h:1117
The structure of disconnect request.
Definition: bf0_ble_gap.h:1064
@ BLE_GAP_UPDATE_CONN_PARAM_CNF
Definition: bf0_ble_gap.h:155
The struture of BLE_GAP_START_ADV_CNF.
Definition: bf0_ble_gap.h:1412
@ BLE_GAP_START_ADV_CNF
Definition: bf0_ble_gap.h:138
@ BLE_GAP_SET_SCAN_RSP_DATA_CNF
Definition: bf0_ble_gap.h:137
uint16_t ce_len_min
Minimum Connection Event Duration (in unit of 625us)
Definition: bf0_ble_gap.h:1119
@ GAP_PHY_TYPE_LE_1M
LE 1M.
Definition: bf0_ble_gap.h:367
uint16_t intv_min
Definition: bf0_ble_gap.h:1110
The structure of BLE_GAP_CONNECTED_IND.
Definition: bf0_ble_gap.h:1497
@ BLE_GAP_UPDATE_CONN_PARAM_IND
Definition: bf0_ble_gap.h:154
gapm_adv_prim_cfg_t prim_cfg
Configuration for primary advertising.
Definition: bf0_ble_gap.h:885
uint8_t actv_idx
Activity identifier.
Definition: bf0_ble_gap.h:912
The structure of BLE_GAP_ADV_CREATED_IND.
Definition: bf0_ble_gap.h:1349
uint8_t ble_gap_set_adv_data(ble_gap_adv_data_t *data)
Set advertising data, it should be set before advertising start. The event BLE_GAP_SET_ADV_DATA_CNF w...
uint32_t adv_intv_min
Minimum advertising interval (in unit of 625us). Must be greater than 20ms.
Definition: bf0_ble_gap.h:840
uint8_t conn_idx
Connection index.
Definition: bf0_ble_gap.h:1107
uint8_t conn_idx
Connection index.
Definition: bf0_ble_gap.h:1523
@ BLE_GAP_DISCONNECTED_IND
Definition: bf0_ble_gap.h:149
@ BLE_GAP_CONNECTED_IND
Definition: bf0_ble_gap.h:147
uint16_t con_interval
Connection interval value.
Definition: bf0_ble_gap.h:1591
uint16_t latency
Latency. Allowed range is 0 to ((time_out / (conn_intv)) - 1)
Definition: bf0_ble_gap.h:1115
@ GAPM_STATIC_ADDR
Public or Private Static Address according to device address configuration.
Definition: bf0_ble_gap.h:593
uint8_t phy
Definition: bf0_ble_gap.h:847
uint8_t ble_gap_stop_advertising(ble_gap_adv_stop_t *adv_stop)
Stop advertising. The event BLE_GAP_STOP_ADV_CNF will indicate the result.
uint8_t conn_idx
Definition: bf0_ble_gap.h:1065
@ ADV_ALLOW_SCAN_ANY_CON_ANY
Allow both scan and connection requests from anyone.
Definition: bf0_ble_gap.h:339
#define BLE_EVENT_REGISTER(func, context)
Macro of siflie ble event handler register.
Definition: bf0_ble_common.h:172
uint16_t intv_max
Definition: bf0_ble_gap.h:1113
The struture of BLE_GAP_STOP_ADV_CNF.
Definition: bf0_ble_gap.h:1424