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

- 廣播事件(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看下裝置廣播的資料(廣播資料和掃描應答資料):
- 使用wireshark抓包,更能看出其廣播流程:
37信道的廣播資料
廣播資料細節
掃描應答資料(也是在廣播信道中發送的)
通過上面的抓包,可以看到藍牙廣播的資料和代碼實作相同,主要包括:廣播資料、掃描應答資料、廣播的部分參數(廣播間隔)等。
公衆号背景回複關鍵詞【藍牙抓包】,發送後收到連結即可下載下傳。