天天看點

【BLE】廣播事件和廣播抓包分析

01簡介

了解下廣播事件、廣播間隔、廣播延時,更加合理的配置值可以在功耗和效率上得到最優點。在應用方面,一般的BLE産品的廣播都有逾時停止功能,也是為了進一步降低無效廣播和降低功耗。也就是說:廣播一段時間(例如3分鐘)後自動停止廣播,進入待機,獲得更低的功耗(1uA級别);當外部觸發(按鍵)後,立即進入廣播(1mA級别),等待連接配接(0.1mA~1mA級别)。02知識點

【BLE】廣播事件和廣播抓包分析
廣播包在3個廣播信道周期發送的示意圖。

  • 廣播事件(AdvEvent)

裝置每次廣播時,會在3個廣播信道上發送相同的廣播包,被稱為一個廣播事件。廣播事件事件可配置為“20ms~10.28s”不等的間隔。通常裝置會每一秒廣播一次(在3個信道循環一次)。

  • 廣播間隔(advInterval )

兩個相鄰廣播事件之間的時間稱為廣播間隔。廣播間隔必須是“0.625ms”的整數倍,範圍是“20ms~10.24s”之間。對于可掃描非定向廣播(最常用)和不可連接配接非定向廣播這兩種廣播類型,該值最好不要小于100ms,即(160個0.625ms)

  • 廣播延時(advDelay)

如果兩個裝置同時廣播,就會造成互相幹擾。為防止這一情況,在上一次廣播事件後加入一個“0 ~ 10ms”随機延時,防止連續沖突。

  • 廣播事件周期(T_advEvent)

兩個相鄰的廣播事件的之間的時間間隔稱為廣播事件周期,由上圖可知:

T_AdvEvent = advInterval + advDelay

03代碼舉例

  • 樂鑫ESP32,簡單看下注釋。
static esp_ble_adv_params_t adv_params = {    // 廣播間隔最小值:256*0.625=160ms    .adv_int_min        = 0x100,    // 廣播間隔最大值:256*0.625=160ms    .adv_int_max        = 0x100,    // 廣播類型:可連接配接可掃描的非定向廣播,最常用的廣播    .adv_type           = ADV_TYPE_IND,    // 位址類型:随機    .own_addr_type      = BLE_ADDR_TYPE_RANDOM,    // 廣播信道:ALL是37,38,39都發    .channel_map        = ADV_CHNL_ALL,    // 過濾:允許被掃描和連接配接    .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,};// 配置廣播的參數到協定棧esp_ble_gap_start_advertising(&adv_params);      
  • 沁恒CH579和TICC2540的heartrate工程這部分代碼、接口注釋相同,如下:快慢廣播隻是為了在功耗和效率上得到最優點,此處主要用于示範。
// 快速廣播間隔:32*0.625=20ms#define DEFAULT_FAST_ADV_INTERVAL             32// 快速廣播持續的時間:30000*0.625=18750ms≈18秒#define DEFAULT_FAST_ADV_DURATION             30000
// 快速廣播間隔:1600*0.625=1000ms#define DEFAULT_SLOW_ADV_INTERVAL             1600// 快速廣播持續的時間:為0表示一直廣播#define DEFAULT_SLOW_ADV_DURATION             0
// 配置快速廣播的參數到協定棧GAP_SetParamValue( TGAP_DISC_ADV_INT_MIN, DEFAULT_FAST_ADV_INTERVAL );GAP_SetParamValue( TGAP_DISC_ADV_INT_MAX, DEFAULT_FAST_ADV_INTERVAL );GAP_SetParamValue( TGAP_GEN_DISC_ADV_MIN, DEFAULT_FAST_ADV_DURATION );
// 配置慢速廣播的參數到協定棧GAP_SetParamValue( TGAP_DISC_ADV_INT_MIN, DEFAULT_SLOW_ADV_INTERVAL );GAP_SetParamValue( TGAP_DISC_ADV_INT_MAX, DEFAULT_SLOW_ADV_INTERVAL );GAP_SetParamValue( TGAP_GEN_DISC_ADV_MIN, DEFAULT_SLOW_ADV_DURATION );      
  • Nordic的nRF52832的ble_app_blinky工程代碼,代碼中有幾個不常見的廣播參數,看注釋。Nordic的SDK和藍牙規範更切合。
// 廣播間隔:64*0.625=40ms#define APP_ADV_INTERVAL                64 // 廣播持續時間:為0表示一直廣播#define APP_ADV_DURATION                0   
// 實體速度,和晶片有關adv_params.primary_phy     = BLE_GAP_PHY_1MBPS;// 廣播類型:可連接配接可掃描的非定向廣播,最常用的廣播adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED;// 定向廣播時候,對方的位址adv_params.p_peer_addr     = NULL;// 過濾:允許被掃描和連接配接adv_params.filter_policy   = BLE_GAP_ADV_FP_ANY;// 廣播持續時間adv_params.duration        = APP_ADV_DURATION;// 廣播間隔adv_params.interval        = APP_ADV_INTERVAL;
// 配置到協定棧err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, &adv_params);APP_ERROR_CHECK(err_code);      

04驗證

使用沁恒CH579的heartrate工程舉例。

  • 廣播相關資料如下:
// 掃描應答資料static uint8 scanRspData[] ={  0x12,   // length of this data  GAP_ADTYPE_LOCAL_NAME_COMPLETE,  'H',  'e',  'a',  'r',  't',  ' ',  'R',  'a',  't',  'e',  ' ',  'S',  'e',  'n',  's',  'o',  'r'};// 廣播資料static uint8 advertData[] = {   // flags  0x02,  GAP_ADTYPE_FLAGS,  GAP_ADTYPE_FLAGS_GENERAL | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,  // service UUIDs  0x05,  GAP_ADTYPE_16BIT_MORE,  LO_UINT16(HEARTRATE_SERV_UUID),  HI_UINT16(HEARTRATE_SERV_UUID),  LO_UINT16(BATT_SERV_UUID),  HI_UINT16(BATT_SERV_UUID)};// 裝置名static uint8 attDeviceName[GAP_DEVICE_NAME_LEN] = "Heart Rate Sensor";
      
  • 使用nRF Connect看下裝置廣播的資料(廣播資料和掃描應答資料):
【BLE】廣播事件和廣播抓包分析
  • 使用wireshark抓包,更能看出其廣播流程:
【BLE】廣播事件和廣播抓包分析

37信道的廣播資料

【BLE】廣播事件和廣播抓包分析

廣播資料細節

掃描應答資料(也是在廣播信道中發送的)

【BLE】廣播事件和廣播抓包分析

通過上面的抓包,可以看到藍牙廣播的資料和代碼實作相同,主要包括:廣播資料、掃描應答資料、廣播的部分參數(廣播間隔)等。

公衆号背景回複關鍵詞【藍牙抓包】,發送後收到連結即可下載下傳。