广播就是为了让别人能发现你。
记得初始化完毕还要在协议栈初始化通过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 蓝牙就会永久广播。