BLE学习笔记2:广播
1. 广播初始化
广播初始化主要配置两个结构体advdata广播参数和option广播方式。
1.1 advdata
在初始化advdata之前,先使用 memset(&advdata, 0, sizeof(advdata))语句将advdata结构体中的所有数置零。下图是advdata结构体列表参数,在蓝牙示例程序中,我们需要配置name_type(名称类型,注意这里并不是名称,名称定义是在GAP初始化中实现的),flags(蓝牙设备模式),uuid_complete(uuid设置)。
1.1.1 name_type
广播时名称的显示类型,其本身也是个结构体
typedef enum
{
BLE_ADVDATA_NO_NAME, /**< Include no device name in advertising data. */
BLE_ADVDATA_SHORT_NAME, /**< Include short device name in advertising data. */
BLE_ADVDATA_FULL_NAME /**< Include full device name in advertising data. */
} ble_advdata_name_type_t;
初始化时选择结构体的其中一个参数
advdata.name_type = BLE_ADVDATA_FULL_NAME;
1.1.2 flags
蓝牙设备模式,一共有以下几种情况,我们常用前3种,其中LE表示低功耗,BR/DER表示基本速率或增强速率。
初始化时选择
advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MOD
其中
#define BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE (BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED)
1.1.3 uuid_complete
uuid_complete是一个结构体,我们需要对其中的两个参数分别初始化
typedef struct
{
uint16_t uuid_cnt; /**< Number of UUID entries. */
ble_uuid_t * p_uuids; /**< Pointer to UUID array entries. */
} ble_advdata_uuid_list_t;
初始化程序
advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);//UUID
advdata.uuids_complete.p_uuids = m_adv_uuids
1.2 options
options结构体参数主要配置广播的具体参数,这里我们使用了快速广播模式,故只需要配置其中和快速广播有关的参数。
typedef struct
{
bool ble_adv_whitelist_enabled; /**< Enable or disable use of the whitelist. */
bool ble_adv_directed_enabled; /**< Enable or disable direct advertising mode. */
bool ble_adv_directed_slow_enabled; /**< Enable or disable direct advertising mode. */
uint32_t ble_adv_directed_slow_interval; /**< Advertising interval for directed advertising. */
uint32_t ble_adv_directed_slow_timeout; /**< Time-out (number of tries) for direct advertising. */
bool ble_adv_fast_enabled; /**< Enable or disable fast advertising mode. */
uint32_t ble_adv_fast_interval; /**< Advertising interval for fast advertising. */
uint32_t ble_adv_fast_timeout; /**< Time-out (in seconds) for fast advertising. */
bool ble_adv_slow_enabled; /**< Enable or disable slow advertising mode. */
uint32_t ble_adv_slow_interval; /**< Advertising interval for slow advertising. */
uint32_t ble_adv_slow_timeout; /**< Time-out (in seconds) for slow advertising. */
}ble_adv_modes_config_t;
具体配置程序如下,分别配置了广播类型,广播间隔以及广播超时时间。
options.ble_adv_fast_enabled = BLE_ADV_FAST_ENABLED;
options.ble_adv_fast_interval = APP_ADV_INTERVAL;
options.ble_adv_fast_timeout = APP_ADV_TIMEOUT_IN_SECONDS;
1.3 ble_advertising_init()
广播初始化函数,它需要传入5个参数
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)
将advdata,option结构体以及广播事件回调函数(主要实现板级设备的配置,例如使用一个led灯表示广播的状态)写入该初始化,
err_code = ble_advertising_init(&advdata, NULL, &options, on_adv_evt, NULL);
2.在回调派发函数中调用广播初始化的参数
这一步的处理在协议栈初始化中实现,
static void ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
dm_ble_evt_handler(p_ble_evt);
ble_conn_params_on_ble_evt(p_ble_evt);
bsp_btn_ble_on_ble_evt(p_ble_evt);
on_ble_evt(p_ble_evt);
ble_advertising_on_ble_evt(p_ble_evt);
/*YOUR_JOB add calls to _on_ble_evt functions from each service your application is using
ble_xxs_on_ble_evt(&m_xxs, p_ble_evt);
ble_yys_on_ble_evt(&m_yys, p_ble_evt);
*/
}
实际上,广播初始化的参数传递到evt_id里面,并在ble_advertising_on_ble_evt(p_ble_evt)函数中进行判断。
3.开启广播
err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
该函数不仅可以实现广播的开启,还可以进行广播由上至下的切换,若快速模式超时,便切换到慢速模式。前提是需要在options中声明慢速模式,后面我会详细谈下如何修改广播。