廣播初始化 - ble_advertising_init()

廣播就是爲了讓別人能發現你。

記得初始化完畢還要在協議棧初始化通過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 藍牙就會永久廣播。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章