廣播就是爲了讓別人能發現你。
記得初始化完畢還要在協議棧初始化通過ble_evt_dispatch分發事件,on_adv_evt()處理。
ble_advertising.h涉及的函數
協議棧廣播派發事件 : void ble_advertising_on_ble_evt(const ble_evt_t * const p_ble_evt);
系統事件 : void ble_advertising_on_sys_evt(uint32_t sys_evt);
廣播初始化
uint32_t ble_advertising_init(ble_advdata_t const * p_advdata,
ble_advdata_t const * p_srdata,
ble_adv_modes_config_t const * p_config,
ble_advertising_evt_handler_t const evt_handler,
ble_advertising_error_handler_t const error_handler);
開始廣播 : uint32_t ble_advertising_start(ble_adv_mode_t advertising_mode);
設置配對地址 : uint32_t ble_advertising_peer_addr_reply(ble_gap_addr_t *p_peer_addr);
設置白名單 : uint32_t ble_advertising_whitelist_reply(ble_gap_whitelist_t *p_whitelist);
禁止白名單廣告 : uint32_t ble_advertising_restart_without_whitelist(void);
-----------------------------------------------------------------------------------------------------------------------------------廣播模式處理函數:on_adv_evt(ble_adv_evt_t ble_adv_evt)
typedef enum
{
BLE_ADV_EVT_IDLE, /**< Idle; no connectableadvertising is ongoing.*/
BLE_ADV_EVT_DIRECTED, //定向廣播,只能被指定的設備連接
BLE_ADV_EVT_DIRECTED_SLOW,
BLE_ADV_EVT_FAST,//快速廣播
BLE_ADV_EVT_SLOW,
BLE_ADV_EVT_FAST_WHITELIST, //白名單快速廣播
BLE_ADV_EVT_SLOW_WHITELIST,
BLE_ADV_EVT_WHITELIST_REQUEST, /**< Request a whitelist from the mainapplication. For whitelist advertising to work, the whitelist
must be set when this event occurs. */
BLE_ADV_EVT_PEER_ADDR_REQUEST /**< Request a peer address from themain application. For directed advertising to work, the
peer address must beset when this event occurs. 定向廣播*/
} ble_adv_evt_t;
static void on_adv_evt(ble_adv_evt_tble_adv_evt)
{
uint32_t err_code;
switch (ble_adv_evt)
{
case BLE_ADV_EVT_IDLE:
break;
case BLE_ADV_EVT_DIRECTED:
break;
case BLE_ADV_EVT_FAST:
break;
case BLE_ADV_EVT_SLOW:
break;
case BLE_ADV_EVT_FAST_WHITELIST:
break;
caseBLE_ADV_EVT_WHITELIST_REQUEST://白名單請求,處理白名單設備
break;
default:
break;
}
}
廣播模式參數配置: ble_adv_modes_config_t options = {0};
typedef struct
{
//@白名單廣播
bool ble_adv_whitelist_enabled;
//@定向廣播
bool ble_adv_directed_enabled;
bool ble_adv_directed_slow_enabled;
uint32_tble_adv_directed_slow_interval;
uint32_t ble_adv_directed_slow_timeout;
//@普通廣播
bool ble_adv_fast_enabled;
uint32_t ble_adv_fast_interval;
uint32_t ble_adv_fast_timeout; //in seconds
bool ble_adv_slow_enabled;
uint32_t ble_adv_slow_interval;
uint32_t ble_adv_slow_timeout; //in seconds
}ble_adv_modes_config_t;
@白名單廣播
options.ble_adv_whitelist_enabled = BLE_ADV_WHITELIST_ENABLED; //速度和間隔 基於普通廣播。
@定向廣播,只能被指定設備連接
options.ble_adv_directed_enabled = BLE_ADV_DIRECTED_ENABLED; //速度和間隔 基於普通廣播。
//#define APP_ADV_DIRECTED_SLOW_ INTERVAL 3200
//#define APP_ADV_DIRECTED_SLOW_TIMEOUT 180 //在GENERAL模式下,0表示一直廣播
//options.ble_adv_directed_slow_enabled = BLE_ADV_DIRECTED_SLOW_ENABLED;
//options.ble_adv_directed_slow_interval = APP_ADV_DIRECTED_SLOW_ INTERVAL;
// options.ble_adv_directed_slow_timeout = APP_ADV_DIRECTED_SLOW_TIMEOUT;
@普通廣播
#define APP_ADV_FAST_INTERVAL 40 /**< (in units of 0.625 ms). 25 ms. */
#define APP_ADV_SLOW_INTERVAL 3200 /**< (in units of 0.625 ms). 2 seconds. */
#define APP_ADV_FAST_TIMEOUT 180 /**< (in units of seconds). 180s .//在GENERAL模式下,0表示一直廣播*/
#define APP_ADV_SLOW_TIMEOUT 180 /**< (in units of seconds). 180s.//在GENERAL模式下,0表示一直廣播*/
options.ble_adv_fast_enabled = BLE_ADV_FAST_ENABLED;
options.ble_adv_fast_interval = APP_ADV_FAST_INTERVAL;
options.ble_adv_fast_timeout =APP_ADV_FAST_TIMEOUT;
options.ble_adv_slow_enabled =BLE_ADV_SLOW_ENABLED;
options.ble_adv_slow_interval = APP_ADV_SLOW_INTERVAL;
options.ble_adv_slow_timeout = APP_ADV_SLOW_TIMEOUT;
廣播初始化中傳遞的幾個參數,後面例子中一一講解。
typedef struct
{
ble_advdata_name_type_t name_type;
uint8_t short_name_len;
bool include_appearance;
uint8_t flags;
int8_t * p_tx_power_level;
ble_advdata_uuid_list_t uuids_more_available;
ble_advdata_uuid_list_t uuids_complete;
ble_advdata_uuid_list_t uuids_solicited;
ble_advdata_conn_int_t * p_slave_conn_int;
ble_advdata_manuf_data_t * p_manuf_specific_data;
ble_advdata_service_data_t * p_service_data_array;
uint8_t service_data_count;
bool include_ble_device_addr;
ble_advdata_le_role_t le_role;
ble_advdata_tk_value_t * p_tk_value;
uint8_t * p_sec_mgr_oob_flags;
} ble_advdata_t;
typedef struct
{
bool ble_adv_whitelist_enabled;
bool ble_adv_directed_enabled;
bool ble_adv_directed_slow_enabled;
uint32_t ble_adv_directed_slow_interval;
uint32_t ble_adv_directed_slow_timeout;
bool ble_adv_fast_enabled;
uint32_t ble_adv_fast_interval;
uint32_t ble_adv_fast_timeout;
bool ble_adv_slow_enabled;
uint32_t ble_adv_slow_interval;
uint32_t ble_adv_slow_timeout;
}ble_adv_modes_config_t;
1、advdata.include_appearance
什麼是外觀特性(appearance)?
外觀特性是一個16位的數值,由藍牙技術聯盟(SIG)定義,用來列舉設備的外觀樣式,指示設備是普通手機,手環或者平板電腦之類的。
advertising_init()函數中的 advdata.include_appearance = false;
當 advdata.include_appearance = true; 可在 gap_params_init()函數裏添加 BLE_APPEARANCES Bluetooth Appearance values,如
err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_HID_MOUSE);
APP_ERROR_CHECK(err_code);
使用安卓手機在設置藍牙裏搜索藍牙設備就會發現:(蘋果手機看不到)
BLE_APPEARANCE_HID_MOUSE
BLE_APPEARANCE_GENERIC_PHONE
BLE_APPEARANCE_GENERIC_COMPUTER
2、advdata.flags
BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE:有限可發現模式,不支持BR/EDR。
BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE:一般可發現模式,不支持BR/EDR。
有限可發現模式和一般可發現模式的主要區別是:
有限可發現模式有時間的限制,一般維持的時間是30秒,而一般可發現模式沒有時間的限制。
有限可發現模式廣播的間隔比一般可發現模式小。 從時間的限制上,我們可以看出有限可發現模式對連接的迫切性和目的性比一般可發現模式高,一個處於有限可發現模式的設備正在廣播,那麼他一定是剛被用戶操作過並且極希望被連接。 一般情況下,設備首次開機、按下連接按鈕,設備進入有限可發現模式比較合適。如果在有限可發現模式時間內沒有被連接,可以轉入一般可發現模式。 如果我們希望設備在沒有被連接時一直保持廣播,那麼應該使用一般可發現模式,因爲一般可發現模式是沒有時間限制的。
advertising_init()函數中的 advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE有超時模式。APP_ADV_xx_TIMEOUT != 0
advdata.flags= BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; 且APP_ADV_xx_TIMEOUT = 0 藍牙就會永久廣播。