藍芽4.0中的GAP Advertising簡介
藍芽技術中定義了GAP的4種角色:Broadcaster, Observer, Central, Peripheral(Section 6.2 Vol 1 Part A)和Linker Layer(LL)的5種狀態:Standby, Advertising, Scanning, Initiating, Connection(Section 1.1 Vol 6 part B),一種裝置可以同時擁有多種角色和多種狀態
A、Advertising
有兩種型別的資料包可以傳送:廣播資料包(Advertising packet) 和 掃描響應包(Scan Response packet),它們的最大資料量都為31位元組。
廣播者在廣播時間間隔內會一直廣播資料,這個時間間隔是可以在廣播的時候改變的,但也必須在最小時間間隔和最大時間間隔之間,正常情況下,不定向廣播的時間間隔在20ms到10.24s之間(Section 7.8.5 Part E Vol2)。掃描響應包的傳送是在收到掃描請求以後才傳送。
下圖描述了廣播包和掃描響應包的傳送過程
在一些應用場景中,我們可能不希望裝置之間建立連線,那我們可以廣播無連線廣播資料,這樣就可以跳過掃描請求,不回覆掃描響應,這樣可以節省電量,Beacon裝置就是其中的一種。
注意,所有的廣播包,掃描請求包和掃描響應包都用同一個允許接入地址0x8E89BED6,
低功耗藍芽裝置用40個無線通道,中心頻率是在2402+k*2MHZ(k在0到39之間),但是廣播通道只有3個,就是37(2402MHZ), 38(2426MHZ), 39(2480MHZ),選擇這3個通道是為了避免與wifi通道衝突,下圖所示就是藍芽廣播通道和wifi通道,其中扇形的是wifi
在nordic的協議棧中,預設情況下每一次廣播事件都會在3個通道廣播資料,掃描者會從3箇中的1個通道抓取,如下圖示
1、Broadcast
注意,一個裝置可以同時掃描和廣播,掃描者能傳送給廣播者唯一的資訊是掃描請求包,它只包含了掃描者的自身地址。
2、廣播型別和白名單廣播
有4種廣播型別(Section 2.3.1 Vol 6 Part B)
ADV_IND: 可連線的非定向廣播,這是通常的廣播模式,任何裝置能傳送掃描響應和連線請求
ADV_DIRECT_IND:可連線的定向廣播,這種模式定向的傳送廣播包給指定主裝置去請求連線,其他的掃描者會忽略此包,同時此時的廣播者也會忽略其他掃描者的連線請求和掃描請求。
ADV_SCAN_IND: 可掃描的非定向廣播,這種廣播包不接收連線請求,只接收掃描請求
ADV_NONCONN_IND: 不可連線的非定向廣播,廣播者不接收任何連線請求和掃描請求,在這種模式下可節省電量。Beacon就是最大的應用例項
白名單廣播
廣播者可以利用白名單來限制掃描者的互動。白名單列表包含一些裝置的固定地址或者IRK numbers(主裝置用的是隨機地址),如果不是白名單列表裡的裝置,它就會拒絕。所以白名單列表能被用來過濾掃描請求包,連線請求包。
B、Start advertising with nodrdic Softdevice
1、關於廣播包和掃描響應包的設定可以參考(Chapter 11 Part C Vol 3)
開始廣播之前需要配置:
廣播時間間隔
廣播超時時間:在廣播超時時間到了之後,會收到BLE_GAP_EVT_TIMEOUT事件
裝置地址:如果設定的是定向廣播
白名單列表:如果有的話
過濾選擇: 過濾掃描請求還是連線請求或者兩者都過濾
廣播通道選擇:可以選擇1個,2個或者3個都廣播
2、廣播開始時可能收到的GAP事件
BLE_GAP_EVT_TIMEOUT: 在超時時間到了出現,可以選擇繼續廣播或者進入休眠模式。超時時間源可以是廣播超時,連線超時,掃描超時,安全請求超時
BLE_GAP_EVT_SCAN_REQ_REPORT: 這個事件是在收到掃描請求以後才出現,只包含掃描者的地址和RSSI值,注意,只有你通過sd_ble_opt_set()使能之後才有用
BLE_GAP_EVT_CONNECTED: 主端傳送連線請求建立連線
3、示例程式碼
uint32_t err_code;
ble_gap_adv_params_t adv_params;
ble_gap_whitelist_t whitelist;
ble_gap_addr_t * p_whitelist_addr[1];
ble_gap_addr_t whitelist_addr={BLE_GAP_ADDR_TYPE_RANDOM_STATIC,{0x71,0xA2,0xEC,0xDA,0x5F,0xE0}} ;
uint8_t addr[6] = {0x71,0xA2,0xEC,0xDA,0x5F,0xE0};
uint8_t adv_data[15] = {0x07,0x09,0x4E,0x6F,0x72,0x64,0x69,0x63,0x02,0x01,0x04,0x03,0x03,0x0F,0x18};
uint8_t adv_data_length = 15;
//Setting up the advertising data with scan response data = Null
err_code = sd_ble_gap_adv_data_set(adv_data, adv_data_length, NULL, NULL);
//Configure the advertising parameter and whitelist
memset(&adv_params, 0, sizeof(adv_params));
adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND;
adv_params.p_peer_addr = NULL;
adv_params.interval = 64;
adv_params.timeout = 180;
p_whitelist_addr[0] = &whitelist_addr;
whitelist.addr_count = 1;
whitelist.pp_addrs = p_whitelist_addr;
whitelist.pp_irks = NULL;
whitelist.irk_count =0;
adv_params.fp = BLE_GAP_ADV_FP_FILTER_CONNREQ;
adv_params.p_whitelist = &whitelist;
err_code = sd_ble_gap_adv_start(&adv_params);
下圖是掃描者接收到的廣播資料包
源資料是{0x07,0x09,0x4E,0x6F,0x72,0x64,0x69,0x63,0x02,0x01,0x04,0x03,0x03,0x0F,0x18}
解釋如下