zephyr RTOS 中 bt_le_adv_start函数的功能应用
目录
概述
1 功能
1.1 功能介绍
1.2 函数原型
2 参数说明
2.1 广播参数(bt_le_adv_param)
2.2 常用广播选项(options)
2.3 广播数据(bt_data)
3 示例代码
3.1 启动可连接广播(带设备名称)
3.2 启动不可连接广播(iBeacon 示例)
4 常见问题
4.1 广播无法启动?
4.2 如何停止广播?
4.3 如何动态修改广播数据?
总结
概述
bt_le_adv_start
是一个函数名称,通常出现在蓝牙低功耗(Bluetooth Low Energy, BLE)相关的开发中,特别是在嵌入式系统或蓝牙协议栈的实现中。它的功能是启动蓝牙低功耗(BLE)设备的广播(Advertising)。
Advertising的功能说明:
启动广播:
使BLE设备开始发送广播数据包,以便其他设备(如智能手机、扫描器)可以发现它。
广播是BLE设备向外宣告自身存在的主要方式。
参数配置:
通常需要传入广播参数(如广播间隔、广播类型、广播数据等)。
例如:
广播类型:可连接广播(Connectable)、非可连接广播(Non-connectable)、定向广播(Directed)等。
广播数据:设备名称、服务UUID、制造商数据等。
返回值:
通常返回一个错误码(如
0
表示成功,非零值表示失败)。典型使用场景:
在BLE设备初始化后调用此函数,开始被其他设备扫描或连接。
例如:智能手环、信标(Beacon)、传感器设备等
1 功能
1.1 功能介绍
bt_le_adv_start()
用于:
-
启动 BLE 广播,使设备可被其他 BLE 设备(如手机、扫描器)发现。
-
配置广播参数,如广播类型、间隔、广播数据等。
-
支持多种广播模式,如可连接广播、非可连接广播、定向广播等。
通常需要传入广播参数(如广播间隔、广播类型、广播数据等)。
例如:
广播类型:可连接广播(Connectable)、非可连接广播(Non-connectable)、定向广播(Directed)等。
广播数据:设备名称、服务UUID、制造商数据等。
典型使用场景:
在BLE设备初始化后调用此函数,开始被其他设备扫描或连接。
例如:智能手环、信标(Beacon)、传感器设备等。
1.2 函数原型
int bt_le_adv_start(const struct bt_le_adv_param *param,
const struct bt_data *ad, size_t ad_len,
const struct bt_data *sd, size_t sd_len);
参数说明
参数 | 类型 | 说明 |
---|---|---|
param | const struct bt_le_adv_param * | 广播参数(类型、间隔等) |
ad | const struct bt_data * | 广播数据(Advertising Data) |
ad_len | size_t | 广播数据长度 |
sd | const struct bt_data * | 扫描响应数据(Scan Response Data,可选) |
sd_len | size_t | 扫描响应数据长度 |
返回值
-
0
:广播启动成功。 -
负值:错误码(如
-EINVAL
参数无效,-ENOMEM
内存不足等)。
2 参数说明
2.1 广播参数(bt_le_adv_param
)
struct bt_le_adv_param {
uint8_t id; // 广播标识(通常为 0)
uint32_t options; // 广播选项(如 `BT_LE_ADV_OPT_CONNECTABLE`)
uint16_t interval_min; // 最小广播间隔(单位:0.625ms)
uint16_t interval_max; // 最大广播间隔(单位:0.625ms)
uint8_t peer[6]; // 定向广播的目标地址(可选)
};
2.2 常用广播选项(options
)
选项 | 说明 |
---|---|
BT_LE_ADV_OPT_CONNECTABLE | 可连接广播(允许设备连接) |
BT_LE_ADV_OPT_USE_NAME | 自动包含设备名称在广播数据中 |
BT_LE_ADV_OPT_SCANNABLE | 允许扫描请求(Scan Request) |
BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY | 低占空比定向广播 |
2.3 广播数据(bt_data
)
广播数据采用 Advertising Data (AD) 格式,通常包括:
-
设备名称
-
服务 UUID
-
制造商特定数据(如 Beacon 数据)
struct bt_data {
uint8_t type; // 数据类型(如 `BT_DATA_NAME_COMPLETE`)
uint8_t data_len;
const uint8_t *data;
};
常用广播数据类型(type
)
类型 | 说明 |
---|---|
BT_DATA_FLAGS | BLE 广播标志(如 BT_LE_AD_GENERAL ) |
BT_DATA_NAME_COMPLETE | 完整设备名称 |
BT_DATA_UUID16_ALL | 16-bit UUID 列表 |
BT_DATA_MANUFACTURER_DATA | 自定义厂商数据 |
3 示例代码
3.1 启动可连接广播(带设备名称)
#include <bluetooth/bluetooth.h>
#include <bluetooth/gap.h>
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR),
BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, sizeof(DEVICE_NAME) - 1),
};
int start_advertising(void) {
struct bt_le_adv_param *adv_param = BT_LE_ADV_PARAM(
BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_USE_NAME,
BT_GAP_ADV_FAST_INT_MIN_2, // 100ms (min)
BT_GAP_ADV_FAST_INT_MAX_2, // 150ms (max)
NULL // 无目标设备
);
int err = bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad), NULL, 0);
if (err) {
printk("Advertising failed (err %d)\n", err);
return err;
}
printk("Advertising started\n");
return 0;
}
3.2 启动不可连接广播(iBeacon 示例)
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_MANUFACTURER_DATA,
0x4C, 0x00, // Apple Company ID
0x02, 0x15, // iBeacon type
// UUID, Major, Minor, TX Power
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
0x00, 0x01, // Major
0x00, 0x02, // Minor
0xC8 // TX Power (-56 dBm)
),
};
int start_beacon(void) {
struct bt_le_adv_param *adv_param = BT_LE_ADV_PARAM(
0, // 非可连接
BT_GAP_ADV_FAST_INT_MIN_2,
BT_GAP_ADV_FAST_INT_MAX_2,
NULL
);
int err = bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad), NULL, 0);
if (err) {
printk("Beacon failed (err %d)\n", err);
return err;
}
printk("iBeacon advertising started\n");
return 0;
}
4 常见问题
4.1 广播无法启动?
-
检查
bt_enable()
是否已成功调用。 -
确保广播参数合法(如
interval_min <= interval_max
)。 -
检查广播数据是否超过 31 字节限制。
4.2 如何停止广播?
int bt_le_adv_stop(void);
4.3 如何动态修改广播数据?
先停止广播,修改数据后再重新启动:
bt_le_adv_stop();
// 修改 ad[] 数据
bt_le_adv_start(new_param, new_ad, new_len, NULL, 0);
总结
功能 | API |
---|---|
启动广播 | bt_le_adv_start() |
停止广播 | bt_le_adv_stop() |
广播参数 | struct bt_le_adv_param |
广播数据 | struct bt_data |
在 Zephyr 中,bt_le_adv_start()
是 BLE 开发的核心 API,用于控制设备的可发现性和广播内容。