BT_LE_ADV_CONN_ONE_TIME 参数详解
目录
概述
1 参数介绍
1.1 参数本质
1.2 核心特性
1.3 使用场景
2 应用方法
2.1 广播功能(Zephyr)
2.2 超时控制
2.3 典型工作流程
3 注意事项
概述
在蓝牙低功耗(BLE)协议栈中(如Zephyr RTOS),BT_LE_ADV_CONN_ONE_TIME
是一个组合广播选项,用于配置一次性可连接广播的行为。此参数是BLE设备实现按需广播和节能优化的关键机制,特别适合物联网设备场景。
1 参数介绍
1.1 参数本质
#define BT_LE_ADV_CONN_ONE_TIME (BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME)
-
由两个核心选项组合而成:
-
BT_LE_ADV_OPT_CONNECTABLE
:允许其他设备连接 -
BT_LE_ADV_OPT_ONE_TIME
:广播仅执行一次(超时或连接后自动停止)
注意:
在Zephyr的蓝牙API中,广播选项定义在`zephyr/include/bluetooth/bluetooth.h`中:
### 在Zephyr中的广播选项宏定义在Zephyr的蓝牙API中,广播选项定义在`zephyr/include/bluetooth/bluetooth.h`中:
enum {
BT_LE_ADV_OPT_CONNECTABLE = BIT(0),
BT_LE_ADV_OPT_USE_IDENTITY = BIT(1),
BT_LE_ADV_OPT_ONE_TIME = BIT(2), BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY = BIT(3), BT_LE_ADV_OPT_DIR_ADDR_RPA = BIT(4), BT_LE_ADV_OPT_FILTER_SCAN_REQ = BIT(5),
BT_LE_ADV_OPT_FILTER_CONN = BIT(6), BT_LE_ADV_OPT_NOTIFY_SCAN_REQ = BIT(7),
BT_LE_ADV_OPT_USE_NAME = BIT(8), BT_LE_ADV_OPT_DIR_MODE_HIGH_DUTY = BIT(9),
BT_LE_ADV_OPT_EXT_ADV = BIT(10),
BT_LE_ADV_OPT_NO_2M = BIT(11),
BT_LE_ADV_OPT_CODED = BIT(12),
BT_LE_ADV_OPT_ANONYMOUS = BIT(13),
BT_LE_ADV_OPT_DISABLE_CHAN_37 = BIT(14), BT_LE_ADV_OPT_DISABLE_CHAN_38 = BIT(15), BT_LE_ADV_OPT_DISABLE_CHAN_39 = BIT(16),
};
-
1.2 核心特性
特性 | 说明 |
---|---|
广播行为 | 设备以可连接方式广播,但仅广播一次 |
自动停止条件 | 满足任一条件即停止: - 达到预设超时时间 - 被其他设备成功连接 |
资源占用 | 避免长期占用广播信道,节省功耗 |
不可重启 | 停止后需重新调用bt_le_adv_start() 才能再次广播 |
1.3 使用场景
快速配对:设备上电后广播30秒等待连接,超时后休眠
安全敏感操作:固件升级时临时开放连接窗口,完成后自动关闭
事件触发广播:按键按下后广播10秒,无连接则自动停止
低功耗设备:电池供电设备需严格限制广播时间
2 应用方法
2.1 广播功能(Zephyr)
#include <bluetooth/bluetooth.h>// 广播参数配置
static const struct bt_le_adv_param *adv_param = BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_ONE_TIME, // 关键组合BT_GAP_ADV_FAST_INT_MIN_1, // 最小广播间隔:30msBT_GAP_ADV_FAST_INT_MAX_1, // 最大广播间隔:50msNULL // 使用公共地址);// 广播数据(设备名称+标志位)
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, "MY_DEVICE", 9),
};void start_adv(void) {int err = bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad), NULL, 0);if (err) {printk("Advertising failed (err %d)\n", err);} else {printk("One-time connectable advertising started\n");}
}
2.2 超时控制
通过 timeout
参数控制广播持续时间(单位:10ms):
// 设置广播超时为5秒 (500 * 10ms = 5000ms)
BT_LE_ADV_PARAM(BT_LE_ADV_CONN_ONE_TIME, BT_GAP_ADV_FAST_INT_MIN_1,BT_GAP_ADV_FAST_INT_MAX_1,500); // 超时参数
超时=0:使用默认超时(通常30秒)
超时>0:自定义持续时间(例:
100
= 1秒)
2.3 典型工作流程
3 注意事项
1) 与普通广播区别:
常规可连接广播:需手动调用
bt_le_adv_stop()
停止ONE_TIME模式:满足条件自动停止,无需手动干预
2) 状态监听:
// 注册广告状态回调
bt_le_adv_cb_register(&adv_cb);static struct bt_le_adv_cb adv_cb = {.sent = on_adv_sent, // 广播停止时触发
};void on_adv_sent(void) {printk("Advertising stopped automatically\n");
}
3) 错误处理:
若广播未启动成功,返回错误码(如
-EALREADY
表示已在广播)停止后再次广播需重新初始化参数