1. 程式人生 > >藍芽4.0中的GAP Advertising簡介

藍芽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}

解釋如下